一、核心背景: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)」,避免事务混乱,尤其在多事务并行时必不可少。


sudo lspci -vvv -d:10ee:9037 查看dev ctrl
二、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)的明确说明
-
PCIe 集成块的 “请求方” 会维护一个「Split Completion Table(拆分完成表)」,专门存储未完成的 Non-Posted 事务(如内存读、配置读写等)状态; -
该表的硬件容量仅为 64 个 Non-Posted 事务,且返回的完成包(Completion)是通过「6bit TAG」与请求匹配的( 2^6=64)—— 直接证明硬件层面只能支持 64 个并行事务,与 8bit TAG 的 256 个理论值矛盾。


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

四、Device Control寄存器字段说明
-
Bit0:Correctable Error Reporting Enable,该位可读写,复位值为 0。当此位为 1 时,PCIe 设备可以发出 ERR_COR Messages 报文;为 0 时不支持。
-
Bit1:Non-Fatal Error Reporting Enable,该位可读写,复位值为 0。当此位为 1 时,PCIe 设备可以发出 ERR_NON-FATAL Messages 报文;为 0 时不支持。
-
Bit2:Fatal Error Reporting Enable,该位可读写,复位值为 0。当此位为 1 时,PCIe 设备可以发出 ERR_FATAL Messages 报文;为 0 时不支持。
-
Bit3:Unsupported Request Reporting Enable,该位可读写,复位值为 0。当此位为 1 时,PCIe 设备可以发出 Unsupported Requests Error Messages 报文;为 0 时不支持。
-
Bit4:Enable Relaxed Ordering,该位为 1 时,使能 Relaxed Order 模式,TLP 的 Attr 字段可设为 Relaxed Ordering;为 0 时不可设。复位值为 1,可读写。
-
Bit5-7:Max_Payload_Size,可读写,根据 Device Capability 寄存器 Bit [2:0] 设置 TLP 最大 Payload。系统软件确认值,不可大于 “Max_Payload_Size Supported” 字段。发送 TLP 时最大 Payload 不超过该值,接收时需处理小于该值的 TLP,大于则视为错误。
-
Bit8:Extended Tag Field Enable(核心关联选项),该位为 1 时,发送端可使用 8 位 Tag 字段;为 0 时使用 5 位 Tag 字段。复位值为 1,可读写。
-
Bit9:Phantom Functions Enable,该位为 1 时使能 Phantom Function 功能;为 0 时不使能。复位值为 0,可读写。
-
Bit10:Auxiliary (AUX) Power PM Enable,该位为 1 时,PCIe 设备可使用总线提供的辅助电源。
五、术语补充
-
Non-Posted事务:PCIe 总线中需要 “请求 - 应答” 的事务(如读操作、配置操作),必须等待目标返回完成包才算结束,需要 TAG 号匹配;
-
Split Completion Table:硬件层面存储 “未完成请求状态” 的表格,容量决定了最大并行事务数;
-
DMA:直接内存访问,常用于高速数据传输(如网卡、存储设备),此时会产生大量并行 PCIe 事务,容易触发 TAG 号超量的 BUG。
六、使用建议
-
严格限制:无论是否勾选「Extended Tag Field」选项,实际设计中都要将并行 PCIe 事务数(即 TAG 号使用量)严格限制在 64 个以内。 -
规避场景:避免设计 “超过 64 个并行 Non-Posted 事务” 的场景(如超长 DMA 传输、多端口高速并发访问),否则会导致 PCIe 链路卡死; -
代码参考:参考开源项目 Corundum 的做法,在代码中直接将 TAG 相关参数(如PCIE_TAG_COUNT)设为 64,从设计层面规避风险。