2. UCIe侧带通道训练序列验证

任务说明

本案例构建一个最小可复现的UCIe侧带通道(Sideband)训练序列验证环境:发送端按协议顺序发出训练码型(TS1/TS2),接收端逐条校验码型内容、速率协商字段与握手时序,并输出通过/失败判定。核心验证点:

  • 训练码型:TS1/TS2 的同步头与有效载荷是否符合规范。
  • 速率协商:TS1 中携带的速率请求与 TS2 中的确认速率是否一致。
  • 握手时序:TS1→TS2→Idle 的状态迁移顺序与最小间隔是否满足要求。

环境与依赖

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

协议模型与验证流程

UCIe 侧带训练序列验证流程 发送端 生成 TS1/TS2 侧带通道 传输序列 接收端校验 码型/速率/时序 判定输出 PASS / FAIL 接收端校验规则: 1. TS1 同步头 = 0xAA,TS2 同步头 = 0x55 2. TS1.rate_req 与 TS2.rate_ack 必须一致 3. 状态迁移顺序 TS1→TS2→Idle,且相邻间隔 ≥ MIN_GAP

完整实现

from dataclasses import dataclass
from enum import Enum
from typing import List, Tuple

# ---- 协议常量 ----
TS1_SYNC = 0xAA
TS2_SYNC = 0x55
MIN_GAP = 2          # 相邻训练序列最小间隔(周期)
VALID_RATES = {0, 1, 2, 3}  # 速率编码

class State(Enum):
    TS1 = "TS1"
    TS2 = "TS2"
    IDLE = "IDLE"

@dataclass
class TrainSeq:
    state: State
    sync: int
    rate: int
    cycle: int

# ---- 发送端:生成训练序列 ----
def build_training_sequence(rate_req: int) -> List[TrainSeq]:
    """按 TS1 -> TS2 -> Idle 顺序生成训练序列,间隔为 MIN_GAP。"""
    if rate_req not in VALID_RATES:
        raise ValueError(f"invalid rate_req: {rate_req}")
    return [
        TrainSeq(State.TS1, TS1_SYNC, rate_req, cycle=0),
        TrainSeq(State.TS2, TS2_SYNC, rate_req, cycle=MIN_GAP),
        TrainSeq(State.IDLE, 0x00, rate_req, cycle=MIN_GAP * 2),
    ]

# ---- 接收端:校验 ----
def verify(seq: List[TrainSeq]) -> Tuple[bool, List[str]]:
    errors: List[str] = []

    # 1. 码型校验
    expected_sync = {State.TS1: TS1_SYNC, State.TS2: TS2_SYNC}
    for s in seq:
        if s.state in expected_sync and s.sync != expected_sync[s.state]:
            errors.append(f"{s.state.value} sync mismatch: got 0x{s.sync:02X}")

    # 2. 速率协商校验
    ts1 = next((s for s in seq if s.state is State.TS1), None)
    ts2 = next((s for s in seq if s.state is State.TS2), None)
    if ts1 is None or ts2 is None:
        errors.append("missing TS1 or TS2")
    else:
        if ts1.rate not in VALID_RATES:
            errors.append(f"TS1 rate invalid: {ts1.rate}")
        if ts1.rate != ts2.rate:
            errors.append(f"rate mismatch: TS1={ts1.rate} TS2={ts2.rate}")

    # 3. 握手时序校验
    order = [s.state for s in seq]
    if order != [State.TS1, State.TS2, State.IDLE]:
        errors.append(f"state order invalid: {[o.value for o in order]}")
    for a, b in zip(seq, seq[1:]):
        if b.cycle - a.cycle < MIN_GAP:
            errors.append(f"gap too small between {a.state.value} and {b.state.value}")

    return (len(errors) == 0, errors)

# ---- 最小验证入口 ----
if __name__ == "__main__":
    # 正常用例
    seq = build_training_sequence(rate_req=2)
    ok, errs = verify(seq)
    print("case1:", "PASS" if ok else f"FAIL {errs}")

    # 故障注入:速率不一致
    bad = build_training_sequence(rate_req=1)
    bad[1].rate = 3
    ok, errs = verify(bad)
    print("case2:", "PASS" if ok else f"FAIL {errs}")

    # 故障注入:时序间隔不足
    bad2 = build_training_sequence(rate_req=0)
    bad2[1].cycle = 1
    ok, errs = verify(bad2)
    print("case3:", "PASS" if ok else f"FAIL {errs}")

运行方式

python ucie_sb_train.py

验证方法与通过条件

  • 运行后输出三行结果,分别对应正常用例与两个故障注入用例。
  • 预期输出(由代码逻辑唯一确定):
    • case1: PASS —— 正常序列通过全部校验。
    • case2: FAIL [...] —— 速率不一致被检出。
    • case3: FAIL [...] —— 时序间隔不足被检出。
  • 判定通过条件:case1 为 PASS,case2 与 case3 均为 FAIL 且错误信息包含对应原因(rate mismatch / gap too small)。

扩展建议

如需覆盖更多协议分支,可在 build_training_sequence 中增加参数控制同步头或速率编码,并在 verify 中补充对应校验规则;故障注入用例可继续增加码型错误、状态乱序等场景。