背景

  • 64b/66b编码技术是IEEE 802.3工作组为10G以太网提出的,主要是减少编码开销,降低硬件的复杂性,并作为8b/10b编码的另一种选择,以支持新的程序和数据。可以参考64B/66B编码技术。本文基于2000IEEE 802.3工作组提出的10G Ethernet编码规则64b/66b coding update
  • 64b/66b编码仅有一个码表,其编码逻辑如下图所示:

64b66b

原理分析

编码

64b/66b编码技术将64bit的数据编码为66bit来传输,根据不同的传输方式,块格式分为两种:

  1. 数据块

    数据块类似8b10b编码中的数据码,用于单纯的传递数据。

  2. 控制块

    控制块类似8b10b编码中的控制码,用于码流控制。

    • 8b10b编码相同的是,控制块可以作为起始、结尾、分隔
    • 8b10b编码不同的是,控制块不实现链路同步

同步头

64b/66b编码技术的链路同步通过前2bit的同步头(Sync Header)实现。两种66bit对应不同的同步头。

同步头 含义
00 编码错误
01 数据块(纯数据)
10 控制块(混合数据/控制信息)
11 编码错误

因此,按照同步机制,每66bit的数据至少会出现一次01或者10的转换。

数据块

单纯传递数据的块即数据块。

数据块一共传递8byte=8*8bit=64 bit的数据。

data_block

控制块

包含控制信息传递的块即控制块。控制块可以同时传递数据。

注意在控制块中,数据字(D0~D7)依旧是byte(8bit)为单位,而其控制字(Z0~Z7orC0~C7)是按照7bit为单位的,因此在某些情况下会存在空闲的位置(即表中标黄的部分)。

control_block

64b/66b对应8b/10b编码的控制字如下表所示(参考资料[1]):

kcode_mapping

而其实现在使用的64b/66b编码技术也扩展了其他控制字(参考64b/66b line code - IEEE 802,包含XGMII控制码-8b/10b控制码-10GBASE-R的对应关系):

控制字符 符号 XGMII控制码 10GBASE-R 控制码 10GBASE-R 0码 8b/10b码 备注
空闲 /I/ 0x07 0x00 K28.0或K28.3或K28.5
开始 /S/ 0xfb 由块类型字段编码 K27.7 默认0x00
终止 /T/ 0xfd 由块类型字段编码 K29.7 默认0x00
错误 /E/ 0xfe 0x1e K30.7
序列有序集 /Q/ 0x9c 由块类型字段编码加上O模式编码 0x0 K28.4 10GbE LSS 有序集
保留0 /R/ 0x1c 0x2d K28.0
保留1 0x3c 0x33 K28.1
保留2 /N/ 0x7c 0x4b K28.3
保留3 /K/ 0xbc 0x55 K28.5
保留4 0xdc 0x66 K28.6
保留5 0xf7 0x78 K23.7
信号有序集 /Fsig/ 0x5c 由块类型字段编码加上O模式编码 0xf K28.2 FC 有序集

起始字

控制块中起始字共2种,根据数据起始需要至少3字节或7字节:

  1. 0x78作为块类型字段,跟7字节(56bit)数据;
  2. 0x33作为块类型字段,跟4个控制字(28bit)+空闲(4bit)+3个字节(24bit)数据。

终止字

控制块中终止字共8种,根据数据在不同位置终止采用不同块类型:

  1. 0x87作为块类型字段,跟0字节(0bit)数据+空闲(7bit)+7个控制字(49bit);

  2. 0x99作为块类型字段,跟1字节(8bit)数据+空闲(6bit)+6个控制字(42bit);

  3. 0xaa作为块类型字段,跟2字节(16bit)数据+空闲(5bit)+5个控制字(35bit);

  4. 0xb4作为块类型字段,跟3字节(24bit)数据+空闲(4bit)+4个控制字(28bit);

  5. 0xcc作为块类型字段,跟4字节(32bit)数据+空闲(3bit)+3个控制字(21bit);

  6. 0xd2作为块类型字段,跟5字节(40bit)数据+空闲(2bit)+2个控制字(14bit);

  7. 0xe1作为块类型字段,跟6字节(48bit)数据+空闲(1bit)+1个控制字(7bit);

  8. 0xff作为块类型字段,跟7字节(56bit)数据+空闲(0bit)+0个控制字(0bit)。

