3. PCIe 事务层协议:TLP 格式、Memory Read/Write TLP、Completion TLP
事务层(Transaction Layer)是 PCIe 分层架构中最上层、也是最接近软件的一层。它负责将来自设备核心或驱动程序的读写请求,封装成标准化的事务层包(TLP,Transaction Layer Packet),并通过数据链路层和物理层发送到对端设备。对于 DMA 性能优化而言,理解 TLP 的格式、类型以及传输规则,是分析吞吐量瓶颈和延迟来源的基础。
核心要点:TLP 是 PCIe 通信的基本单元。一次 DMA 传输可能被拆分为多个 TLP,TLP 的有效载荷大小、对齐方式以及完成(Completion)的返回效率,直接决定了 DMA 的实际带宽和延迟。
3.1 TLP 基本格式
每个 TLP 由三部分组成:TLP 前缀(可选)、TLP 头(Header) 和 数据有效载荷(Data Payload,可选)。TLP 头是固定格式,长度根据请求类型不同分为 3 DW(双字,12 字节)或 4 DW(16 字节)。
TLP 头中的关键字段包括:
- Fmt/Type:标识 TLP 的类型(Memory Read、Memory Write、Completion 等)以及头长度。
- Length:数据有效载荷的长度,以 DW(4 字节)为单位。最大为 1024 DW(即 4096 字节)。
- Requester ID / Tag:用于唯一标识一个请求,Completion TLP 必须携带相同的 ID 和 Tag 以匹配对应的请求。
- Address:Memory 请求的目标地址(32 位或 64 位)。
- Last DW BE / First DW BE:字节使能(Byte Enable),用于控制对部分字节的读写。
3.2 Memory Read TLP 与 Memory Write TLP
在 DMA 场景中,Memory Read TLP(MRd) 和 Memory Write TLP(MWr) 是最核心的两种请求类型。它们用于在主机内存和设备本地内存之间搬运数据。
| 特性 | Memory Read TLP (MRd) | Memory Write TLP (MWr) |
|---|---|---|
| 方向 | 从目标(Target)读取数据到请求者(Requester) | 从请求者写入数据到目标 |
| 是否需要 Completion | 是,目标必须返回 Completion TLP(Cpl/CplD) | 否,写入完成即结束(Posted 事务) |
| 事务类型 | Non-Posted(非发布式) | Posted(发布式) |
| 对延迟的影响 | 高,需等待 Completion 返回 | 低,无需等待确认 |
| 典型 DMA 用途 | 设备从主机内存读取数据(如 GPU 读取输入数据) | 设备向主机内存写入数据(如网卡写入接收数据) |
性能提示:Memory Write 是 Posted 事务,不需要等待 Completion,因此写操作的吞吐量通常高于读操作。在 DMA 设计中,如果条件允许,优先使用写方向(Device → Host)来避免读延迟开销。
3.3 Completion TLP
Completion TLP(Cpl / CplD)是 Non-Posted 请求(如 Memory Read)的响应包。它由目标设备(通常是主机内存控制器或 RC)返回给请求者(如 DMA 引擎)。Completion TLP 分为两种:
- Cpl(不带数据):用于表示请求完成,但无数据返回(例如写请求的完成,或读请求出错时)。
- CplD(带数据):用于返回 Memory Read 请求所请求的数据。CplD 的数据载荷必须与对应的 MRd 请求的 Length 字段匹配。
3.4 TLP 与 DMA 性能的关键关系
在 DMA 吞吐量测试和延迟分析中,以下 TLP 层面的因素直接影响性能:
| 因素 | 说明 | 对性能的影响 |
|---|---|---|
| Max Payload Size (MPS) | 单个 TLP 允许的最大数据载荷,通常为 128/256/512 字节 | MPS 越大,TLP 头开销占比越小,吞吐量越高 |
| Read Completion Boundary (RCB) | RC 返回 Completion 时,数据拆分的边界大小(通常为 64 或 128 字节) | RCB 越小,Completion 拆分越细,延迟增加,吞吐量下降 |
| Tag 深度 | 请求者可同时发出的未完成 Non-Posted 请求数量 | Tag 深度越大,流水线越深,读延迟可被隐藏 |
| 地址对齐 | TLP 起始地址是否与 4 DW(16 字节)边界对齐 | 未对齐会导致 TLP 拆分,降低有效带宽 |
常见陷阱:许多 DMA 驱动在初始化时未正确配置 MPS 和 Tag 深度,导致实际吞吐量远低于 PCIe 链路理论带宽。在性能优化时,应首先检查这些 TLP 层参数是否已设置为硬件支持的最大值。
3.5 TLP 事务顺序与流量控制
PCIe 事务层还定义了严格的事务顺序规则(Ordering Rules) 和 流量控制(Flow Control) 机制:
- Posted 事务(MWr) 不能越过 Non-Posted 事务(MRd),但 Non-Posted 事务可以越过 Posted 事务(以降低读延迟)。
- 流量控制 使用信用(Credits)机制:接收方通告其缓冲区可用空间,发送方只有在拥有足够信用时才能发送对应类型的 TLP。如果信用不足,TLP 发送将被阻塞,直接导致吞吐量下降。