64b66b
背景
64b/66b
编码技术是IEEE 802.3
工作组为10G
以太网提出的,主要是减少编码开销,降低硬件的复杂性,并作为8b/10b
编码的另一种选择,以支持新的程序和数据。可以参考64B/66B编码技术。本文基于2000
年IEEE 802.3
工作组提出的10G Ethernet
编码规则64b/66b coding update。64b/66b
编码仅有一个码表,其编码逻辑如下图所示:
原理分析
编码
64b/66b
编码技术将64bit
的数据编码为66bit
的块来传输,根据不同的传输方式,块格式分为两种:
-
数据块
数据块类似
8b10b
编码中的数据码,用于单纯的传递数据。 -
控制块
控制块类似
8b10b
编码中的控制码,用于码流控制。- 与
8b10b
编码相同的是,控制块可以作为起始、结尾、分隔 - 与
8b10b
编码不同的是,控制块不实现链路同步
- 与
同步头
64b/66b
编码技术的链路同步通过前2bit
的同步头(Sync Header
)实现。两种66bit
的块对应不同的同步头。
同步头 | 含义 |
---|---|
00 | 编码错误 |
01 | 数据块(纯数据) |
10 | 控制块(混合数据/控制信息) |
11 | 编码错误 |
因此,按照同步机制,每66bit
的数据至少会出现一次01
或者10
的转换。
数据块
单纯传递数据的块即数据块。
数据块一共传递8byte=8*8bit=64 bit
的数据。
控制块
包含控制信息传递的块即控制块。控制块可以同时传递数据。
注意在控制块中,数据字(D0~D7
)依旧是byte(8bit)
为单位,而其控制字(Z0~Z7
orC0~C7
)是按照7bit
为单位的,因此在某些情况下会存在空闲的位置(即表中标黄的部分)。
64b/66b
对应8b/10b
编码的控制字如下表所示(参考资料[1]):
而其实现在使用的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
字节:
- 以
0x78
作为块类型字段,跟7字节(56bit
)数据; - 以
0x33
作为块类型字段,跟4个控制字(28bit
)+空闲(4bit
)+3个字节(24bit
)数据。
终止字
控制块中终止字共8
种,根据数据在不同位置终止采用不同块类型:
-
以
0x87
作为块类型字段,跟0字节(0bit
)数据+空闲(7bit
)+7个控制字(49bit
); -
以
0x99
作为块类型字段,跟1字节(8bit
)数据+空闲(6bit
)+6个控制字(42bit
); -
以
0xaa
作为块类型字段,跟2字节(16bit
)数据+空闲(5bit
)+5个控制字(35bit
); -
以
0xb4
作为块类型字段,跟3字节(24bit
)数据+空闲(4bit
)+4个控制字(28bit
); -
以
0xcc
作为块类型字段,跟4字节(32bit
)数据+空闲(3bit
)+3个控制字(21bit
); -
以
0xd2
作为块类型字段,跟5字节(40bit
)数据+空闲(2bit
)+2个控制字(14bit
); -
以
0xe1
作为块类型字段,跟6字节(48bit
)数据+空闲(1bit
)+1个控制字(7bit
); -
以
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 和 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
数量相等,同时保证码流一定不会出现连续超过5
个0/1
- 代价就是其编码效率不高。
示例
示例来自参考资料[3]。
-
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 -
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/) -
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/) -
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
,大致是均衡的。
编码器
解码器
扰码器 & 解扰器
串行扰码
并行扰码
未完待续…长期施工…
参考资料
[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)