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 通用格式(3 DW Header + Data Payload) TLP 前缀 (可选) DW0 Fmt/Type TC/Attr Length (Req ID等) DW1 地址[63:32] 或 Tag/Last DW BE DW2 地址[31:02] 或 Req ID/Tag Data Payload 0 ~ 4096 字节 (4 DW 对齐) TLP 头固定为 3 DW 或 4 DW;数据载荷长度由 Length 字段指定,单位为 DW。

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 字段匹配。
Memory Read 请求与 Completion 交互流程 请求者 (DMA 引擎 / EP) 目标 (主机内存 / RC) ① Memory Read TLP (MRd) 地址、Length、Tag ② Completion TLP (CplD) 携带请求的数据、相同的 Tag 关键规则 • 每个 MRd 必须对应一个 Cpl 或 CplD,Tag 用于匹配请求与完成。 • CplD 可以拆分返回(Split Completion),但必须保证数据顺序和完整性。

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 发送将被阻塞,直接导致吞吐量下降。
流量控制信用机制示意 发送方 (DMA 引擎) 信用余额: 8 接收方 (RC / EP) 信用上限: 16 发送 TLP(消耗 1 个信用) 信用更新(DLLP) 当发送方信用不足时,TLP 发送暂停,直到接收方通过数据链路层包(DLLP)返回新的信用。