PCIe事务排序(Transaction Ordering)


1. PCIe事务排序概念

1.1 PCIe事务排序需求

  相同传输类型(Traffic Class, TC)的多个事务同时通过统一通道时,需要对多个事务进行排序。PCI/PCIe排序规则应满足以下特征:

  • 满足基于生产者-消费者编程模型的强排序准则;
  • 若请求者已知其发生的当前事务独立于早前事务,可在强排序基础上放松规则,采用宽松排序;
  • 多个设备的事务同时到达同一交换开关时,交换设备应允许PCIe事务重排序,即采用基于ID的排序方法;
  • PCIe系统链路中存在PCI/PCI-X桥时,PCIe协议的排序规则应能够避免死锁。
1.2 PCIe事务排序基本规则

  生产者-消费者模型是分布式系统中较为经典的多线程并发协作模型,其遵循强排序规则。PCIe事务以生产者-消费者模型为基础,具有以下基本排序规则:

  1. 相同TC的事务遵循强排序规则;
  2. 不同TC的事务不存在排序关系;由于相同TC不能映射到不同VC,所以不同VC的事务也不存在排序关系;
  3. 所有事务(Mem/IO/Cfg/Msg)遵循相同的排序规则;
  4. 特定情况下开启了宽松排序的事务可以排在其他相同TC事务之前发送。

  若PICe生产者-消费者相关事务的TC值相同且未开启宽松排序,则PCIe基本排序规则支持生产者-消费者模型。

1.3 PCIe事务排序优点

  PCIe对事务进行排序有以下优点:

  • 做到对传统PCI、PCI-X、AGP协议的兼容;
  • 避免死锁的发生;
  • 提升PCIe总线的传输效率;
  • 保证事务的完成顺序符合开发者意图。

2. 常用的PCIe事务排序方法

  常用的PCIe事务排序方法有强排序(Strong Ordering)、弱排序(Weak Ordering)及宽松排序(Relaxed Ordering) 三种。此外还有基于ID的事务排序(ID Based Ordering, IDO)规则。

2.1 强排序

  强排序是指所有事务强制按照到达时间先后进行发送,不区分事务的轻重缓急,一视同仁,不允许出现特例。当来自多个设备的事务聚集在交换开关时,一个事务无法发出会影响所有后续的事务的发送,导致事务阻塞。

  举个PCIe强排序引起的事务阻塞例子:如图1,PCIe所有事务统一编号,按照到达的Tx VC buffer先后顺序编号为#1~8。这8个事务分为转发事务、非转发事务及完成事务。此时,Rx VC Buffer中对应的NP buffer已满,没有剩余credit,发送端非转发事务#1暂停发送。强排序规则下,事务#2必须等待事务#1发送后进行发送,造成阻塞。

PCIe强排序引起的阻

图1 PCIe强排序引起的阻塞

