PCIe扫盲——128/130b编码详解

前面的文章介绍过PCIe的Gen1和Gen2模式下,物理层使用的是8b/10b的编码。这种编码方式能够实现直流均衡,并且能将数据流中的连0连1控制在5个以内(最多5个连续的1或者0),从而可以降低物理层CDR设计的复杂度。但是8b/10b编码的缺点也很明显:浪费了20%的带宽资源,以PCIe Gen2为例,5GT/s的速率却只有4Gbps的带宽。

注:PCIe的真实带宽还受到TLP包中的非数据内容,DLLP和Ordered Sets,甚至Root端的驱动和应用程序的影响。具体可以参考之前的文章:http://blog.chinaaet.com/justlxy/p/5100062236

本文将简要地介绍PCIe Gen3及以上版本中所使用的128b/130b编码技术。128b/130b编码是以太网中使用的64b/66b的演进版本,关于64b/66b,可以参考:http://blog.chinaaet.com/justlxy/p/5100064750

128b/130b相比于8b/10b,在带宽利用率上有了显著地提升,从80%到98.46%。在评估总线性能的时候,甚至可以忽略不计。与以太网中使用的64b/66b类似,128b/130b编码是在128 bit的Payload前面加上了2 bit的同步头,如下图所示:

blob.png

该同步头(Sync)为01b时,表示其后面跟的是Ordered Set;为10b是,则表示其后面跟的为非Ordered Set数据。需要注意的是,Byte Striping逻辑会将同步头在每一个Lane上重复(如果有的话,即非x1模式),以便于接收端识别同步头。我们将这2bit的同步头和128bit的Payload,一起称为数据块(Data Block)。在Gen1/2模式下,物理层首先完成位锁定(Bit Lock),然后尝试去完成字节锁定(Byte Lock)。而在Gen3(以及以上版本),物理层完成位锁定之后,会尝试进行块锁定(Block Lock,与Gen1/2的字节锁定对应,Gen3中并没有字节锁定的概念)。

注:当然,完成块锁定需要借助特定的数据流,在PCIe中使用的00h和FFh交替的数据流,即EIEOS(Ordered Set的一种)。

PCIe一共定义了5种类型的Ordered Set:

※ TS1 and TS2 Ordered Set (TS1OS/TS2OS) :用于链路初始化和训练

※ Electrical Idle Ordered Set (EIOS) :用于电气空闲状态

※ FTS Ordered Set (FTSOS) :用于L0s状态到L0状态的切换

※ SKP Ordered Set (SOS) :用于CTC(Clock Tolerance Compensation)

※ Electrical Idle Exit Ordered Set (EIEOS) :V2.0 Spec增加的

※ Start of Data Stream Ordered Set(SDS):仅适用于Gen3及以上版本,当链路准备发送数据流时,会先发送SDS,然后进入L0状态。

需要注意的是,与发送有效数据流(非Ordered Set)不同,发送Ordered Set时,所有的内容都需要在同一时刻在所有的Lane上(如果有的话)同时发送。以FTS为例,如下图所示:

blob.png

注:几乎所有的Ordered Set的Payload的都是16个字节,但是有一个例外:SOS(SKP Ordered Set),其Payload可以是8,12,16,20或者24个字节。

对于同步头为10b(即非Ordered Set)时,还需要借助Tokens(Gen3及以上版本才有的概念)来区分Payload中的数据的类型是TLP还是DLLP。PCIe Spec一共定义了5种数据结构(即5种Tokens):

※ Start TLP (STP) — followed by a TLP  

※ Start DLLP (SDP) — followed by a DLLP  

※ Logical Idle (IDLA) — sent when there is no packet activity  

※ End of Data Stream (EDS) — Precedes the transition to Ordered Sets  

※ End Bad (EDB) — reports a nullified packet has been detected

每种Token的结构如下图所示:

blob.png

以STP为例:

blob.png

有人可能有疑问了,128b/130b编码之所在128bit的Payload前面增加了2bit的同步头,严格意义上都不能称之为编码。显然仅仅依靠128b/130b编码根本不可能实现8b/10b编码那样的直流均衡,因为Gen3使用了全新的扰码方式,以达到直流均衡的目标。Gen3的扰码算术表达式如下:

G(x)=x^23+x^21+x^16+x^8+x^5+x^2+1

blob.png

为了减少各个相邻的Lane之间的干扰,每个Lane使用的扰码种子是不同的,如下表所示:

blob.png

注:对于x16/x32的应用而言,可以依次重复使用各个Lane的种子,即Lane 8继续使用Lane 0的值,Lane 9使用Lane 1的值,依次类推。

