2、链路训练的基本流程:复位、检测、配置、速度协商
链路训练说起来并不复杂,但每一步都有坑。我刚开始调 FRL 的时候,总觉得只要把物理层跑通就行了,结果发现复位时序、检测顺序、配置参数,哪个环节出问题都能让你卡好几个星期。
说白了,链路训练就是收发双方互相认识、定好规矩、再一起跑快的过程。整个过程可以分成四个大阶段:复位 → 检测 → 配置 → 速度协商。我们一个一个拆开看。
2.1 复位:让所有 Lane 回到同一起跑线
复位是流程的第一步,也是最容易被忽略的一步。我见过不少项目,链路训练失败的原因竟然只是复位信号没拉够时间——复位还没稳定,接收端就已经开始检测了,结果状态机全乱掉。
复位阶段要做三件事:
- 拉低 Lane_Reset_n 信号:保持至少 100 ns,最好留余量到 200 ns。有些芯片要求更长,一定要查数据手册。
- 让所有 Lane 进入电气空闲:差分电压要降到 < 50 mV。如果 TX 端还残留信号,接收端会误判为训练序列。
- 清空训练状态机:包括 PHY 层的 FSM 和链路层的 LTSSM。不清干净的话,上次训练失败的残留状态会干扰新一轮训练。
2.2 检测:收发双方互相摸底
复位完成后,接收端开始探测发送端的能力。说白了就是「你那边有几条 Lane?每条的极性怎么样?需不需要降级?」
检测阶段主要做以下工作:
- 读取接收端能力寄存器:每个 Lane 都有一套能力描述,包括支持的最高速率、最大幅值、预加重档位等。
- 识别 Lane 映射:发送端发出的 Lane 0 不一定对应接收端的 Lane 0。如果线缆或 PCB 走线有交叉,必须在检测阶段重新对齐。
- 发现降级或重映射需求:比如某条 Lane 物理损坏或信号太差,检测阶段就要标记为“不可用”,然后调整 Lane 数量。
我曾经遇到过一个问题:接收端检测到 Lane 0 的信号,但 Lane 1 始终没反应。排查了三天,结果发现是发送端的 Lane 1 和 Lane 2 在 PCB 上焊反了。幸好检测阶段能通过 Lane 映射重新匹配,不然就得改板。
2.3 配置:写入参数,达成一致
检测完成之后,双方知道了彼此的能力。接下来就是配置阶段——发送端和接收端各自写入参数,确保两者在电气特性和协议层级上匹配。
配置阶段的主要动作:
| 配置项目 | 说明 | 常见陷阱 |
|---|---|---|
| TX 幅度 / 预加重 | 发送端根据接收端反馈调整信号摆率和预加重强度 | 幅度太大导致过冲,太小导致 BER 增加 |
| RX 均衡 / CTLE | 接收端设置连续时间线性均衡器,补偿高频损耗 | 均衡过强会放大噪声,过弱会抬不开眼图 |
| 参数交换 TS | 通过训练序列 (Training Sequence) 在 Lane 上交换配置结果 | TS 时序必须对齐,否者接收端解不出配置参数 |
你想想看,配置阶段其实就是一个握手过程:发送端说「我准备用 8 Gbps,幅度 800 mV,预加重 3 dB」,接收端回复「好的,我也配了对应的 CTLE 和均衡器」。如果有一个参数对不上,链路就失败。
2.4 速度协商:逐级升速,锁定最优频率
速度协商是链路训练的最后一步,也是最容易出问题的一步。发送端和接收端都配好了基础参数,现在要一起从最低速率开始,逐级往上试,直到找到两者都能稳定运行的速率。
速度协商的典型过程:
- 从最低起始速率开始,通常是 1.62 Gbps 或 2.7 Gbps。
- 发送端设置速率,接收端检测 BER。如果 BER 低于阈值(比如 10⁻¹²),则尝试下一级速率。
- 如果 BER 过高,接收端发送退避请求,降回上一个安全速率。
- 锁定最终速率,并记录到链路训练完成标志寄存器。
为什么要逐级升速?因为频率越高,信号衰减越严重,抖动预算越紧张。如果直接从低速率跳到高速率,眼图可能完全闭合。
嗯,这里要注意:速度协商失败时,大部分链路的默认行为是回到复位阶段重新开始。这其实是一种保护机制——避免双方在无效速率上浪费资源。但也是调试的噩梦,因为你看到的日志永远是「复位→检测→配置→失败→复位→检测→配置→失败…」。如果不做 log 分级,根本不知道到底在哪个速率上失败的。
我碰到过最典型的一个案例:某款显示器在连接 PC 时,链路训练总是在 5.4 Gbps 这一步失败。看 log 发现 BER 在 5.4 Gbps 时已经接近 10⁻⁹,但没有触发退避,因为阈值设成了 10⁻¹²。接收端还不满足,继续向上尝试 8.1 Gbps,结果直接失锁。后来把速度协商的 BER 阈值放宽到 10⁻⁸,并增加了退避次数限制,问题解决。
说白了,速度协商就是「量力而行」——不要强求最高速率,稳定比什么都重要。