
一、核心背景:PCIe IP 核的「Extended Tag Field」选项
- 在 Vivado 工具中例化 Xilinx V7 系列的 PCIe Endpoint(EP)IP 核时,会遇到配置选项 「Extended Tag Field」(扩展标签字段),其作用与 TAG 号的位宽直接相关:
- 勾选该选项:IP 核会宣称支持「8bit 位宽的 TAG 字段」,理论上可同时处理 2^8=256个TAG号(对应 PCIe 设备空间寄存器中「Device Control 寄存器的 Bit8」被置 1,文档表 4-5 有明确定义);
- 不勾选该选项:默认使用「5bit 位宽的 TAG 字段」,理论支持
2^5=32个TAG号。未勾选:5bit TAG字段 → 理论支持32个TAG(默认)。- TAG 号的作用:PCIe 总线中关键的 “事务标识”—— 用于匹配「发起的请求(如内存读、I/O 读写)」和「目标返回的完成包(Completion)」,避免事务混乱,尤其在多事务并行时必不可少。
Vivado例化PCIe EP IP核时,有一个选项,如下:Extended Tag Field。

如果勾选上,那么TAG字段就是8bit位宽,支持256个TAG,如下图(参考一下IP核手册,PCIE的设备空间寄存器):

sudo lspci -vvv -d:10ee:9037 查看dev ctrl
如果在例化该IP核时,不小心勾选上Extended Tag Field了,那么就意味着使用的TAG字段为8bit位宽,支持256个TAG号,但实际上,690T FPGA根本不支持256个TAG号,实测结果表明,如果实际使用中超过了64个TAG号,PCIe就会卡死!(比如DMA一个很长的包时)。
也就是说,不论你是否勾选了Extended Tag Field,都是最多支持64个TAG号!(各位使用Xilinx V7系列FPGA PCIe IP核时一定要注意!!!)
二、BUG 的核心:理论支持 vs 硬件实际限制
- IP 核配置的 “理论能力”:勾选「Extended Tag Field」后,配置层面显示支持 256 个 TAG;
- 690T FPGA 的 “硬件实际能力”:实测证明,该 FPGA 的 PCIe 集成块(Integrated Block)根本不支持 256 个 TAG,最多只能稳定支持 64 个 TAG。
- 触发后果:如果实际使用中(比如 DMA 传输超长数据包时),并行的 PCIe 事务数超过 64 个(即 TAG 号使用量超 64),会直接导致 PCIe 总线卡死,整个 PCIe 链路无法正常工作。
- 关键结论:无论是否勾选「Extended Tag Field」选项,Xilinx V7 690T 的 PCIe IP 核实际最多只能支持 64 个 TAG 号—— 配置选项的 “256 个支持” 是 IP 核的 “纸面参数”,与硬件物理限制冲突。
三、支撑BUG的证据
1. 官方 IP 核手册(PG023)的明确说明
Xilinx 官方发布的《Gen3 Integrated Block for PCIe v4.3》手册(PG023)中 “Non-Posted 事务的 TAG 管理” 部分明确提到:
2^6=64)—— 直接证明硬件层面只能支持 64 个并行事务,与 8bit TAG 的 256 个理论值矛盾。
再翻译一下:

2. 开源项目 Corundum 的实际调试验证
Corundum 是一款开源网卡项目,其代码中针对 V7 系列 FPGA 的配置(如 NetFPGA_SUME 平台)明确写死:

这说明项目作者(Alex Forencich)在实际调试中已发现 V7 690T 的硬件限制,特意将 TAG 数量限制为 64,避免 PCIe 卡死。
四、Device Control寄存器字段说明
五、术语补充
六、使用建议
如果正在使用 Xilinx V7 系列 FPGA(尤其 690T 型号)的 PCIe EP IP 核,务必注意: