RS = Reed-Solomon(里德-所罗门码)
是一种分组纠错码,在 PCIe 6.0 里用来对抗 PAM4 比 NRZ 更脆弱的信噪比。
一、RS 是什么
Reed-Solomon 码 :把数据切成符号(symbol),在 Galois 域 GF(2ᵐ) 上做多项式运算,能纠正符号级错误。
PCIe 6.0 Flit Mode 用的是 **RS(18,16)** 轻量一阶码:
每 FLIT 的 TLP Region(236B = 1888 bit)
被切成 16 个符号(symbol),每个符号 118 bit? 不对
实际上 PCIe 6.0 的 FEC 结构是这样的:
| 参数 | 值 |
|---|---|
| 码型 | RS(18,16) 轻量一阶 |
| 每个 FLIT | 18 个 FEC 符号 |
| 其中数据 | 16 个符号 |
| 校验 | 2 个符号(parity) |
| 每个符号 | 8 bit(GF(2⁸)) |
| 总校验开销 | 2/18 ≈ 11.1% |
RS(18,16) 能纠正:最多 1 个符号错误(8 bit 内任意模式)
二、RS 能纠几位错误
核心公式
RS(n,k) 能纠正的符号数:t = (n-k)/2
PCIe 6.0: RS(18,16) → t = (18-16)/2 = 1
| 错误类型 | 能不能纠 |
|---|---|
| 1 个符号内任意 bit 错(最多 8 bit) | ✅ 能纠 |
| 2 个符号同时出错 | ❌ 不能纠(只能检) |
| 跨符号的零散 bit 错(每个符号 1 bit) | ❌ 不能纠(算 2 个符号错) |
**关键:RS 纠的是"符号"不是"bit"。** 1 个符号内错 1 bit 和错 8 bit,纠错能力一样。
三、轻量一阶是什么意思
| 概念 | 含义 |
|---|---|
| 一阶 | 只用 2 个校验符号(parity),t=1 |
| 轻量 | 相比 RS(34,30) 等更重的码,延迟更低、面积更小 |
| 代价 | 只能纠 1 个符号,2 个符号错只能检测(标记 FLIT 为 error) |
PCIe 6.0 选 RS(18,16) 的权衡:
- PAM4 主要错误模式是突发噪声(一次影响连续几个 bit → 集中在 1 个符号内)
- 1 符号纠错 + CRC-2 检错 + Selective Replay 重传 = 足够覆盖 PAM4 的 BER 需求
- 再重的 FEC 会增加延迟和面积,不划算
四、纠错延迟
4.1 为什么关心延迟
FEC 不是免费的:
发送端:算 parity → 多等 2 个符号时间
接收端:收齐 18 个符号 → 算 syndrome → 判决纠错
4.2 延迟估算
符号率 = 32 GBaud
每个符号 = 8 bit(实际是 118 bit 映射,简化按符号周期算)
1 个符号周期 ≈ 1 UI = 31.25 ps
RS(18,16) 延迟:
编码延迟:~1-2 个符号 ≈ 31-62 ps
解码延迟:~16-18 个符号(要收齐才能算 syndrome)≈ 500-560 ps
总 FEC 延迟:~0.5-1 ns(典型值)
对比 PCIe 6.0 FLIT 时间:
1 FLIT = 252B = 2016 bit
@ 64 Gbps/lane → 1 FLIT ≈ 31.5 ns
FEC 延迟 ~0.5-1 ns → 占 ~2-3%
所以叫"轻量"------FEC 延迟远小于一个 FLIT 的传输时间,对整体链路延迟影响很小。
五、和 CRC-2 的配合
PCIe 6.0 FLIT 尾部:
ECC (8B) = RS(18,16) FEC → 纠 1 符号错
CRC (2B) = CRC-16 截断 → 检所有剩余错
流程:
1. RS 尝试纠错(最多 1 符号)
2. CRC 校验 → 如果还错 → NAK → Selective Replay
| 场景 | RS | CRC | 结果 |
|---|---|---|---|
| 0 错误 | - | PASS | ✅ 直接收 |
| 1 符号错 | ✅ 纠正 | PASS | ✅ 静默纠正 |
| 2 符号错 | ❌ 纠不了 | FAIL | → NAK → Replay |
| 突发 8+ bit 在同一符号 | ✅ 纠正 | PASS | ✅ 静默纠正 |
六、一句话总结
RS = Reed-Solomon 分组纠错码。PCIe 6.0 用 RS(18,16) 轻量一阶码,能纠正 1 个 8-bit 符号内的任意错误,纠错延迟 ~0.5-1 ns(约 2-3% FLIT 时间),配合 CRC-2 检错 + Selective Replay 覆盖 PAM4 的误码需求。