3. PCIe 事务层协议:Memory Read/Write TLP 格式、Completion 与 Non-Posted 事务、Max Payload Size (MPS) 对延迟的影响
事务层(Transaction Layer)是 PCIe 协议栈的最顶层,负责生成与解析事务层包(TLP)。对于 DMA 传输而言,Memory Read 与 Memory Write 是最核心的两种事务类型。本章将深入解析 TLP 的字段结构、Non-Posted 与 Posted 事务的差异,以及 Max Payload Size(MPS)如何直接影响传输延迟。
3.1 Memory Read TLP 格式与字段解析
Memory Read TLP 用于从目标设备(如 Endpoint 或 RC)的指定地址空间读取数据。其格式包含一个 12 字节或 16 字节的头部(Header),紧随其后的是可选的 TLP Digest(ECRC)。
| 字段 | 位宽 | 描述 |
|---|---|---|
| Fmt / Type | 7:0 | 格式与类型:Memory Read 为 0000_0000b(3DW Header, no data)或 0010_0000b(4DW Header, no data) |
| TC | 2:0 | Traffic Class:用于 QoS 区分,默认 0 |
| TD | 1 bit | TLP Digest 存在标志:1 表示尾部有 ECRC |
| EP | 1 bit | 中毒标志(Poisoned):指示数据已损坏 |
| Attr | 2 bits | 属性:顺序模型、No Snoop、Relaxed Ordering |
| Length | 9:0 | 数据载荷长度,单位 DWord(4 字节),最大 1024 DWord |
| Requester ID | 15:0 | 请求者 Bus/Device/Function 编号 |
| Tag | 7:0 | 事务标签,用于匹配 Completion |
| Address | 32 / 64 bit | 目标地址(3DW 为 32 位,4DW 为 64 位) |
3.2 Memory Write TLP 格式与 Posted 事务特性
Memory Write TLP 用于向目标地址写入数据。与 Read 不同,Write 属于 Posted 事务:发送端发出 TLP 后无需等待 Completion,直接释放资源。这使得 Write 具有更低的延迟和更高的吞吐量,但也带来了可靠性风险——发送端无法直接得知写入是否成功。
| 特性 | Memory Write (Posted) | Memory Read (Non-Posted) |
|---|---|---|
| 是否需要 Completion | 否 | 是(必须返回 CplD) |
| 延迟特性 | 低(无等待) | 高(需往返) |
| 数据流方向 | 请求者 → 目标 | 请求者 ← 目标(通过 CplD) |
| 错误报告机制 | 通过 AER 或 Poisoned 位 | 通过 Completion 状态 |
| 典型应用 | DMA 写、寄存器写 | DMA 读、配置空间读 |
3.3 Completion 事务:Cpl 与 CplD
Completion 是 Non-Posted 事务的响应。对于 Memory Read,目标设备必须返回 Completion with Data (CplD)。Completion 头部包含与请求对应的 Requester ID 和 Tag,以及完成状态(Successful Completion / Unsupported Request / Completer Abort 等)。
- Cpl(Completion without Data): 用于 I/O 或 Configuration 写完成,不携带数据。
- CplD(Completion with Data): 用于 Memory Read 完成,携带请求的数据载荷。
- Split Completion: 当目标无法立即响应时,可先返回 Cpl(状态为“成功”但无数据),稍后再发送 CplD。此机制在复杂系统中会增加延迟不确定性。
3.4 Max Payload Size (MPS) 对延迟的影响
MPS 是 PCIe 链路层协商的参数,定义了单个 TLP 能携带的最大数据载荷(以字节为单位)。常见 MPS 值为 128 B、256 B、512 B、1024 B、2048 B、4096 B。MPS 对 DMA 传输延迟有显著影响:
| MPS 值 | 单 TLP 最大数据 | 延迟特性 | 适用场景 |
|---|---|---|---|
| 128 B | 128 字节 | 低延迟(小包快速发出) | 控制寄存器、小数据块 |
| 256 B | 256 字节 | 中等延迟 | 通用 DMA |
| 512 B | 512 字节 | 较高延迟(需等待数据填满) | 大数据流、视频传输 |
| 1024 B | 1024 字节 | 高延迟(首字节延迟增加) | 高性能计算、批量数据 |
| 2048 B / 4096 B | 2048 / 4096 字节 | 最高延迟(需大缓冲区) | NVMe、GPU 通信 |
MPS 对延迟的影响机制:
- 首字节延迟(First Byte Latency): 发送端必须等待数据累积到 MPS 大小才能封装 TLP。MPS 越大,首字节等待时间越长。
- 链路利用率: 大 MPS 减少 TLP 头部开销(每 TLP 固定 12~16 字节头部),提升有效带宽,但牺牲单次延迟。
- 流控信用量: 大 MPS 需要更多的接收端缓冲区信用量。如果信用量不足,发送端会被迫等待,增加延迟。
3.5 事务层协议对 DMA 延迟的综合影响
综合来看,事务层的三个关键因素共同决定了 DMA 传输的延迟特性:
- 事务类型: Memory Write(Posted)延迟低于 Memory Read(Non-Posted),因为后者需要等待 Completion 往返。
- TLP 头部开销: 每 TLP 固定 12~16 字节头部,小数据包时开销占比高,降低有效带宽。
- MPS 与数据对齐: MPS 越大,单 TLP 承载数据越多,但首字节延迟增加。数据地址未对齐时,可能触发额外的 TLP 拆分,进一步增加延迟。