2. Gen3 速率协商机制:Gen3(8.0 GT/s)与 Gen1/Gen2 的速率协商差异
PCIe 链路训练的核心目标之一是协商出双方支持的最高工作速率。Gen1(2.5 GT/s)和 Gen2(5.0 GT/s)采用相同的协商逻辑,而 Gen3(8.0 GT/s)引入了根本性的变化。理解这些差异是诊断 Gen3 链路训练失败的前提。
2.1 速率协商的基本流程回顾(Gen1/Gen2)
在 Gen1 和 Gen2 中,速率协商通过 Training Set(TS) 有序集完成,遵循“先降后升”原则:
- 初始协商:链路两端在复位后以 Gen1 速率(2.5 GT/s)开始发送 TS1/TS2 有序集。
- 速率标识:在 TS1 的 Symbol 4 中,通过
Speed Change位(Bit 0~2)声明本端支持的最高速率。 - 升速请求:当链路进入 L0 状态后,若双方均支持更高速率,由 Upstream Port 发起 Speed Change 序列。
- 切换执行:发送端调整 Tx PLL,接收端重新锁定 CDR,完成速率切换。
关键点: Gen1/Gen2 的速率切换发生在 L0 状态 之后,且切换过程不改变链路状态机(LTSSM)的当前状态。
2.2 Gen3 速率协商的范式转变
Gen3 将速率协商从“L0 状态后的可选操作”变为“链路训练过程中的强制步骤”。其核心差异在于:
- 协商时机提前:Gen3 速率协商在 Polling 状态 内完成,而非等到 L0。
- 使用 Equalization(均衡)序列:Gen3 引入了完整的 Tx/Rx 均衡训练,以补偿 8.0 GT/s 下的信号损耗。
- 数据速率与编码方式绑定:Gen3 使用 128b/130b 编码,而 Gen1/Gen2 使用 8b/10b 编码。速率协商必须同时完成编码方式的切换。
- 恢复时钟依赖:Gen3 的 CDR(时钟数据恢复)对信号质量要求更高,均衡训练直接决定了 CDR 能否锁定。
常见误区: 许多工程师认为 Gen3 协商失败是“速率不匹配”,但实际上超过 60% 的 Gen3 训练失败案例根源在于 均衡训练失败 或 CDR 无法锁定,而非速率位协商错误。
2.3 Gen3 速率协商的详细步骤
Gen3 速率协商在 LTSSM 的 Polling.Speed 子状态中执行,具体流程如下表所示:
| 步骤 | 子状态 | 动作 | Gen1/Gen2 对比 |
|---|---|---|---|
| 1 | Polling.Active | 以 Gen1 速率发送 TS1,携带 Speed Change = 011b(表示支持 Gen3) |
相同,但 Gen1/Gen2 仅携带 001b 或 010b |
| 2 | Polling.Speed | 发送端切换到 Gen3 速率(8.0 GT/s),发送 Modified TS1(EQ TS1) | Gen1/Gen2 无此子状态 |
| 3 | Polling.Equalization | 执行 Phase 1~Phase 3 均衡训练,调整 Tx 预加重/去加重、Rx 均衡器系数 | Gen1/Gen2 无均衡训练 |
| 4 | Polling.Speed | 均衡完成后,发送 TS2 确认,进入 L0 状态 | Gen1/Gen2 直接发送 TS2 进入 L0 |
2.4 Gen3 均衡训练(Equalization)详解
Gen3 均衡训练分为三个相位,每个相位解决不同的信号完整性问题:
- Phase 1:发送端(Tx)发送预设的均衡系数组合,接收端(Rx)测量信号质量并反馈 Preset 编号。
- Phase 2:Rx 请求 Tx 微调 去加重(De-emphasis) 和 摆幅(Swing) 系数,通过
EQ TS1中的系数更新字段传递。 - Phase 3:Rx 进行本地均衡器(CTLE/DFE)自适应训练,完成后发送 Equalization Done 标志。
调试提示: 在逻辑分析仪上捕获
EQ TS1 有序集,观察 Preset Number 和 Requested Coefficient 字段是否在合理范围内变化。如果 Rx 持续请求极端系数(如 Preset 7 或 Preset 0),通常指示通道损耗过大或存在阻抗不连续。
2.5 Gen3 速率协商的时钟恢复挑战
Gen3 的 8.0 GT/s 数据速率对 CDR 提出了严苛要求:
- 抖动容限降低:单位间隔(UI)从 Gen2 的 200 ps 缩短至 125 ps,CDR 的相位捕获窗口缩小。
- 频率锁定时间:Gen3 要求 CDR 在 20 μs 内完成频率锁定,而 Gen2 允许 100 μs。
- 数据转换密度:128b/130b 编码的最大连续相同位(Run Length)为 130 位,远大于 8b/10b 的 5 位,导致 CDR 相位更新间隔变长。
下图展示了 Gen3 速率协商过程中 CDR 锁定的关键时序窗口:
2.6 Gen3 与 Gen1/Gen2 协商差异总结
下表从多个维度对比了 Gen3 与 Gen1/Gen2 的速率协商机制:
| 对比维度 | Gen1 / Gen2 | Gen3 |
|---|---|---|
| 协商发生状态 | L0 状态(链路已建立) | Polling 状态(链路建立过程中) |
| 编码方式 | 8b/10b(20% 开销) | 128b/130b(~1.5% 开销) |
| 均衡训练 | 无(仅固定去加重) | Phase 1~3 完整均衡训练 |
| CDR 锁定要求 | 宽松(100 μs 内锁定) | 严格(20 μs 内锁定,且需跟踪均衡变化) |
| 速率切换信号 | TS1 中的 Speed Change 位 | EQ TS1 有序集 + 均衡系数协商 |
| 失败恢复机制 | 降速至 Gen1 重试 | 降速至 Gen1 后重新执行均衡训练 |
2.7 常见 Gen3 速率协商失败模式
基于上述差异,Gen3 速率协商失败通常表现为以下三种模式:
- Polling.Speed 超时:发送端切换到 Gen3 速率后,接收端 CDR 无法在 20 μs 内锁定,导致 LTSSM 回退到 Polling.Active 并降速至 Gen1。
- 均衡训练失败:Phase 2 或 Phase 3 中,Rx 无法找到有效的均衡系数组合,持续发送
Request Failed标志,最终超时回退。 - 系数协商死锁:Tx 和 Rx 对均衡系数的理解不一致(例如 Preset 编号映射错误),导致双方陷入无限循环的系数请求/拒绝。
调试建议: 当遇到 Gen3 训练失败时,首先检查 Polling.Speed 子状态的停留时间。如果该状态持续时间超过 24 μs(典型超时阈值),则优先排查 CDR 锁定问题;如果 Polling.Equalization 状态反复进出,则优先排查通道损耗和均衡系数配置。