PCIe 总线的“序”一般指的是数据传输的顺序保证(ordering)。在 PCIe 协议中,这一部分称为 Transaction Ordering Rules(事务排序规则)。
🚦 一、PCIe 是否“有序”?
PCIe 并不是完全有序(strict ordering),但它提供了一种 可控、可配置的部分顺序保证机制,从而平衡性能与一致性。
- 有的事务类型必须严格顺序(如配置空间访问、同步 IO);
- 有的事务可以乱序发送再重排,提高吞吐量(如大量写请求);
- 软件/设备可请求“Relaxed Ordering”来允许乱序。
📚 二、PCIe 的事务排序规则分类
排序类型 | 说明 |
---|---|
Posted(P) | 如 Memory Write,请求后无响应;默认允许乱序发送 |
Non-Posted(NP) | 如 Memory Read、IO Read,有响应的事务;必须有序 |
Completion(Cpl) | 对 NP 请求的响应,必须和请求匹配有序返回 |
🧩 三、Ordering 的三大机制
✅ 1. Relaxed Ordering (RO)
- 可由 TLP Header 中一个 bit 指定;
- 启用后,允许该请求乱序发送,也允许接收方乱序处理;
- 适用于如 DMA 大批量写入等场景,提高性能;
- RO 位由软件或设备设置。
✅ 2. ID-based Ordering
- 同一 Endpoint 的不同事务流之间是否需要维持顺序;
- 同一 ID(Function)必须保持 Cpl 顺序;
- 不同 ID 可以并发执行。
✅ 3. No Snoop
- 对于缓存一致性有关的访问;
- 标记该 TLP 不需要维持 CPU 的 cache coherence;
- 与 Ordering 配合用于优化 DMA 等传输。
📐 四、实际中几个典型 Ordering 场景
场景 | 是否有序 | 原因与规则 |
---|---|---|
配置空间访问(Config Read/Write) | 有序 | 确保设备初始化过程的正确性 |
连续的 Memory Write TLP | 无序 | 默认允许乱序,提高吞吐;可设置 RO 禁用乱序 |
Memory Read → Completion | 有序 | 请求与响应必须一一对应 |
Completion of same Tag | 有序 | 同一 Tag 的多个响应必须按请求顺序返回 |
Write → Read(到同一地址) | 有序 | 若未设置 RO,则 Read 必须等 Write 完成 |
🔩 五、排序控制字段(TLP Header)
TLP(Transaction Layer Packet)头部中有如下控制位:
Attr[1]
:Relaxed Ordering EnableAttr[0]
:No Snoop EnableTD
、EP
:与错误检测有关,影响强一致性时序
开发中若设置了 Relaxed Ordering Enable
,TLP 可以乱序传输。
✅ 总结一句话:
PCIe 总线的“序”是指其可控的事务顺序模型:在保持必要一致性的前提下,允许使用 Relaxed Ordering 和 No Snoop 等机制来打破顺序、提高并行性与吞吐性能。