2. PCIe基础回顾
PCIe 信号训练并不是一个孤立的“调均衡器”动作,它建立在 PCIe 协议分层、链路拓扑、LTSSM 状态机以及速率演进这四块基础之上。理解这些基础,才能明白为什么 Gen1/Gen2 几乎“上电即通”,而 Gen4/Gen5 却需要 TX FIR、RX CTLE/DFE、参考时钟、通道损耗等多方协同。本节把与信号训练强相关的 PCIe 基础串成一条主线。
一、PCIe 协议分层:训练发生在物理层
PCIe 采用经典的三层结构:事务层(Transaction Layer)、数据链路层(Data Link Layer)和物理层(Physical Layer)。事务层负责 TLP 的组装与路由,数据链路层负责 DLLP、ACK/NAK 与 CRC 保证可靠传输,物理层负责把包变成差分电信号并完成链路建立。信号训练完全属于物理层职责,具体落在 PHY 的 PCS(物理编码子层)与 PMA(物理媒介附加子层)中。
PCS 负责 8b/10b(Gen1/Gen2)或 128b/130b(Gen3 及以上)编解码、加扰、有序集(Ordered Set)生成与解析;PMA 负责串行/解串(SerDes)、发送均衡、接收均衡、时钟恢复(CDR)。LTSSM 状态机位于 PCS 逻辑中,通过发送和接收 TS1/TS2 有序集来协商速率、位宽、均衡参数。因此调优时看到的“训练失败”,往往要区分是 PCS 层协商失败,还是 PMA 层信号质量不足。
二、链路拓扑:训练对象是 Link 而非 Lane
PCIe 链路以 Lane 为基本单位,以 Link 为逻辑单位。常见拓扑包括 Root Complex 到 Endpoint 的点对点链路、Switch 的上行/下行端口、以及通过 Retimer 扩展的长距离链路。每条 Link 由 1、2、4、8、16 条 Lane 组成,训练时先按最大能力协商,再逐 Lane 完成位锁定、符号锁定和均衡。
拓扑对训练的影响非常直接:经过 Switch 或 Retimer 时,每一段链路独立训练,Retimer 会参与转发 TS1/TS2 并可能修改均衡请求;参考时钟若为独立扩频(SRNS)或公共时钟(Common Clock),会影响 CDR 与抖动预算。因此排查训练问题时,必须先画出“从 RC 到 EP 经过哪些器件、每段链路速率与损耗是多少”。
三、LTSSM 状态机:训练流程的“总调度”
LTSSM(Link Training and Status State Machine)是物理层的核心状态机,决定链路从复位到工作的全过程。与信号训练最相关的状态包括:
- Detect:检测对端是否存在接收端,判断链路是否可建立。
- Polling:通过 TS1/TS2 有序集完成位锁定、符号锁定,确认双方支持速率。
- Configuration:协商 Link Number、Lane Number 和链路宽度,确定 x1/x4/x8/x16。
- Recovery:速率切换、重新训练、错误恢复;Gen3 及以上在此进入 Equalization 子状态。
- L0:链路正常工作,TLP/DLLP 开始传输。
Gen3 及以上在 Recovery.Equalization 中分 Phase 0~Phase 3:Phase 0 交换双方均衡能力;Phase 1 协商 TX 预设(Preset)与 RX 预设提示;Phase 2 发送者调整 TX FIR,接收者评估;Phase 3 确认最终参数并进入 L0。若任一 Phase 超时或误码率不达标,链路会降速或反复重训。
四、速率演进与信号训练的关系
PCIe 每代速率翻倍,但通道损耗随频率上升而急剧增加,导致“速率越高,训练越难”。下表对比各代关键差异:
| 代际 | 单 Lane 速率 | 编码 | 均衡机制 | 训练重点 |
|---|---|---|---|---|
| Gen1 | 2.5 GT/s | 8b/10b | 无 | 位锁定、符号锁定 |
| Gen2 | 5.0 GT/s | 8b/10b | 无(可选 TX 去加重) | 速率协商、去加重 |
| Gen3 | 8.0 GT/s | 128b/130b | TX FIR + RX CTLE/DFE | Equalization Phase 0-3 |
| Gen4 | 16.0 GT/s | 128b/130b | 增强 TX FIR + RX DFE | Preset 协商、通道损耗补偿 |
| Gen5 | 32.0 GT/s | 128b/130b | TX FIR + RX CTLE/DFE + 前向纠错 | 抖动、串扰、FEC 与均衡联合优化 |
五、案例与误区:从“训练失败”定位到基础问题
典型场景:某 Gen4 x8 链路在 Configuration 阶段只能协商到 x4,且反复进入 Recovery。排查发现:
lspci -vvv | grep -i "LnkCap\|LnkSta"
LnkCap: Port #0, Speed 16GT/s, Width x8
LnkSta: Speed 16GT/s, Width x4 (downgraded)
dmesg | grep -i pcie
pcieport 0000:00:01.0: AER: Corrected error received
pcieport 0000:00:01.0: PCIe Bus Error: severity=Corrected, type=Physical Layer
进一步检查发现:其中 4 条 Lane 的 AC 耦合电容容值不一致,且参考时钟走线过长导致抖动超标。更换电容并优化时钟后,链路稳定在 x8。
常见误区:
- 只关注 TX 均衡,忽略 RX CTLE/DFE 与参考时钟质量。
- 把 LTSSM 反复 Recovery 简单归因于“信号差”,而未检查 Preset 协商是否匹配。
- 忽略 Retimer 对 TS1/TS2 的转发与修改,导致均衡参数在两端不一致。
- 在 Gen4/Gen5 中仍沿用 Gen3 的通道损耗预算,未重新评估插损与串扰。
复盘要点:信号训练问题应沿着“协议分层 → 链路拓扑 → LTSSM 状态 → 速率与均衡参数”这条链路逐层定位。先确认物理层是否完成位锁定与符号锁定,再确认 Configuration 是否协商到目标宽度,最后检查 Recovery.Equalization 中的 Preset 与均衡参数是否收敛。只有把基础打牢,后续的 TX FIR、RX CTLE/DFE 调优才有明确方向。