2、链路握手基础:PCIE/USB等协议中的链路训练状态机
先问你一个问题:CTLE 和 DFE 参数优化,到底在优化什么?
答案很简单——优化的是链路握手成功后的信号质量。但如果你连链路握手本身都没搞懂,调参数就是瞎蒙。我见过太多人上来就跑眼图、调 EQ,结果链路根本没稳定,数据都在出 Bit Error。
所以这一章,咱们把基础打好。链路训练状态机,简称 LTSSM(Link Training and Status State Machine),是 PCIe、USB 等高速串行协议用来建立和维护物理连接的“大脑”。
2.1 为什么要关注 LTSSM?
说白了,链路训练就是两端设备“对暗号”的过程。发端和收端要协商速率、宽度、极性、相位,还得交换预加重、CTLE、DFE 这些均衡参数。我遇到过一块 FPGA 板卡,上电后死活 link up 不上,拿 PCIe 分析仪一看,LTSSM 卡在 Recovery 状态来回跳——原来是参考时钟的 ppm 偏差太大。这种问题,不懂状态机根本没法 debug。
嗯,这里要注意:即使你的硬件设计没问题,LTSSM 的状态转换也能暴露很多信号完整性线索。
2.2 PCIe LTSSM 核心状态
PCIe 的 LTSSM 定义在 Base Spec 里,状态挺多。但实战中你只需要记住几个关键状态:
| 状态 | 缩写 | 作用 | 我的经验 |
|---|---|---|---|
| Detect | Det | 检测对端是否存在 | 卡在这里多半是链路断开或终端匹配问题 |
| Polling | Pol | 发送训练序列 TS1/TS2,协商速度与宽度 | 我以前在 Polling 停留过久,发现是通道间偏斜太大 |
| Configuration | Conf | 确定 Lane 顺序和极性反转 | 注意这里会交换均衡系数 |
| L0 | L0 | 正常数据传输状态 | 链路稳定的标志 |
| Recovery | Rec | 重新训练,应对信号恶化 | CTLE/DFE 参数不合适时会反复进入 Recovery |
| L1 / L2 | L1/L2 | 低功耗状态 | 跟参数优化关系不大,但退出时可能触发训练 |
你想想看,Recovery 状态是不是很眼熟?几乎所有链路问题都会导致设备被迫重新训练。我们调 CTLE 和 DFE 的目标之一,就是让链路在 L0 保持稳定,避免 Recovery 的反复触发。
2.3 链路训练状态机(LTSSM)完整流程
下面这张图概括了 PCIe Gen3 后的典型 LTSSM 流转,注意我标出了均衡参数交换的关键节点:
图里有几个关键点我说一下:
- Polling → Configuration:这里会发送 TS1/TS2 序列,其中包含均衡系数请求(Preshoot、De-emphasis、CTLE 建议值)。
- Configuration:双方完成 Lane-to-Lane 去偏斜和极性反转,并固定下均衡配置。
- Recovery:一旦信号恶化,设备请求重新进入训练,但不会回到 Detect,而是从 Recovery 尝试恢复到 L0。我调过的板卡里,Recovery 频繁触发十有八九是 CTLE 高增益过了头,导致噪声被过度放大。
2.4 USB 的链路训练状态机
USB 3.x / USB4 用的也是类似的分层状态机,不过名字不一样。USB 叫 Link Training and Status State Machine(同样缩写 LTSSM),但状态定义和 PCIe 有差异。
| USB 状态 | 等价 PCIe 状态 | 注意点 |
|---|---|---|
| Polling.LFPS | Detect | USB 用 LFPS 脉冲做带内检测 |
| Polling.RxEQ | Polling/Configuration | 这里进行接收均衡训练,交换 CTLE/DFE 系数 |
| U0 | L0 | 正常数据传输 |
| Recovery | Recovery | 同样用于重新训练,但 USB 的 Recovery 包含一键式全流程重置 |
USB 和 PCIe 的 LTSSM 核心思路一样:先确认连接,再协商均衡,最后进入数据传输。区别在于 USB 的 Polling.RxEQ 阶段更精细,它允许收发端多次交换系数,直到误码率达标。我在调一款 USB4 Retimer 时,就是因为 DFE 系数在 Polling.RxEQ 阶段协商成了全零(带外参数错误),导致链路始终起不来——后来手动 override 才解决。
2.5 实战中如何观察 LTSSM
你不一定有逻辑分析仪。我自己常用的手段有这几种:
- PCIe 链路状态寄存器:读取 0x12C(Link Status Register)和 0x124(Link Control Register),关注
Negotiated Link Speed、Link Width和Link Training位。如果 Link Training 一直为 1,说明还在训练。 - USB 调试寄存器:通过 xHCI 的 Port Status and Control 寄存器,检查 Port Link State 字段(通常在第 5-8 位)。
- 信号完整性工具:用示波器看差分信号上的训练序列模式。TS1/TS2 的周期特征是 4 个符号 + 去偏斜码,一眼就能认出来。
嗯,这里要注意:不要只看当前状态,还要看状态停留时间。比如链路在 L0 正常工作,但每几分钟进入 Recovery 一次,多半是温度或电压波动导致信号裕量变化。这时候 CTLE 和 DFE 需要做自适应优化,而不是固定值。