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 链路训练的整体流程

下面这张图是我总结的整体流程,建议你保存下来。每次调试链路问题,我都会先对照这个流程梳理一遍。

PCIe链路训练整体流程 PCIe链路训练整体流程 复位 / 上电 Detect (检测) Polling (轮询) Configuration (配置) L0 (正常操作) 速率切换/错误 进入L0s/L1 L0s/L1 (低功耗) 关键提醒:每次速率或宽度改变,都会回到Recovery重新训练,而非直接从L0跳转。

从图上可以看到,链路训练是一套严格按序的状态机。我简单解释一下每个环节:

  • 复位/上电:这是起点。设备上电后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 比特锁定、符号锁定与块锁定

你可能会问:链路训练里提到的“锁定”到底是什么意思?

说白了,就是接收端找到正确的采样时刻和数据边界。这涉及三个层次:

  1. 比特锁定:接收端的CDR(时钟数据恢复)锁定到输入数据流的频率和相位上。这是最基础的,没这个后面全白搭。
  2. 符号锁定:在以8b/10b编码(Gen1/2)或128b/130b编码(Gen3+)的串行流中,找到8位或128位数据的边界。我遇到过一个情况,符号锁定了但误码率很高,一查发现是CDR锁到谐波上去了。
  3. 块锁定(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一致性测试用例时,你就能明白每个测试项到底在测训练过程中的哪一个环节。