PCIe DMA延迟分析与工程部署参数调试 - 第1节

1.1 PCIe 拓扑结构:点对点与层次化互连

PCI Express (PCIe) 采用 点对点串行互连 架构,替代了传统 PCI 的共享并行总线。每个设备通过独立的 链路 (Link) 与交换器 (Switch) 或根复合体 (Root Complex) 直接连接,从根本上消除了总线争用,提升了可扩展性和带宽。

1.1.1 拓扑核心组件

组件角色与说明
Root Complex (RC)连接 CPU/内存与 PCIe 域,生成配置/IO/内存请求,通常集成在 SoC 或芯片组中。
Switch由上游端口 (Upstream Port) 和多个下游端口 (Downstream Port) 组成,负责数据包路由与转发,扩展设备数量。
Endpoint (EP)功能设备,如 GPU、NVMe SSD、FPGA 加速卡、网卡。分为单功能 (Single-Function) 和多功能 (Multi-Function)。
PCIe Bridge用于桥接 PCIe 与其它总线 (如 PCI/PCI-X),实现协议转换。

1.1.2 拓扑结构示意图

PCIe 典型拓扑结构 CPU / 内存 Root Complex (RC) Switch 下游端口 A 下游端口 B Endpoint (FPGA) Endpoint (NVMe) Endpoint (GPU) Endpoint (NIC) 💡 拓扑要点: Switch 内部不缓存数据,仅根据路由表转发 TLP;每个链路独立协商速率和宽度,支持热插拔。
工程提示: 在 FPGA DMA 设计中,Endpoint 通常作为 RC 或 EP 角色出现。作为 EP 时,FPGA 通过 BAR (Base Address Register) 空间与 RC 交换控制信息,通过 DMA 引擎直接读写主机内存。

1.2 分层协议:事务层、数据链路层、物理层

PCIe 协议栈采用 分层架构,从高到低依次为:事务层 (Transaction Layer)、数据链路层 (Data Link Layer)、物理层 (Physical Layer)。每一层对上层提供服务,对下层封装数据,形成严格的 分层解耦 设计。

1.2.1 分层协议栈结构

PCIe 分层协议栈 事务层 (Transaction Layer) 数据链路层 (Data Link Layer) 物理层 (Physical Layer) TLP DLLP PLP 📌 分层职责: • 事务层:组装/解析 TLP,处理事务排序、流量控制、虚拟通道。 • 数据链路层:TLP 封装 DLLP,提供 CRC 校验、ACK/NAK 重传、链路管理。 • 物理层:串行/解串、8b/10b 或 128b/130b 编码、电气特性、链路训练。

1.2.2 各层核心功能对比

层次核心功能数据单元关键机制
事务层事务发起/完成、地址翻译、BAR 匹配、中断生成 (MSI/MSI-X)TLP (Transaction Layer Packet)流量控制 (Flow Control)、虚拟通道 (VC)、事务排序
数据链路层TLP 封装/解封装、CRC 生成/校验、重传管理DLLP (Data Link Layer Packet)ACK/NAK 协议、LCRC、序列号
物理层串行化/解串、编码/解码、链路训练、电气适配PLP (Physical Layer Packet)8b/10b (Gen1/2)、128b/130b (Gen3+)、链路状态机

1.3 TLP 与 DLLP 格式详解

1.3.1 TLP (事务层包) 格式

TLP 是 PCIe 事务层的基本数据单元,用于承载 内存读写、配置访问、IO 访问 和 消息。一个完整的 TLP 由 TLP 前缀 (可选)、TLP 头、数据负载 (可选) 和 TLP Digest (可选) 组成。

TLP 包格式 前缀 TLP 头 (12/16/20B) 数据负载 (0~4096B) Digest 🔍 TLP 头关键字段: Fmt (格式) / Type (类型) / TC (流量类别) / TD (Digest 存在) / EP (中毒位) / Attr (属性) / Length (数据负载长度) / Requester ID / Tag / Address 等。

1.3.2 常见 TLP 类型

TLP 类型Fmt/Type 编码用途数据负载
MRd (Memory Read)00000 / 00001读取主机内存或设备 BAR 空间无 (Completion 返回数据)
MWr (Memory Write)10000 / 10001写入主机内存或设备 BAR 空间有 (写入数据)
Cpl (Completion)01010返回读数据或写完成状态有 (读返回数据)
CplD (Completion with Data)01010带数据的完成包有
Msg (Message)10010 / 10110中断 (MSI/MSI-X)、错误报告、电源管理无
Config Rd/Wr00100 / 10100配置空间访问 (枚举阶段)无/有

1.3.3 DLLP (数据链路层包) 格式

DLLP 用于 数据链路层管理,不包含事务数据。主要功能包括:ACK/NAK 确认、流量控制信用通告、电源管理状态切换。DLLP 固定为 6 字节:1 字节类型 + 3 字节数据 + 2 字节 CRC。

DLLP 包格式 类型 (1B) 数据 (3B) CRC (2B) DLLP 类型:ACK / NAK / InitFC1 / InitFC2 / UpdateFC / PM_* 等。

1.3.4 TLP 与 DLLP 的交互流程

TLP 与 DLLP 交互流程 发送端 事务层 发送端 数据链路层 发送端 物理层 接收端 事务层 接收端 数据链路层 接收端 物理层 TLP TLP + 序列号 + LCRC DLLP (ACK/NAK) 流程:发送端事务层生成 TLP → 数据链路层添加序列号和 LCRC → 物理层串行发送 → 接收端物理层接收 → 数据链路层校验 CRC,发送 ACK/NAK DLLP → 事务层解析 TLP。
🎯 延迟分析关键点: TLP 在数据链路层等待 ACK 确认后才能释放重传缓冲区,这直接影响了 写延迟 和 吞吐量。在 FPGA DMA 设计中,合理配置 重传缓冲区深度 和 ACK 延迟定时器 是降低延迟的重要手段。

1.4 本章小结

  • 拓扑结构:PCIe 采用 RC → Switch → EP 的点对点树形拓扑,每个链路独立工作,支持多级扩展。
  • 分层协议:事务层负责 TLP 组装与事务管理;数据链路层提供可靠传输 (CRC + ACK/NAK);物理层负责串行通信与链路训练。
  • TLP 格式:包含前缀 (可选)、头 (12/16/20B)、数据负载 (0~4096B)、Digest (可选)。头中的 Fmt/Type、TC、Tag、Address 等字段决定了事务行为。
  • DLLP 格式:固定 6 字节,用于链路管理 (ACK/NAK、流量控制、电源管理),不携带用户数据。
  • 工程关联:理解 TLP/DLLP 交互流程是分析 PCIe DMA 延迟的基础,后续章节将深入探讨如何通过调整事务层参数优化延迟。