4. 链路训练失败:根本原因分类

做链路训练失败分析,说白了就是翻来覆去找原因。

我自己的习惯是把问题分成三大类:电气问题、协议问题、环境问题。

为什么这么分?

因为你排查的时候,思路必须清晰。上来就怀疑协议,很可能忽略了最基础的信号质量问题。我在项目里见过不少人,折腾好几天,最后发现就是一颗电容焊歪了。

下面我展开聊聊这三类。每个问题我都会加点实际经验,希望能帮你少走弯路。

4.1 电气问题:基础不牢,地动山摇

电气问题,是链路训练失败里最常见的。

简单说,就是发送端发出的信号,到了接收端已经面目全非了。接收端没法正确解析,自然就训练失败。

核心矛盾:发送器驱动能力、通道损耗、接收器均衡能力的三角关系。

三者不匹配,链路就崩。

4.1.1 信号完整性问题(SI)

这个是重灾区。我几乎每个项目都会碰到。

  • 过冲/下冲太大:驱动器摆幅过大,或者阻抗严重不匹配。信号像弹簧一样来回弹,接收器直接懵掉。
  • 振铃严重:特别是高频信号,反射叠加,波形像煮粥一样。升不上去也降不下来。
  • 眼图闭合:通道损耗太大,尤其是高频分量衰减严重。眼睛睁不开,采样点就不稳。

我常用的排查手法:

第一步,上示波器看眼图。先别管协议,就看波形。

如果眼图垂直张开度小于 30%,或者过冲超过 20%,基本就是SI问题。先调匹配,再看通道设计。

4.1.2 电源完整性问题(PI)

这个容易被忽视。很多工程师只看信号,不看电源。

链路训练时,收发器动态电流非常大。要是电源响应跟不上,电压瞬间就掉。参考电压一飘,接收阈值跟着变。

  • 电源噪声:开关噪声耦合到参考电压上。
  • 地弹:大量电流同时切换,地电位瞬时抬升。信号看起来没问题,实际参考点已经乱了。
  • 去耦电容不足:高频能量没法就近吸收,全靠远处电源滤波,效果很差。

注意:

电源纹波 不要超过 1%,我一般要求 0.5% 以内。

曾经有个板子,链路死活训练不上。我摸了下电源芯片,烫得吓人。换了个输出能力更强的型号,问题立刻解决。

4.1.3 时钟抖动问题

时钟就是心跳。心跳不稳,整个系统都乱套。

链路训练时,收发器对时钟抖动的容忍度很低。特别是恢复时钟的CDR电路,遇到大抖动直接失锁。

  • 随机抖动:热噪声、闪烁噪声引起。很难根治,只能靠电路设计控制。
  • 确定性抖动:电源串扰、电磁干扰造成。这个能查,也能改。
  • 总抖动:一般是两个加起来。规范要求总抖动小于 0.3 UI(单位间隔)。

4.2 协议问题:规则没玩明白

信号没问题,电源也没问题,那就要看协议交互了。

链路训练本质上是一个握手机制。两边要交换训练序列(TS)、协商速度、调整均衡系数。任何一步出错,训练就卡住。

4.2.1 LTSSM 状态机死锁

LTSSM 是链路训练和状态机。它规定了收发器该在什么时候做什么事情。

比如,从Detect进到Polling,再进到Configuration。如果某一步收不到预期的序列,状态机就会超时重试。重试次数多了,就死锁了。

  • 状态机乱跳:收到错误序列,或者噪声触发了误判。
  • 超时参数不合理:有些BIOS里可以配置等待时间。调得太短,链路还没稳定就开始训练,肯定失败。

排查建议:

我习惯抓逻辑分析仪波形。看两端有没有持续交换训练序列(TS1/TS2)。

如果一端发个不停,另一端没响应,基本就是死锁了。这时候可以复位或降低速度重新训练。

4.2.2 训练序列(TS)错误

