先把一个容易混的点说清:
**PCIe 5.0(Non-Flit / 128b130b)本身并没有"L0 下关掉部分 Lane、不重新训练就恢复全宽"的官方机制。**
这个能力主要是 PCIe 6.0 的 L0p;PCIe 5.0 里类似"关 Lane/降宽"通常要进 Recovery / Re-train。
但"流量低关部分 Lane、恢复全宽不重新训练",在 L0p 语义下是可以解释的。
一、为什么"升宽"其实还是要训练,只是不打断业务
降宽(x16 → x8):
- 在 SKP Ordered Set 边界发 Control SKP / EIOS
- 多余 Lane 进 Electrical Idle
- 剩余 Lane 继续传数据
- 不需要重新均衡,因为这些 Lane 本来就在跑,信道没变
升宽(x8 → x16):
- 原来关掉的 Lane 退出 Electrical Idle
- 发 EIEOS
- 交换 TS1/TS2
- 做 bit/symbol lock、lane-to-lane de-skew
- Gen3+ 还要发 SDS(Start of Data Stream)
- 然后才把新 Lane 并入数据流
所以严格说:
"恢复全宽"不是完全不训练,而是"只对新增 Lane 做局部训练",原本在跑的 Lane 不进 Recovery、不重做均衡、不中断 TLP/Flit 流。
二、为什么可以"不重新做全链路 Equalization"
关键前提:
- 速率没变
还是 32 GT/s(Gen5)或 64 GT/s(Gen6),信道损耗特征没变。 - 关掉的 Lane 之前已经训过
Link 初始化时 x16 全宽已经做过完整 EQ(Preset / Phase0~Phase3 / TS1 TS2)。
关 Lane 时:- 不改 TX presets
- 不改 RX CTLE/DFE 系数
- 不重协商 speed/width 上限
- Lane 是"睡过去"的,不是"拔掉重连"
电气空闲(Electrical Idle)只是:- TX driver tristate
- RX 关前端功耗
- PLL 可关可留
但 Lane 编号、极性、反向、de-skew 上下文都还在。
- 用 Ordered Set 做"检查点"
SKP / Control SKP / EIEOS / SDS 都是协议级锚点:- 降宽:在 SKP 边界切
- 升宽:新 Lane 训完后用 SDS 标记"从现在开始这块 Lane 算进数据流"
上层看到的是带宽变化,不是丢包。
三、和"真·重新训练(Recovery)"的区别
| 动作 | 进 Recovery? | 重做 EQ | 业务中断 | 场景 |
|---|---|---|---|---|
| L0p 降宽 | 否 | 否 | 否 | 流量低,x16→x8 |
| L0p 升宽 | 否(仅新 Lane 局部训练) | 新 Lane 做轻量 lock/de-skew | 否 | 流量上来,x8→x16 |
| 进 Recovery | 是 | 是(可能全 EQ) | 是/协议层可见 | LCRC 狂错、块锁丢、速率变更 |
| 重新训练全链 | 是 | 是 | 是 | 热插拔、Reset、Gen 切换 |
一句话:
**Recovery = 链路健康出问题,要重训。**
L0p 升宽 = Lane 本来就好好的,只是把"睡着的 Lane 叫醒并对齐",不用把整条链子拆了重练。
四、为什么 PCIe 5.0 你很少看到这功能
PCIe 5.0:
- 没有 L0p
- L0s:所有 Lane 浅休眠,退出用 FTS(假设式训练)
- L1/L1.1/L1.2:整链休眠,退出要 Recovery 类流程
- 动态降宽通常不是"L0 里悄悄做",而是:
- Link Degradation(错误率过高 → 降宽/降速)
- 或软件/BIOS 配 Max Link Width
- 或进 Recovery 重新 Config