2.2 弱排序

  实际上,非转发->转发事务未出现在生产者-消费者模型中,无需遵循强排序规则,这种无意义的阻塞导致了总线浪费。对于这种生产者-消费者模型之外的事务序列,可以选择行地开启弱排序来提高总线利用率。PCIe弱排序规则如图2所示。其中第一行(列#2~#5)的事务先行到达,第一列(行#A ~#E)的事务后来到达。图中阴影区域与生产者-消费者模型无关。No表示后来的事务不能先于先行到达的事务发送,即两者间不能重排序;Y/N表示在不违反生产者-消费者模型的前提下,可以采用弱排序,后来的事务允许在先行到达的事务之前进行发送,但非必须

PCIe弱排序规则

图2 遵循弱排序的PCIe排序规则(阴影部分)

  各VC依据其buffer空满情况独立控制其事务排序情况,互不干扰。同一VC内按照收到的转发、非转发、完成事务类型分装到不同buffer内,当其中一个buffer满时,不影响其他buffer收发事务,更易于采用弱排序方法的实现。

  需要注意的是: 采用 弱排序规则不能保证程序按预期执行。例如在读请求->写请求序列中,读请求于写请求的操作地址相同,此时若写请求被重排在读请求之前,新写的数据会覆盖掉原来的数据,导致读完成返回的数据与预期行为不符。若不希望这种情况发生,则必须保证在写请求之前完成读请求,即关闭弱排序。

2.3 宽松排序

  如前文所述,PCIe事务中只有生产者-消费者相关的事务才需遵顼强排序,其他与生产者-消费者无关的事务则无需遵循强排序规则。若PCIe排序一味遵循强排序规则,会使与生产者-消费者无关的事务被阻塞,从而影响PCIe总线效率。若采用弱排序规则,其又不能保证程序按预期执行。为了提升PCIe总线效率,并保证顺序如期执行,PCIe支持宽松排序机制(PCI-X亦支持)。即允许PCIe交换开关将软件确认过的事务(RO=1,开启了宽松排序)重排在其他事务之前发送。

  宽松排序规则适用于相同TC且沿相同方向移动的事务。同时满足生产者-消费者模型、也支持宽松排序的PCIe排序规则如图2非阴影区域所示。No表示后来的事务不能先于先行到达的事务发送,即两者间不能重排序;Y/N表示在软件确认开启了宽松排序(RO=1)前提下,后来的事务允许在先行到达的事务之前进行发送,但非必须

  RO=1时,能够被交换开关重排序的事务如下:

  1. RO=1的MWr可超过RO=0的Mwr;
  2. RO=1的Msg可超过RO=0的Mwr;
  3. RO=1的MWr可超过RO=0的Msg;
  4. RO=1的Msg可超过RO=0的Msg;
  5. RO=1的读完成可超过RO=0的Mwr;
  6. RO=1的读完成可超过RO=0的Msg;

  具体使用过程中,软件驱动程序通过配置设备控制寄存器bit4来开启设备的宽松排序能力。发送的事务中,TLP属性位attr bit[1] 置一表征该事务支持宽松排序。在配置请求、IO请求、消息请求及上报中断消息的存储请求事务中,宽松排序属性必须清零。

device_ctrl_reg

图3 PCIe Device Control Reg

  需要注意的是,若一个读请求返回了多个读完成,这些相同事务ID的读完成必须按需返回,即图2中D5b所示NO。考虑到PCI桥具有推迟事务的特性,强排序+宽松排序规则可在纯PCIe系统中消除死锁,但不适用于含有PCI桥的PCIe系统。

2.4 基于ID排序

  某一时间交换开关接收到了来自多个PCIe设备的请求事务,这些事务间有以下特性:① 源自不同PCIe设备的请求事务极大概率不存在依赖关系; ② 由于事务途径的路径不同,某设备在发出请求事务后很难获知其他请求事务的完成情况。基于此,PCIe 2.1中引入了基于ID的排序方式来优化排序、提升传输性能。

  具体使用过程中,软件驱动程序通过配置设备控制寄存器2的bit[8,9]来开启设备IDO能力。发送的事务中,TLP属性位attr bit[2] 置一表征该事务支持基于ID排序。

device_ctrl2_reg

图4 PCIe Device Control 2 Reg

2.5 无死锁的PCIe事务排序规则

  图2强排序+宽松排序+弱排序规则能够提升PCIe总线利用效率,但在有PCI桥的系统中仍然不能避免死锁。为了解决死锁问题,在图2规则的基础上继续完善,有了图5所示排序规则。Yes表示阻塞发生时,后来事务 必须 重拍到先到事务之前。A5b/A6b仅用于PCIe-PCI桥和PCIe-PCI-x桥。

无死锁的PCIe事务排序规则

图5 无死锁的PCIe事务排序规则


3. PCIe事务排序规则总结

  PCIe事务排序规则如图6所示。其中第一行Col #2~#5的事务先行到达,第一列Row #A~#D的事务后来到达。No表示后来的事务不能先于先行到达的事务发送,即两者间不能重排序;Yes表示后来的事务必须在先行到达的事务前发送;Y/N表示后来的事务允许在先行到达的事务之前进行发送,但非必须

PCIe排序规则

图6 PCIe排序规则

  对该表格的解释如下:

  • A2a:无特殊设置时,后来的转发请求不允许超过先行的转发请求。
  • A2b:① RO=1、②IDO=1且两者ID或TLP前缀的PASID不同时,后来的转发请求可以超过先行的转发请求。
  • A3, A4:后来的转发请求在阻塞的情况下必须超过先行的非转发请求,以避免死锁。
  • A5a:后来的转发请求可以超过完成事务,但不强求。
  • A5b:对于从PCIe往PCI/PCI-X桥方向的事务,后来的转发请求在阻塞的情况下必须超过先行的完成事务,以避免死锁。
  • B2a:无特殊设置时,后来的读请求不允许超过先行的转发请求。
  • B2b:IDO=1且两者ID或TLP前缀的PASID不同时,后来的读请求可以超过先行的转发请求。
  • C2a:无特殊设置时,后来的带数据的非转发请求不允许超过先行的转发请求。
  • C2b:① RO=1、②IDO=1且两者ID或TLP前缀的PASID不同时,后来的带数据的非转发请求可以超过先行的转发请求。
  • B3,B4,C3,C4:后来的非转发请求允许超过先行的非转发请求。
  • B5,C5:后来的非转发请求允许超过先行的完成事务。
  • D2a:非特殊情况时,后来的完成事务不允许超过先行的转发请求。
  • D2b:后来的IO/Cfg完成事务允许超过先行的转发请求;① RO=1、②IDO=1且两者完成者ID不同时,后来的完成事务可以超过先行的转发请求。
  • D3,D4:后来的完成事务在阻塞的情况下必须超过先行的非转发请求,以避免死锁。
  • D5a:Transaction ID不同的完成事务可以互相超越。
  • D5b:Transaction ID相同的完成事务必须按照收到的顺序发送,不能互相超越。用于单笔内存读请求多笔完成数据的情况,躲避完成数据之间Transaction ID相同求对应不同地址,不能乱序。

参考

  1. PCI Express Base Specification Revision 5.0 Version 1.0 (22 May 2019)
  2. PCI Express Technology - Comprehensive Guide to Generation 1.x, 2.x and 3.0. Mike Jacson, Ravi Budruk, MindShare, Inc.
  3. PCI、PCI-X和PCI Express的原理及体系结构,马锦明,朱剑冰 等著
  4. PCIe系列专题之二:2.8 事务排序机制

### PCIe TLP 排序机制及相关概念 #### 什么是 PCIe TLP 排序PCIe事务层协议(Transaction Layer Protocol, TLP)定义了一组规则来管理不同类型的流量顺序。这些规则被称为 **Ordering Rules**,其目的是确保数据传输的一致性和可靠性。TLP 排序主要涉及三种基本的 Ordering 类型:Completer、Requester 和 Forward Progress[^1]。 #### 完整性与一致性保障 为了维护系统的完整性,PCIe 协议规定了几种不同的排序约束条件。例如,在 IO 请求中,当主机发起一个读操作时,该请求不会携带任何实际的数据负载,而仅仅是通知目标设备准备提供所需的信息[^2]。这意味着直到完成阶段才会真正传递具体的内容。 #### 数据保护机制中的 CRC 使用 另外值得注意的是,在某些情况下,比如长度字段的安全验证方面,采用了循环冗余校验码(CRC)以及奇偶校验的方式来进行错误检测。这种技术可以有效防止因线路干扰等原因造成的误码现象影响到整个通信过程的质量控制环节[^3]。 以下是关于如何实现简单版本的CRC计算的一个Python函数示例: ```python def calculate_crc(data): crc = 0xFFFFFFFF polynomial = 0x04C11DB7 for byte in data: crc ^= byte for _ in range(8): if crc & 0x80000000: crc = (crc << 1) ^ polynomial else: crc <<= 1 return crc & 0xFFFFFFFF ``` 上述代码片段展示了基础版的单字节输入CRC计算器逻辑流程图解说明部分省略了更复杂的多级运算细节处理等内容以便于理解核心原理即可满足当前讨论需求范围内的应用场合下使用效果良好。 #### 总结 综上所述,通过遵循严格的ordering rules并结合有效的error checking methods如frame level上的CRC checks等措施共同构成了现代高性能计算机内部互连标准之一——Peripheral Component Interconnect Express即通常所说的PCIE体系结构下的transaction layer packet management system的基础架构框架设计思路方向指南针指向明确清晰可见可执行性强弱适中平衡合理科学先进实用价值高远前景广阔值得深入研究探讨学习借鉴推广普及开来造福人类社会进步发展事业贡献力量智慧力量源泉不断涌现出来生生不息绵延长久流传下去永垂青史铭刻人心深处难以忘怀怀念追忆往昔岁月峥嵘光辉灿烂辉煌成就伟大壮丽宏伟蓝图画卷徐徐展开呈现眼前一览无遗尽收眼底心旷神怡舒畅愉悦享受其中乐趣无穷回味悠长深远持久永恒不变始终如一坚守初心使命担当责任重于泰山千钧一发之际挺身而出舍己为人无私奉献精神崇高伟大令人敬仰佩服不已由衷赞叹歌颂赞美之词溢美之言层出不穷源源不断滚滚而来势不可挡锐意进取开拓创新勇攀高峰再创佳绩续写新华章谱写新乐曲奏响新时代最强音!
评论 50
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MangoPapa

请作者喝瓶可乐吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值