其他控制字

通过块类型也可以编码出其他控制字,举例如下:

  • 0x1e作为块类型字段,代表错误字K30.5
  • 0x55作为块类型字段,代表控制字K28.5
  • 0x78作为块类型字段,代表控制字K23.7

通过块类型和7bit line code也可以编码出其他控制字,举例如下:

  • 0x55作为块类型字段+O模式,代表控制字有序集
  • 0x66作为块类型字段+O模式,代表控制字有序集

扰码

扰码技术是一种对数据进行变换的方法,目的是使数据中的0和1平衡比例(各50%),影响高速传输的质量

  • 加扰(Scramble
  • 解扰(Descramble

实际操作就是把数据流与特定模式序列 (pattern) 进行异或 (XOR),使发送数据变随机,特定模式序列用 LFSR (Linear Feedback Shift Register,线性反馈移位寄存器) 产生。64b/66b采用的生成多项式是X58+X19+1=0

这里插入一个问题:

扰码和8b/10b编解码的功能是重复的吗?都做0/1的平衡?

参考8b/10b下的编码/加扰和组帧 – 重新开始

請問 8b/10b 和 Scrambler 的功能是不是類似的?
编码和加绕还是不一样的,8b/10b 编码的主要功能是保持直流平衡,因为经过 8b/10b 编码后的数据 0 和 1 的个数比较接近,不会出现长 0 或长 1 的情况,出现长 0 或者长 1 可能会导致接收端对电平 0,1 的识别出现误判,而加绕主要是防止不同 lane 之间的干扰,比如一个 x16 的链路,在发相同的有续集 (order set) 时,如果没有加绕,这 16 条 lane 发送的数据就是一样的,更容易产生干扰,加饶之后,每条 lane 传输的数据就变得伪随机了,可以降低 lane 与 lane 之间的干扰。所以在 tx 方向,一般都是先加绕,然后进行 8b/10b 编码。补充:一条 lane 也是可以降低干扰的,这也比较好理解,如果不加扰,一条 lane 传输的内容完全一样,就相当于是形成了高频信号,容易受到外界或者内部干扰。
為什麼需要同時做這 2 種功能呢?
因为它们的作用是不一样的
Gen3 之後只使用 Scrambler, 是否說明 8b/10b 不是很有必要呢?
gen3-gen5 没有采用 8b/10b 编码是因为 8b/10b 编码的效率比较低,一个 8 比特的数需要 10 比特来编码,这样在传输时会浪费到 20% 的带宽,对 gen3 以上的速率来讲,浪费太多,可能不太容易接受,所以 gen3-gen5 换了更高效的编码 128b/130b 编码,128b/130b 编码从编码方式来讲并不能维持直流平衡,所以协议换了一种加绕算法来让 0,1 的个数稍微平衡点,此外,为了维持 0,1 个数平衡,协议在很多地方都有做专门的处理,比如 TS1,TS2 的 symbol 14-15 就可以根据前面 0,1 个数的差别来看是作为 TS 的标识符还是作为直流平衡用。gen3 很多有续集的定义 0,1 的个数基本是相等的,而且有续集通常还不需要加绕,也都是维持直流平衡。在链路训练过程中,两端交换最对的就是 TS, 所以为了在 128b/130b 编码中,对 TS 的很多 symbol 也都是进行了加绕处理,防止 lane 与 lane 之间的干扰,而在 8b/10b 编码下,TS 没有加绕的,但是在 8b/10b 编码下,一定程度上也可以防止 lane 与 lane 之间的干扰,因为 8b/10b 编码会根据当前运行一致性(就是 0,1 个数的差别)来确定编码后的值,在多 lane 的链路上,一定程度上也可以保证每条 lane 传输的内容不一样

个人理解,8b/10b做的是比随机化序列更严格的直流平衡:

  • 不仅保证码流总体的0/1数量相等,同时保证码流一定不会出现连续超过50/1
  • 代价就是其编码效率不高。

示例

示例来自参考资料[3]。

  1. Original Data(原始码,以64字节为例)

    byte0 byte1 byte2 byte3 byte4 byte5 byte6 byte7
    55 55 55 55 55 55 d5
    08 00 20 77 05 38 0e 8b
    00 00 00 00 08 00 45 00
    00 28 1c 66 00 00 1b 06
    9e d7 00 0 59 4d 00 00
    68 d1 39 28 4a eb 00 00
    30 77 00 0 7a 0c 50 12
    1e d2 62 84 00 00 00 00
    00 00 00 00 93 eb f7 79
  2. XGMII(Add SOP,EOP,IDLES and convert to RS indications)

    07,1 07,1 07,1 07,1 07,1 07,1 07,1 07,1 (IDLE /I/)
    fb,1 55,0 55,0 55,0 55,0 55,0 55,0 d5,0 (START /S/) Data
    08,0 00,0 20,0 77,0 05,0 38,0 0e,0 8b,0 Data
    00,0 00,0 00,0 00,0 08,0 00,0 45,0 00,0 Data
    00,0 28,0 1c,0 66,0 00,0 00,0 1b,0 06,0 Data
    9e,0 d7,0 00,0 00,0 59,0 4d,0 00,0 00,0 Data
    68,0 d1,0 39,0 28,0 4a,0 eb,0 00,0 00,0 Data
    30,0 77,0 00,0 00,0 7a,0 0c,0 50,0 12,0 Data
    1e,0 d2,0 62,0 84,0 00,0 00,0 00,0 00,0 Data
    00,0 00,0 00,0 00,0 93,0 eb,0 f7,0 79,0 Data
    fd,1 07,1 07,1 07,1 07,1 07,1 07,1 07,1 (Terminate /T/) (IDLE /I/)
  3. 10GBASE-R(Arrange into frames with type indicators and sync bit)

    sync byte0 byte1 byte2 byte3 byte4 byte5 byte6 byte7
    “10” 1e 00 00 00 00 00 00 00 (IDLE /I/)
    “10” 78 55 55 55 55 55 55 d5 (START /S/) Data
    “01” 08 00 20 77 05 38 0e 8b Data
    “01” 00 00 00 00 08 00 45 00 Data
    “01” 00 28 1c 66 00 00 1b 06 Data
    “01” 9e d7 00 00 59 4d 00 00 Data
    “01” 68 d1 39 28 4a eb 00 00 Data
    “01” 30 77 00 00 7a 0c 50 12 Data
    “01” 1e d2 62 84 00 00 00 00 Data
    “01” 00 00 00 00 93 eb f7 79 Data
    “10” 87 00 00 00 00 00 00 00 (Terminate /T/) (IDLE /I/)
  4. Scrambler(Scramble and transmit left-to-right, lsb first)

    sync byte0 byte1 byte2 byte3 byte4 byte5 byte6 byte7
    “10” 1e 00 00 00 80 f0 ff 7b (IDLE /I/)
    “10” 78 15 ad aa aa 16 30 62 (START /S/) Data
    “01” 08 e1 81 c5 6e 7c 76 6a Data
    “01” e6 30 28 80 cc aa f4 8d Data
    “01” 83 ee 49 ae 6d 93 db 2c Data
    “01” f3 46 70 db 82 5a 90 74 Data
    “01” 1e 51 79 6b 1a 25 7a c5 Data
    “01” 41 1f bf d4 0c 44 ca 4a Data
    “01” 09 28 12 d2 b5 2d 3f 2c Data
    “01” 49 92 de c8 b3 33 0e 32 Data
    “10” 2a a3 3a c8 d7 ad 99 b5 (Terminate /T/) (IDLE /I/)

注:以上扰码器假定初始值为全1,非全0

根据上述扰码结果可计算0/1个数分别为326/378,大致是均衡的。

编码器

coder

解码器

decoder

扰码器 & 解扰器

串行扰码

并行扰码

未完待续…长期施工…

参考资料

[1] IEEE 802.3ae 10Gb/s Task Force : walker_1_0300(64B66B-coding)

[2] P802.3bn EPoC PHY Task Force : hajduczenia_3bn_04_0313(64B66B-linecode)

[3] IEEE 802.3ae 10Gb/s Task Force : walker_1_0700(64b/66b coding update)

[4] 高速接口_(10Gbps )万兆网络中物理编码层 64B66B 编码解码实现 - 李白的白 - 博客园 (cnblogs.com)