1. UCIe链路初始化状态机验证

UCIe链路初始化状态机验证 学习卡片

任务目标

搭建一个可独立运行的 UCIe 链路初始化状态机(Link Training FSM)验证环境:实现 RESET → TRAINING → CONFIG → ACTIVE 的合法跳转,并对非法跳转(如 RESET 直接到 ACTIVE、ACTIVE 回退到 RESET 等)进行拦截,输出每次跳转的判定结果。

状态机设计

状态集合:RESET、TRAINING、CONFIG、ACTIVE。合法跳转表如下:

  • RESET → TRAINING
  • TRAINING → CONFIG(训练成功)或 TRAINING → RESET(训练失败重试)
  • CONFIG → ACTIVE(配置完成)或 CONFIG → RESET(配置失败)
  • ACTIVE → RESET(链路复位)

其余跳转一律视为非法,状态保持不变并记录错误。

RESET TRAINING CONFIG ACTIVE 训练失败 配置失败 链路复位 非法:RESET→ACTIVE 被拦截

完整实现代码

from enum import Enum

class State(Enum):
    RESET = "RESET"
    TRAINING = "TRAINING"
    CONFIG = "CONFIG"
    ACTIVE = "ACTIVE"

# 合法跳转表:当前状态 -> 允许到达的状态集合
LEGAL = {
    State.RESET:    {State.TRAINING},
    State.TRAINING: {State.CONFIG, State.RESET},
    State.CONFIG:   {State.ACTIVE, State.RESET},
    State.ACTIVE:   {State.RESET},
}

class LinkFSM:
    def __init__(self):
        self.state = State.RESET
        self.errors = []

    def transition(self, target):
        if target in LEGAL[self.state]:
            print(f"[OK]   {self.state.value} -> {target.value}")
            self.state = target
            return True
        self.errors.append((self.state, target))
        print(f"[FAIL] {self.state.value} -> {target.value} 非法跳转,已拦截")
        return False

def run():
    fsm = LinkFSM()
    # 合法路径:RESET -> TRAINING -> CONFIG -> ACTIVE
    fsm.transition(State.TRAINING)
    fsm.transition(State.CONFIG)
    fsm.transition(State.ACTIVE)
    assert fsm.state == State.ACTIVE

    # 非法跳转:ACTIVE -> TRAINING 应被拦截
    fsm.transition(State.TRAINING)
    assert fsm.state == State.ACTIVE

    # 合法复位:ACTIVE -> RESET
    fsm.transition(State.RESET)
    assert fsm.state == State.RESET

    # 非法跳转:RESET -> ACTIVE 应被拦截
    fsm.transition(State.ACTIVE)
    assert fsm.state == State.RESET

    print(f"\n拦截非法跳转次数: {len(fsm.errors)}")
    assert len(fsm.errors) == 2
    print("全部断言通过")

if __name__ == "__main__":
    run()

运行与验证

环境:Python 3.8+,无第三方依赖。执行 python link_fsm.py。

通过条件:

  • 合法路径 RESET→TRAINING→CONFIG→ACTIVE 全部打印 [OK],最终状态为 ACTIVE;
  • ACTIVE→TRAINING 与 RESET→ACTIVE 打印 [FAIL],状态保持不变;
  • 脚本末尾输出 拦截非法跳转次数: 2 与 全部断言通过,无 AssertionError。

扩展验证:在 LEGAL 表中新增状态或跳转后,只需补充对应 transition 调用与断言,即可覆盖新的状态跳转场景。