2、链路训练的基本流程:复位、检测、配置、速度协商

链路训练说起来并不复杂,但每一步都有坑。我刚开始调 FRL 的时候,总觉得只要把物理层跑通就行了,结果发现复位时序、检测顺序、配置参数,哪个环节出问题都能让你卡好几个星期。

说白了,链路训练就是收发双方互相认识、定好规矩、再一起跑快的过程。整个过程可以分成四个大阶段:复位 → 检测 → 配置 → 速度协商。我们一个一个拆开看。

链路训练四大阶段流程图 链路训练基本流程 复位 检测 配置 速度协商 拉低 Lane_Reset_n 所有 Lane 进入电气空闲 清空训练状态机 读取接收端能力 识别 Lane 映射 发现降级/重映射需求 写入 TX 幅度/预加重 配置 RX 均衡/CTLE 提交参数交换 TS 逐级升速尝试 BER 监测与退避 锁定最终速率 任何一个阶段失败,链路都会回退到复位重来 —— 这就是 FRL 链路训练「失败重试」的底层逻辑

2.1 复位:让所有 Lane 回到同一起跑线

复位是流程的第一步,也是最容易被忽略的一步。我见过不少项目,链路训练失败的原因竟然只是复位信号没拉够时间——复位还没稳定,接收端就已经开始检测了,结果状态机全乱掉。

复位阶段要做三件事:

  • 拉低 Lane_Reset_n 信号:保持至少 100 ns,最好留余量到 200 ns。有些芯片要求更长,一定要查数据手册。
  • 让所有 Lane 进入电气空闲:差分电压要降到 < 50 mV。如果 TX 端还残留信号,接收端会误判为训练序列。
  • 清空训练状态机:包括 PHY 层的 FSM 和链路层的 LTSSM。不清干净的话,上次训练失败的残留状态会干扰新一轮训练。
我的习惯:复位完之后不要马上开始下一步,多等 5-10 个微秒。这几十微秒的时间可以保证电源和参考时钟完全稳定。我早期有个项目就是因为复位后立刻检测,结果参考时钟抖动还没收敛,导致检测到的 Lane 映射全错。

2.2 检测:收发双方互相摸底

复位完成后,接收端开始探测发送端的能力。说白了就是「你那边有几条 Lane?每条的极性怎么样?需不需要降级?」

检测阶段主要做以下工作:

  • 读取接收端能力寄存器:每个 Lane 都有一套能力描述,包括支持的最高速率、最大幅值、预加重档位等。
  • 识别 Lane 映射:发送端发出的 Lane 0 不一定对应接收端的 Lane 0。如果线缆或 PCB 走线有交叉,必须在检测阶段重新对齐。
  • 发现降级或重映射需求:比如某条 Lane 物理损坏或信号太差,检测阶段就要标记为“不可用”,然后调整 Lane 数量。

我曾经遇到过一个问题:接收端检测到 Lane 0 的信号,但 Lane 1 始终没反应。排查了三天,结果发现是发送端的 Lane 1 和 Lane 2 在 PCB 上焊反了。幸好检测阶段能通过 Lane 映射重新匹配,不然就得改板。

特别注意:检测阶段的超时时间一定要严格。许多芯片默认 10 ms 超时,但实际系统中信号传播延迟、接收端启动时间可能更长。我建议初始设置为 20 ms,确认稳定后再改短。

2.3 配置:写入参数,达成一致

检测完成之后,双方知道了彼此的能力。接下来就是配置阶段——发送端和接收端各自写入参数,确保两者在电气特性和协议层级上匹配。

配置阶段的主要动作:

配置项目 说明 常见陷阱
TX 幅度 / 预加重 发送端根据接收端反馈调整信号摆率和预加重强度 幅度太大导致过冲,太小导致 BER 增加
RX 均衡 / CTLE 接收端设置连续时间线性均衡器,补偿高频损耗 均衡过强会放大噪声,过弱会抬不开眼图
参数交换 TS 通过训练序列 (Training Sequence) 在 Lane 上交换配置结果 TS 时序必须对齐,否者接收端解不出配置参数

你想想看,配置阶段其实就是一个握手过程:发送端说「我准备用 8 Gbps,幅度 800 mV,预加重 3 dB」,接收端回复「好的,我也配了对应的 CTLE 和均衡器」。如果有一个参数对不上,链路就失败。

我个人的经验:在配置阶段把所有参数都打印出来存个 log。训练失败的时候翻 log 最有用——一眼就能看出是 TX 幅度没协商好,还是 RX 均衡配错了。

2.4 速度协商:逐级升速,锁定最优频率

速度协商是链路训练的最后一步,也是最容易出问题的一步。发送端和接收端都配好了基础参数,现在要一起从最低速率开始,逐级往上试,直到找到两者都能稳定运行的速率。

速度协商的典型过程:

  1. 从最低起始速率开始,通常是 1.62 Gbps 或 2.7 Gbps。
  2. 发送端设置速率,接收端检测 BER。如果 BER 低于阈值(比如 10⁻¹²),则尝试下一级速率。
  3. 如果 BER 过高,接收端发送退避请求,降回上一个安全速率。
  4. 锁定最终速率,并记录到链路训练完成标志寄存器。

为什么要逐级升速?因为频率越高,信号衰减越严重,抖动预算越紧张。如果直接从低速率跳到高速率,眼图可能完全闭合。

关键指标:BER 监测窗口需要足够长。有的芯片只看 1 万个 bit 就下结论,这远远不够。我建议至少监测 10⁶ 个 bit,否则漏掉的错误会在后面爆发。

嗯,这里要注意:速度协商失败时,大部分链路的默认行为是回到复位阶段重新开始。这其实是一种保护机制——避免双方在无效速率上浪费资源。但也是调试的噩梦,因为你看到的日志永远是「复位→检测→配置→失败→复位→检测→配置→失败…」。如果不做 log 分级,根本不知道到底在哪个速率上失败的。

我碰到过最典型的一个案例:某款显示器在连接 PC 时,链路训练总是在 5.4 Gbps 这一步失败。看 log 发现 BER 在 5.4 Gbps 时已经接近 10⁻⁹,但没有触发退避,因为阈值设成了 10⁻¹²。接收端还不满足,继续向上尝试 8.1 Gbps,结果直接失锁。后来把速度协商的 BER 阈值放宽到 10⁻⁸,并增加了退避次数限制,问题解决。

说白了,速度协商就是「量力而行」——不要强求最高速率,稳定比什么都重要。