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 接地参考环路
这个很多人不注意。
两个设备之间,地电位不一致,会有共模压差。这个电压会干扰信号传输。如果两个地之间有回路,还可能形成天线效应,引入更多噪声。
建议:
尽量保证系统单点接地,避免形成大的地环路。
高速连接器的地针,要保证足够多,并且均匀分布。我见过因为地针不够,导致链路电磁兼容性测试不通过的项目。
分类讲完了。你可能会觉得,实际遇到的情况经常是“混杂”的。
没错。
电气问题会导致协议交互出错。环境问题会让电气问题变得更恶化。所以排查的时候,最忌讳只盯一个点。
我自己的建议:先解决电源和信号,再查协议,最后怀疑外部干扰。这个顺序,能帮你省下不少冤枉时间。