PCIe 链路训练 LTSSM:Polling/Configuration/L0 与速率/位宽协商
更新时间:2026-09-19。前置:SerDes 与 8b/10b、片上信号完整性。PCIe 是高速点对点串行链路,上电时两端必须先「自训练」对齐位与块、协商宽度和速率,才能进正常工作态 L0——这个过程由硬件状态机 **LTSSM(Link Training and Status State Machine)**自动完成。
本文要回答的问题
- 上电到能传 TLP,链路要经过 LTSSM 哪些状态?
- TS1/TS2 训练序列在轮询和宽度协商中起什么作用?
- lane 反转、极性反转、宽度协商怎么自动完成?
- Gen1→Gen2→Gen3 提速为什么要重新均衡,为什么会卡在训练?
一、LTSSM 主干状态
Detect ─► Polling ─► Configuration ─► Recovery ─► L0(正常工作)
▲ │ │ ▲ │
│ └─失败回退 └─宽度/链路号 │ 改速率/重建│ L0s/L1/L2 省电
└──────────────────────────────────────┴──────────┘
另有 Disabled、Hot Reset、Loopback、Beacon| 状态 | 做什么 |
|---|---|
| Detect | 检测对端接收器是否存在(Rx 检测:测量端接阻抗),判断插上 |
| Polling | 发 TS1/TS2,PLL 锁定、位/符号对齐、确认极性,建立可靠收发 |
| Configuration | 交换 TS 协商链路宽度、lane 顺序/反转、链路号 lane-to-lane,完成 lane 去偏移(deskew) |
| Recovery | 已训练后需要重新位对齐/改速率/从低功耗恢复时进入 |
| L0 | 正常数据态,可发 TLP/DLLP |
| L0s/L1/L2 | 逐级省电(L0s 浅睡快恢复,L1 关 PLL/共模,L2 几乎断电) |
二、TS1/TS2 训练序列
训练期收发的是特殊有序集 TS(Training Sequence),含链路号、lane 号、速率/控制标志(如 N_FTS、环回、热复位)。
- Polling.Active:连发自检 TS1,对端收到足够数量且自己发的也被收到,说明双向通,进 Polling.Configuration 发 TS2 确认。
- Configuration:两端用 TS 里的 lane/link 号确定物理 lane↔逻辑 lane 映射,从而自动支持** lane 反转(x8 插反)和极性反转**;全部 lane 对齐、去偏斜后进 L0。
- TS 由数据通路(不经应用层)硬件处理,软件看不到具体包。
三、速率与编码演进
| 代次 | 速率/lane | 编码 | 说明 |
|---|---|---|---|
| Gen1 | 2.5 GT/s | 8b/10b | 初训默认 |
| Gen2 | 5.0 GT/s | 8b/10b | L0 后经 Recovery 切换 |
| Gen3 | 8.0 GT/s | 128b/130b | 需链路均衡(equalization phase) |
| Gen4/5 | 16/32 GT/s | 128b/130b + FLIT(Gen5) | 更复杂均衡 |
链路总先在 Gen1 完成训练进 L0,再由软件/硬件通过 Recovery 状态协商升级:切换到更高速率后重新对齐。Gen3+ 因去掉 8b/10b 的内嵌时钟、信道损耗大,Recovery 里要做发送均衡(TX/RX preset、coefficient 调整),按 phase 0–3 调整预加重/去加重把眼图打开。
四、软件可见接口
PCIe 控制器(Root Complex/Endpoint)暴露 Link Control/Status 寄存器:当前速率、链路宽度、LTSSM 状态、重训练触发。调试时第一件事常是读状态寄存器确认链路是否到 L0、协商速率/宽度是否达标(如期望 x8 Gen3 实际 x4 Gen1 就说明训练降级)。
五、常见的坑
- 卡在 Detect/Polling:最常见硬件问题——参考时钟(REFCLK 100MHz)不稳/不同源、复位释放时序错、PERST# 与上电顺序不符。
- 信号完整性差:高速 Gen3+ 插损/回损不达标,均衡打不开眼,反复进 Recovery 或降速到 Gen1。
- 期望 x8 训练成 x4/x1:部分 lane 接触/AC 耦合电容/走线问题,Configuration 时这些 lane 没对齐被降宽。
- 参考时钟架构配错:Common Clock(CC)vs Separate Clock(SRIS/SRNS)、扩频 SSC 没在 TS/寄存器一致,N_FTS/退出 L0s 失败。
- PERST# 时序:电源稳定前释放复位,LTSSM 起不来或随机失败。
- Gen3 均衡参数差:preset/coefficient 没调,Gen1/2 正常、Gen3 掉卡。
- 极性/lane 反转超出支持:标准支持反转,但某些 IP/管脚约束错误导致 deskew 失败。
- 低功耗 L1 退出超时:L1 substate 时序/电源管理握手不对,恢复链路超时。
- 热复位/FLR 后未回 L0:LTSSM 复位处理与软件状态不同步。
- 协议分析仪只看 TLP:训练问题发生在 TLP 之前,要用能解码 TS/状态机的协议分析仪或读 LTSSM 状态。
- AC 耦合/端接遗漏:收发器端接和耦合电容按规范放置,否则 Detect 阶段 Rx 检测失败。
相关与延伸
物理层基础见 SerDes/8b10b;SI 见 片上信号完整性;上电时序见 复位控制器/POR;高速控制器 DMA 概念见 多通道 DMA。
总结
PCIe LTSSM 是「Detect 检测对端→Polling 用 TS1/TS2 锁定 PLL 和位/符号对齐→Configuration 交换 lane/link 号协商宽度并自动处理 lane/极性反转与去偏斜→L0 正常收发」的硬件状态机,且总是先在 Gen1 训练成功,再经 Recovery 升级 Gen2/Gen3,Gen3+ 因 128b/130b 和信道损耗要做发送均衡;卡在 Detect/Polling 多半是 100MHz 参考时钟/PERST# 时序,训练降级到 x4/Gen1 多为 lane SI 或均衡问题——训练发生在 TLP 之前,必须读 LTSSM 状态而非只看协议层。