3. UCIe主带通道链路训练验证

任务目标

构建一个可运行的UCIe主带通道链路训练验证模型,覆盖三个阶段:参数协商(Parameter Negotiation)、均衡训练(Equalization Training)、链路就绪(Link Ready)。验证训练完成后链路状态机进入 LINK_READY,且协商参数与均衡结果满足预设约束。

环境与依赖

  • Python 3.8+,仅使用标准库(dataclasses、enum、random)。
  • 无需第三方库,直接 python ucie_link_train.py 运行。

训练流程

RESET 链路复位 PARAM_NEGO 参数协商 EQ_TRAINING 均衡训练 LINK_READY 链路就绪 协商失败重试 均衡未收敛回退

核心实现

import random
from dataclasses import dataclass, field
from enum import Enum, auto

class State(Enum):
    RESET = auto()
    PARAM_NEGO = auto()
    EQ_TRAINING = auto()
    LINK_READY = auto()
    FAILED = auto()

@dataclass
class LinkConfig:
    width: int = 8          # 主带通道位宽
    speed_gtps: int = 16    # 每通道速率 GT/s
    fec_enable: bool = True
    max_retry: int = 3

@dataclass
class TrainResult:
    state: State = State.RESET
    negotiated: dict = field(default_factory=dict)
    eq_eye_mv: float = 0.0
    retries: int = 0
    log: list = field(default_factory=list)

def param_negotiation(cfg, rng):
    """双方协商:位宽、速率、FEC 必须一致,否则失败。"""
    peer = {
        "width": rng.choice([cfg.width, cfg.width, 4]),
        "speed_gtps": rng.choice([cfg.speed_gtps, cfg.speed_gtps, 8]),
        "fec_enable": rng.choice([cfg.fec_enable, cfg.fec_enable, False]),
    }
    ok = (peer["width"] == cfg.width and
          peer["speed_gtps"] == cfg.speed_gtps and
          peer["fec_enable"] == cfg.fec_enable)
    return ok, peer

def eq_training(cfg, rng):
    """均衡训练:返回眼图张开度(mV),需 >= 60mV 视为收敛。"""
    base = 40 + cfg.speed_gtps * 1.5
    eye = base + rng.uniform(-15, 25)
    return eye

def run_training(cfg, seed=0):
    rng = random.Random(seed)
    res = TrainResult()
    res.state = State.PARAM_NEGO
    res.log.append("enter PARAM_NEGO")

    for attempt in range(1, cfg.max_retry + 1):
        ok, peer = param_negotiation(cfg, rng)
        res.retries = attempt
        res.log.append(f"nego attempt {attempt}: peer={peer} ok={ok}")
        if ok:
            res.negotiated = peer
            break
    else:
        res.state = State.FAILED
        res.log.append("param negotiation failed")
        return res

    res.state = State.EQ_TRAINING
    res.log.append("enter EQ_TRAINING")
    for eq_try in range(1, cfg.max_retry + 1):
        eye = eq_training(cfg, rng)
        res.eq_eye_mv = round(eye, 2)
        res.log.append(f"eq attempt {eq_try}: eye={res.eq_eye_mv}mV")
        if eye >= 60.0:
            res.state = State.LINK_READY
            res.log.append("link ready")
            return res
    res.state = State.FAILED
    res.log.append("eq training not converged")
    return res

if __name__ == "__main__":
    cfg = LinkConfig(width=8, speed_gtps=16, fec_enable=True, max_retry=3)
    for s in range(5):
        r = run_training(cfg, seed=s)
        print(f"seed={s} state={r.state.name} eye={r.eq_eye_mv}mV retries={r.retries}")
        for line in r.log:
            print("  ", line)

运行与验证

  1. 运行:python ucie_link_train.py。
  2. 观察每个 seed 输出的 state、eye、retries 及日志。
  3. 通过条件:至少存在 seed 使 state=LINK_READY,且该次 eq_eye_mv >= 60.0,日志顺序为 PARAM_NEGO → EQ_TRAINING → link ready。
  4. 失败路径验证:将 max_retry=1 并固定 seed 使协商或均衡不通过,应输出 state=FAILED,日志含对应失败原因。

关键判定点

  • 参数协商:位宽、速率、FEC 三项必须与本地配置完全一致,否则重试。
  • 均衡训练:眼图张开度阈值 60mV,未达阈值重试,超过 max_retry 进入 FAILED。
  • 链路就绪:仅当协商成功且均衡收敛时进入 LINK_READY,此时链路视为可用。