1. 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(链路复位)
其余跳转一律视为非法,状态保持不变并记录错误。
完整实现代码
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 调用与断言,即可覆盖新的状态跳转场景。