训练序列里包含了很多关键信息:速度标识、均衡系数请求、链路号、通道号等等。

任何一个bit传错,都会导致接收端解析失败。

  • CRC校验错误:序列被噪声污染,CRC通不过。
  • 编码错误:8b/10b 或 128b/130b 编码出错。这通常和电气问题相关。
  • 速度协商失败:双方支持的速率列表不对齐。你想跑 Gen4,对方只支持 Gen3,那就降级。
错误类型 典型表现 排查思路
TS1 不匹配 链路反复在 Polling 状态循环 检查两端速率协商寄存器
均衡系数请求错误 链路无法进入 Configuration 状态 抓包确认请求的 Preset值
CRC 错误 链路频繁重训 检查信号质量,看眼图

4.2.3 握手时序不匹配

收发器的 CDR 锁定时间 和 均衡器收敛时间 必须匹配。

比如,发送器换了一个 Preset,接收器的均衡器需要几十个微秒才能跟上。如果接收器在这段时间内尝试采样,就会出错。

我记得有一次,更换了一颗高速 SerDes PHY,链路训练就失败。查了很久,就是新PHY的均衡器收敛时间比老的长。最后在BIOS里把训练等待时间延长了一点点,问题搞定。细节决定成败啊。

4.3 环境问题:外部干扰是“隐形杀手”

这种问题最让人头疼。信号和协议都查了,板子单独测也没事。一装进系统就出问题。

这时候,往往要考虑环境因素,特别是电磁干扰(EMI)。

4.3.1 电磁干扰(EMI)相关性

EMI 怎么影响链路训练?

干扰信号耦合到差分对上面,变成共模噪声,或者破坏差分信号的完整性。接收器的差分放大器会共模抑制,但抑制程度有限。干扰足够强的时候,眼图就被“抹平”了。

  • 外部辐射源:风扇、马达、开关电源、甚至隔壁板卡的信号。
  • 串扰:PCB 上相邻信号线互相干扰。高速信号走线靠太近,会互相耦合。

我自己的排查经验:

如果怀疑 EMI,就把系统放到屏蔽箱里测试。进去之后链路稳定,拿出来就不行,那必是 EMI 问题。

或者用近场探头扫一下链路走线附近,找干扰源。

4.3.2 温度漂移

温度变化会影响导体电阻和介电常数。

通道损耗是随着温度升高而变大的。冬天能跑 Gen4,到了夏天就跑不上去了。处理器发热、电源芯片发热,也会引起局部温升,导致链路不稳定。

  • 眼图随温度变化:温度越高,眼图张开越小。
  • 均衡器参数漂移:温度变了,收发器的内部参数也会跑偏。

4.3.3 接地参考环路

这个很多人不注意。

两个设备之间,地电位不一致,会有共模压差。这个电压会干扰信号传输。如果两个地之间有回路,还可能形成天线效应,引入更多噪声。

建议:

尽量保证系统单点接地,避免形成大的地环路。

高速连接器的地针,要保证足够多,并且均匀分布。我见过因为地针不够,导致链路电磁兼容性测试不通过的项目。

链路训练失败原因分类结构 链路训练失败 电气问题 SI / PI / 时钟抖动 协议问题 LTSSM / TS / 握手时序 环境问题 EMI / 温度 / 接地 过冲/振铃/眼图闭合 电源噪声/地弹 随机/确定性抖动 LTSSM 状态机死锁 TS序列CRC/编码错误 均衡/CDR收敛时间不匹配 外部辐射/串扰 (EMI) 温度漂移致眼图退化 接地参考环路噪声

分类讲完了。你可能会觉得,实际遇到的情况经常是“混杂”的。

没错。

电气问题会导致协议交互出错。环境问题会让电气问题变得更恶化。所以排查的时候,最忌讳只盯一个点。

我自己的建议:先解决电源和信号,再查协议,最后怀疑外部干扰。这个顺序,能帮你省下不少冤枉时间。