4. 编码概述:8B/10B编码原理、64B/66B编码原理、InfiniBand编码选择

4.1 为什么物理层需要编码

在InfiniBand物理层中,编码不是“可选项”,而是保证链路可靠性的基石。串行链路上传输的原始比特流如果直接发送,会面临三个致命问题:直流不平衡(长时间发送0或1导致接收端无法确定判决阈值)、时钟恢复困难(没有足够跳变沿供CDR提取时钟)、无法区分数据与控制字符(接收端不知道字节边界在哪里)。编码的作用就是通过一定的映射规则,让发送出去的比特流具备足够的跳变密度、直流平衡特性,并预留控制字符用于链路管理。

核心认知:编码的本质是“用带宽换可靠性”。编码后线路速率高于有效数据速率,多出来的开销用于换取时钟同步能力、直流平衡和错误检测能力。

4.2 8B/10B编码原理

8B/10B编码由IBM于1983年提出,其核心思想是将每个8 bit数据字节映射为10 bit码字。映射过程分为两步:首先将8 bit拆分为高3位(H)和低5位(L),分别通过5B/6B和3B/4B子编码表完成映射,再拼接成10 bit码字。编码表设计保证了每个码字中0和1的数量差不超过2,从而维持直流平衡。

编码器内部维护一个运行不一致性(Running Disparity, RD)状态。每发送一个码字后,根据码字中1和0的数量差更新RD值(正或负)。当待发送字节存在正负两种码字变体时,选择与当前RD相反方向的码字,确保长期直流平衡。接收端通过检查RD是否持续在合法范围内跳变,可以快速发现单比特错误。

8B/10B编码示例(D.5.2控制字符):
原始字节: 0xBC (10111100)
拆分:     高3位=101 (5), 低5位=11100 (28)
5B/6B映射: 11100 → 011100 (RD=-) 或 100011 (RD=+)
3B/4B映射: 101   → 1011   (RD=-) 或 0100   (RD=+)
最终码字: 根据当前RD选择组合,例如 011100 1011

8B/10B编码额外提供了K码(控制字符),用于表示包边界、空闲序列、训练序列等特殊信息。InfiniBand中定义了12个K码,例如K28.5(逗号字符)用于对齐和训练帧同步。8B/10B编码的开销为25%(10/8=1.25),但换来了优秀的运行长度限制(最大5个连续相同位)和可检测的非法码字。

4.3 64B/66B编码原理

64B/66B编码是更高效的替代方案,用于10Gbps以上高速链路。它将64 bit数据块编码为66 bit码块,开销仅为3.125%。编码规则简单而巧妙:每个66 bit码块以2 bit同步头(Sync Header)开头,“01”表示数据块,“10”表示控制块(“00”和“11”为非法同步头,用于快速错误检测)。

数据块格式为:2 bit同步头 + 64 bit原始数据,不做额外变换。控制块格式为:2 bit同步头 + 8 bit块类型字段(Block Type Field)+ 56 bit控制信息。块类型字段定义了不同的控制块格式,例如:

  • 0x1E:全空闲块(IDLE),用于链路空闲填充
  • 0x2D:包含8个有序集(如训练帧、状态帧)
  • 0x33:混合数据/控制块,包含1个数据字节和7个控制字符

64B/66B编码不保证直流平衡,也不限制运行长度。它依赖加扰器(Scrambler)对数据进行随机化处理,使比特流近似白噪声特性。加扰器采用自同步多项式(如x58 + x39 + 1),发送端和接收端无需预先同步即可工作。接收端通过同步头锁定码块边界,再通过块类型字段解析控制信息。

对比要点:8B/10B通过查表保证直流平衡,但开销大;64B/66B通过加扰实现统计平衡,开销小但需要更复杂的同步机制。64B/66B的同步头提供了每66 bit一次的强制跳变,确保CDR能持续恢复时钟。

4.4 InfiniBand编码选择

InfiniBand在不同速率代际采用了不同的编码方案,选择依据是速率、功耗、复杂度和误码率的综合权衡:

速率代际单通道速率编码方案有效数据速率编码开销
SDR (1X)2.5 Gb/s8B/10B2.0 Gb/s25%
DDR (1X)5.0 Gb/s8B/10B4.0 Gb/s25%
QDR (1X)10.0 Gb/s8B/10B8.0 Gb/s25%
FDR (1X)14.0625 Gb/s64B/66B13.64 Gb/s3.125%
EDR (1X)25.78125 Gb/s64B/66B25.0 Gb/s3.125%
HDR (1X)53.125 Gb/s64B/66B + PAM451.56 Gb/s3.125%

从表中可以看出,InfiniBand在QDR及之前采用8B/10B编码,从FDR开始切换到64B/66B编码。切换的原因主要有三点:

  1. 功耗与散热:8B/10B编码在10 Gb/s以上速率时,25%的额外比特导致发射器和接收器功耗显著增加,64B/66B的3.125%开销大幅降低了功耗。
  2. 信号完整性:更高频率下,8B/10B的频谱特性不如加扰后的64B/66B平坦,后者更利于均衡器处理。
  3. 实现复杂度:8B/10B需要维护RD状态和查表逻辑,在并行度极高的SerDes中实现面积大;64B/66B的加扰和同步头检测更适合高速流水线。

值得注意的是,HDR速率开始引入PAM4调制(4电平脉冲幅度调制),每个符号携带2 bit信息,但64B/66B编码层保持不变。PAM4改变了物理层的调制方式,但编码层的帧格式和同步机制仍然沿用64B/66B架构。

InfiniBand编码演进与选择逻辑 8B/10B编码(SDR/DDR/QDR) 8 bit 数据 5B/6B + 3B/4B 10b RD状态反馈选择码字变体 • 直流平衡:RD控制 • 最大运行长度:5 bit • 开销:25% 64B/66B编码(FDR/EDR/HDR) 64 bit 数据 加扰器 2b同步头 01 = 数据块 10 = 控制块 00/11 = 错误 • 统计平衡:加扰实现 • 同步头强制跳变 • 开销:3.125% FDR起 切换 编码选择权衡因素 权衡维度 8B/10B 64B/66B 直流平衡 RD机制保证 加扰统计平衡 时钟恢复 跳变密度高 同步头+加扰跳变 错误检测 非法码字+RD违规 非法同步头+CRC 适用速率 ≤ 10 Gb/s ≥ 14 Gb/s

4.5 编码误区与复盘

常见误区一:认为64B/66B编码后信号一定比8B/10B更容易恢复时钟。实际上,64B/66B依赖加扰器保证数据跳变密度,如果加扰多项式实现有缺陷或接收端去加扰失步,时钟恢复反而更困难。8B/10B的查表编码天然保证了每10 bit内至少有2次跳变,确定性更强。
常见误区二:混淆“编码开销”与“链路速率”的关系。例如QDR 10 Gb/s链路,8B/10B编码后有效数据速率是8 Gb/s,而不是10 Gb/s。在规划InfiniBand集群带宽时,必须区分线路速率(Link Rate)和数据速率(Data Rate),否则会高估实际吞吐能力。
复盘要点:InfiniBand从8B/10B切换到64B/66B并非简单的“新替代旧”,而是速率提升后的必然选择。在14 Gb/s以上,8B/10B的25%开销会导致功耗和散热无法接受,而64B/66B虽然增加了加扰/去加扰的复杂度,但换来了更低的功耗和更好的频谱效率。理解这一演进逻辑,有助于在实际系统设计中判断不同速率代际的链路预算和信号完整性要求。