✅ PCIe 中的 CplD(Completion with Data)包 是什么?
CplD(Completion with Data) 是一种 PCIe 事务层包(TLP),用于 响应主机发起的 Memory Read Request 请求,并携带被读取的数据。
🧠 一句话解释:
CplD 是目标设备(如 FPGA)对主机内存读取请求的“应答数据包”,完成读取+返回数据的功能。
📦 举个例子说明:
Host 发起 Memory Read Request TLP:
→ 请求从 FPGA BAR 区读取某地址 64 字节
FPGA 接收到请求后,查地址 → 返回数据
→ 发出 CplD 包(Completion with Data)
🧱 CplD 是什么类型的 TLP?
PCIe 协议层 TLP 类型中:
TLP 类型编码(Type 字段)类型名称说明000_010 (0x0A)CplDCompletion with Data000_000 (0x0)Memory Read Request主机请求设备读取某地址000_001 (0x1)Memory Write主机往设备地址写数据000_010 (0xA)Completion(无数据)仅表示完成,无数据
📖 CplD 包含哪些字段?
TLP 包结构(简化)如下:
| TLP Header (3 DW) | Optional Header | Data Payload |
主要字段:
字段说明FMT/TypeType = 0xA 表示 CplDLength返回的数据字数(单位为 DW)Requester ID主机 ID,用于路由回传Tag与原 Memory Read Request 的 tag 匹配Byte Count返回数据的字节数Data Payload返回的数据内容
📌 什么时候会看到 CplD?
你使用 Wireshark + PCIe 插件、ILA + Xilinx PCIe Core,会在下列场景中看到:
主机 read(fd, buf, size),驱动构造 PCIe Read 请求FPGA 在 TLP 接收器收到 Read Request 后,构造 CplD TLP 发回主机
✅ 在你自己设计 PCIe DMA 引擎时的作用
操作所需 TLP主机写数据到 FPGAMemory Write TLP(Write Only)主机从 FPGA 读数据发起 Read Request → FPGA 回复 CplDFPGA 发起写 HostMemory Write(FPGA 作 requester)FPGA 发起读 HostMemory Read + Host 回复 CplD所以只要主机发出 Memory Read,你必须构造 CplD 包返回数据。
🚧 注意事项
项目说明Completion Timeout如果你不发 CplD,主机会超时报错Tag 匹配返回的 tag 必须与请求一致长度匹配Byte count 必须等于请求字节数(或者分段)
✅ 总结一句话:
CplD(Completion with Data)是 PCIe 中用于回应 Memory Read 请求的应答数据包,由被访问设备发出,包含请求的数据内容,是 PCIe 数据交互中不可缺的一类 TLP。