✅ 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。