2. UCIe侧带通道训练序列验证
任务说明
本案例构建一个最小可复现的UCIe侧带通道(Sideband)训练序列验证环境:发送端按协议顺序发出训练码型(TS1/TS2),接收端逐条校验码型内容、速率协商字段与握手时序,并输出通过/失败判定。核心验证点:
- 训练码型:TS1/TS2 的同步头与有效载荷是否符合规范。
- 速率协商:TS1 中携带的速率请求与 TS2 中的确认速率是否一致。
- 握手时序:TS1→TS2→Idle 的状态迁移顺序与最小间隔是否满足要求。
环境与依赖
- Python 3.8+,仅使用标准库(
dataclasses、enum、typing)。 - 无需第三方库,直接运行即可。
协议模型与验证流程
完整实现
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 中补充对应校验规则;故障注入用例可继续增加码型错误、状态乱序等场景。