2. PCIe链路训练基础:链路训练的目标、基本概念及整体流程
各位好,欢迎来到第2章。咱们直接切入正题——链路训练。
很多工程师觉得链路训练很神秘,说白了它就是PCIe设备上电或复位后,两端互相认识、协商能力、完成同步的过程。如果你不理解这个基础,后面的FRL一致性测试根本无从谈起。我当年第一次调试Gen5链路时,就因为对训练流程理解不深,卡了整整两周才定位到问题。
2.1 链路训练的核心目标
我们把目标拆开来看,其实就三点:
- 建立物理连接:确保发送端和接收端的电气信号能正常传递。
- 协商操作参数:包括链路宽度、数据速率、翻转极性、预设系数等。
- 实现位/符号/块同步:确保数据能正确采样和解码。
一句话总结:链路训练就是让两端从“完全未知”状态,逐步走到“我准备好了,咱们开始传数据”的状态。
2.2 LTSSM:链路训练的状态机
链路训练由LTSSM(Link Training and Status State Machine)控制。每个PCIe设备内部都有一个LTSSM,它通过一系列状态转换来驱动训练过程。
LTSSM的主要状态包括:
| 状态 | 说明 | 我见过的坑 |
|---|---|---|
| Detect | 检测对端是否存在 | 有时候接收器灵敏度不够,会误判“无设备”,导致反复重试 |
| Polling | 发送训练序列(TS1/TS2),进行位锁定和符号锁定 | 我曾遇到过因为参考时钟抖动偏大,Polling阶段一直锁不住符号 |
| Configuration | 协商链路宽度,交换能力信息 | 有一次链路宽度协商到x4后无法升到x8,发现是PCB上某个通道的差分阻抗不对 |
| Recovery | 重新训练,用于速率切换或错误恢复 | Gen5的Recovery流程比Gen3复杂很多,我建议一定要仔细看规范 |
| L0 | 正常工作状态,传输TLP和DLLP | 进入L0不代表万事大吉,还需要监控链路稳定性 |
| L0s/L1/L2 | 低功耗状态,省电用的 | 有些测试把功耗状态转换当成链路训练故障,别搞混了 |
| Hot Reset / Disable / Loopback | 特殊控制和调试状态 | Loopback常用于物理层测试,但链路训练一致性测试一般不涉及 |
你想想看,通过这么多状态的迁移,两端才能建立起可靠的连接。在这个过程里,任何一步出错都会导致训练失败或链路不稳定。
2.3 链路训练的整体流程
下面这张图是我总结的整体流程,建议你保存下来。每次调试链路问题,我都会先对照这个流程梳理一遍。
从图上可以看到,链路训练是一套严格按序的状态机。我简单解释一下每个环节:
- 复位/上电:这是起点。设备上电后LTSSM自动进入Detect状态。
- Detect:检测对端是否存在。如果没检测到,会不断重试。在实际项目中,我曾因为PCB走线过长导致信号幅度太小,Detect阶段一直过不去。
- Polling:发送训练序列(TS1/TS2),实现位锁定和符号锁定。锁定的快慢取决于链路质量,我建议你观察TS1/TS2的交换次数,可以判断链路裕量。
- Configuration:协商实际工作的链路宽度,并完成极性翻转等配置。这里最容易出问题的是宽度协商失败,比如两端支持的通道数不一致。
- L0:正常数据传输状态。但要注意,L0期间如果出现错误,会进入Recovery重新训练。
我的建议:调试时用逻辑分析仪抓取LTSSM状态转换序列,配合训练序列(TS1/TS2)的内容分析,能快速定位问题在哪一步卡住。
2.4 训练核心:训练序列(TS1/TS2)
链路训练是通过有序集(Ordered Sets)来完成的。Gen1到Gen5都使用TS1和TS2作为主要训练序列。每个TS序列包含:
TS1/TS2格式 (PCIe Base Spec 4.0r1.0, 每个符号8位):
┌─────────┬─────────┬─────────┬─────────┬───┬─────────┐
│ COM │ Link │ Lane │ N_TS │… │ TS2_ID │
│ (K28.5) │ Number │ Number │ Sent │ │ (TS2) │
└─────────┴─────────┴─────────┴─────────┴───┴─────────┘
这些序列里携带了很多关键信息:
- 链路号和通道号:用于两端确认彼此映射关系。
- N_TS:已发送的TS数量,用于同步计数。
- 速率标识:指示下一阶段要切换到的速率(主要用于Recovery)。
- 预设系数:在Gen5时尤为重要,用于均衡训练。
注意:TS1和TS2的格式几乎一样,但TS2标志着即将进入Configuration阶段。如果你在示波器上看到大量TS2重复发送,说明两端正在努力协商配置参数。
2.5 比特锁定、符号锁定与块锁定
你可能会问:链路训练里提到的“锁定”到底是什么意思?
说白了,就是接收端找到正确的采样时刻和数据边界。这涉及三个层次:
- 比特锁定:接收端的CDR(时钟数据恢复)锁定到输入数据流的频率和相位上。这是最基础的,没这个后面全白搭。
- 符号锁定:在以8b/10b编码(Gen1/2)或128b/130b编码(Gen3+)的串行流中,找到8位或128位数据的边界。我遇到过一个情况,符号锁定了但误码率很高,一查发现是CDR锁到谐波上去了。
- 块锁定(Block Lock):在Gen3及以上才有。128b/130b编码中,接收端需要找到128位数据块的起始位置。这个锁定过程通过SKP有序集来维持同步。
关键经验:块锁定在Gen5时特别敏感。我曾经遇到过因为参考时钟上叠加了较小噪声,导致块锁定周期性地丢失。这种情况在传统8b/10b年代是不存在的,所以做Gen5+测试时要特别关注时钟质量。
2.6 FRL与链路训练的新挑战
FRL是PCIe 5.0(Gen5)和6.0(Gen6)引入的更高数据速率物理层技术。在链路训练层面,FRL带来了几个额外要求:
- 速率协商的精细化:FRL支持多个速率台阶(如8GT/s、16GT/s、32GT/s),训练时需逐级尝试。
- 预设系数训练:为了对抗更高频段的信号衰减,接收端在训练过程中会发送预设系数请求,要求发送端调整TxEQ设置。
- 更长的Recovery流程:从Gen3的简单Recovery演变为Recovery.ElectricalIdle、Recovery.Equalization等多个子状态。
- 编码方式的变化:FRL强制使用128b/130b编码,不再向后兼容8b/10b的Polling流程。
嗯,说白了,FRL让链路训练变得更加复杂。但对于一致性测试来说,这些新增的训练环节恰恰是测试的重点。后面我们会专门用几个章节来拆解FRL特有的训练测试项。
2.7 小结:链路训练的关键点
| 概念 | 核心要点 | 避坑指南 |
|---|---|---|
| 链路训练目标 | 建立连接、协商参数、实现同步 | 不要只关注L0,前面的Detect/Polling经常出问题 |
| LTSSM | 状态机控制训练过程 | 训练失败时务必看状态转换记录 |
| 训练序列(TS1/TS2) | 携带训练信息和配置参数 | TS2的N_TS值异常往往是链路不稳的前兆 |
| 比特/符号/块锁定 | 三个层次的同步,缺一不可 | Gen5+的块锁定对时钟抖动极其敏感 |
| FRL新增要求 | 速率协商、预设系数、Recovery子状态 | 这些是FRL一致性测试的必测项 |
我个人习惯:每次做新的链路训练测试前,会先用示波器或协议分析仪抓一遍完整的训练波形。看到完整的LTSSM状态转换,心里才有底。你想想看,如果连基础训练流程都没摸透,后面做FRL的均衡测试、抖动测试能顺利吗?
好了,链路训练的基础就讲到这儿。理解了这个流程,后面我们讲FRL一致性测试用例时,你就能明白每个测试项到底在测训练过程中的哪一个环节。