注:与以太网中使用的64b/66b编码类似,128b/130b无法像8b/10b编码那样将连续的0(或者连续的1)限制在较小的范围之内,理论上,128b/130b可能出现的最大的连续0(或者连续1)可以达到128(最坏的情况下)。128b/130b编码只能借助扰码来实现较长时间内的直流均衡。这也是为什么PCIe Gen3的速率仅仅比Gen2的物理传输速率提高了3GT/s,其物理层(主要是CDR)的设计复杂度却增加了很多很多的原因。

注:2bit的同步头不会被扰码,当发送/接收到EIEOS或者FTSOS后,扰码器会重新初始化。除了TS1OS和TS2OS之外的所有的Ordered Set的所有Symbol都不会被扰码,TS1OS和TS2OS的Symbol0不会被扰码,Symbol 1~13会被扰码,而Symbol 14~15是否被扰码取决于扰码器判断扰码或者不扰码,谁更有利于直流均衡。

注:原文最早发表于本人的ChinaAET博客(http://blog.chinaaet.com/justlxy/

### 128b/130b 编码在数据传输中的实现与解释 #### 背景概述 128b/130b 编码是一种高效的数据编码方案,广泛应用于 PCIe Gen3 及更高版本中。该编码方法旨在提高信道利用率的同时减少误码率,并提供同步机制以支持高可靠性的数据传输[^1]。 --- #### 基本原理 128b/130b 编码的核心思想是在每 128 位有效数据的基础上增加额外的 2 位开销,形成一个完整的 130编码单元。这两位主要用于控制信息和同步功能。相比传统的 NRZI 编码或其他低效编码方式,128b/130b 显著提高了带宽效率,其理论效率可达约 **98.46% (128 / 130)**。 具体而言: - 数据被分割成固定长度的 128 位块。 - 每个 128 位块附加两个控制比特,构成最终的 130编码单元。 - 控制比特的作用包括但不限于帧同步、错误检测以及特殊命令序列(如 SKP Ordered Set 和 EIEOSQ 的定义)[^3]。 --- #### 同步头与合规性模式 为了确保接收端能够正确解码发送的数据流,PCIe 协议引入了特定的同步头和合规性模式: 1. **同步头(Sync Header)** - 同步头由固定的 `01` 组合组成,位于每个 128b/130b 编码单元的起始位置。 - 它的主要作用是标记数据包的起点,便于接收方快速定位并解析后续的有效载荷[^2]。 2. **合规性模式(Compliance Pattern)** - 合规性模式通常用于测试链路性能或验证硬件设计是否满足协议规范。 - 在非 SRIS 模式下,修改后的合规性模式可能包含多达 65792 或 65793 个数据块,其中包括 EIEOSQ 序列、加扰的空闲符号以及 SKP Ordered Sets[^4]。 以下是合规性模式的一个典型结构示例: ```plaintext EIEOSQ -> {Idle Symbols} * 256 -> SKP Ordered Set -> {Idle Symbols} * 256 ... ``` --- #### 特殊有序集合(Ordered Sets) 除了常规的数据传输外,128b/130b 编码还定义了几种特殊的有序集合来辅助链路管理: 1. **SKP Ordered Set** - 主要用于链路同步和错误保护。 - 高速场景下,控制型 SKP Ordered Set 提供更强健的纠错能力,进一步提升系统的鲁棒性和可靠性。 2. **EIEOSQ** - 表示空闲状态结束,标志着新数据流即将开始。 - 此信号对于区分正常工作阶段与空闲阶段至关重要。 --- #### 实现细节 在实际应用中,128b/130b 编码可以通过以下步骤完成: 1. 将输入数据划分为大小为 128 位的分组。 2. 对每个分组附加必要的控制比特,构建完整的 130编码单元。 3. 使用物理层电路对生成的编码单元进行串行化处理,并通过差分信道发送给目标设备。 4. 接收端执行逆过程:先恢复原始的 128 位数据,再移除多余的控制比特。 下面展示了一个简单的伪代码实现框架: ```python def encode_128b_to_130b(data_block): """ 输入: 128-bit 数据块 输出: 130-bit 编码单元 """ sync_header = '01' # 添加同步头 control_bits = calculate_control_bits(data_block) # 计算控制比特 encoded_data = data_block + control_bits return f"{sync_header}{encoded_data}" def decode_130b_to_128b(encoded_unit): """ 输入: 130-bit 编码单元 输出: 解码后的 128-bit 数据块 """ decoded_data = remove_sync_and_control_bits(encoded_unit) return decoded_data ``` 上述函数仅作为概念演示,在真实环境中还需要考虑更多因素,例如加扰算法的应用和错误校验逻辑的设计。 --- #### 总结 综上所述,128b/130b 编码不仅提升了数据传输效率,还在同步管理和错误防护方面发挥了重要作用。它通过对每一组数据添加少量冗余信息的方式实现了高度可靠的通信效果,成为现代高速接口不可或缺的一部分[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值