4. UCIe链路复位与重训练验证

任务目标

构造一个可复现的UCIe链路复位与重训练验证环境:注入异常复位,检查复位原因寄存器、重训练触发条件、以及恢复时间是否满足协议阈值。核心逻辑用Python实现,便于在无硬件环境下验证流程正确性。

环境与依赖

  • Python 3.8+,仅用标准库(time、enum、dataclasses)。
  • 无需第三方库,直接运行脚本即可。

协议约束(本案例采用值)

  • 复位原因寄存器 RESET_REASON:bit0=热复位,bit1=链路错误,bit2=训练超时。
  • 重训练触发条件:复位原因非零,且链路状态回到 RETRAIN。
  • 恢复时间阈值:从复位释放到 ACTIVE 不超过 RECOVERY_LIMIT_MS = 50。

实现

import time
from dataclasses import dataclass, field
from enum import Enum

RECOVERY_LIMIT_MS = 50

class State(Enum):
    RESET = 0
    RETRAIN = 1
    ACTIVE = 2

class ResetReason(Enum):
    NONE = 0
    HOT = 1 << 0
    LINK_ERR = 1 << 1
    TRAIN_TIMEOUT = 1 << 2

@dataclass
class UcieLink:
    state: State = State.RESET
    reset_reason: int = 0
    retrain_count: int = 0
    recovery_ms: float = 0.0
    log: list = field(default_factory=list)

    def inject_reset(self, reason: ResetReason):
        self.reset_reason |= reason.value
        self.state = State.RESET
        self.log.append(f"reset injected: {reason.name}")

    def release_reset(self):
        # 复位释放后进入重训练
        self.state = State.RETRAIN
        self.retrain_count += 1
        self.log.append("reset released -> RETRAIN")

    def train(self, elapsed_ms: float):
        # 模拟训练耗时,完成后进入 ACTIVE
        self.recovery_ms = elapsed_ms
        self.state = State.ACTIVE
        self.log.append(f"training done in {elapsed_ms}ms -> ACTIVE")

    def check_retrain_condition(self) -> bool:
        return self.reset_reason != 0 and self.state == State.RETRAIN

    def check_recovery(self) -> bool:
        return self.recovery_ms <= RECOVERY_LIMIT_MS

def run_case(reason: ResetReason, train_ms: float):
    link = UcieLink()
    link.inject_reset(reason)
    assert link.reset_reason == reason.value, "reset reason not recorded"
    link.release_reset()
    assert link.check_retrain_condition(), "retrain condition not met"
    link.train(train_ms)
    ok = link.check_recovery()
    print(f"reason={reason.name} retrain_count={link.retrain_count} "
          f"recovery={link.recovery_ms}ms pass={ok}")
    for line in link.log:
        print("  ", line)
    return ok

if __name__ == "__main__":
    # 正常恢复
    assert run_case(ResetReason.HOT, 30.0) is True
    # 超时恢复,应判定失败
    assert run_case(ResetReason.TRAIN_TIMEOUT, 80.0) is False
    print("all checks done")

运行与验证

  1. 保存为 ucie_reset_retrain.py,执行 python ucie_reset_retrain.py。
  2. 观察输出:reason=HOT ... pass=True 与 reason=TRAIN_TIMEOUT ... pass=False。
  3. 通过条件:复位原因被正确记录、重训练条件成立、恢复时间与阈值比较结果符合预期;脚本末尾打印 all checks done 且无断言异常。

流程示意

RESET RETRAIN ACTIVE CHECK release train done recovery ≤ 50ms?

图中展示复位注入→释放进入重训练→训练完成进入ACTIVE→恢复时间检查的完整链路,与代码状态机一致。