068、PCIE标签(Tag)与事务ID:那些年我们追丢的TLP
从一次深夜调试说起
上个月帮同事看一个诡异的PCIE问题:DMA传输偶尔丢包,概率大概万分之三。逻辑分析仪抓到的TLP序列一切正常,但设备端就是偶尔收不到某个内存写请求。熬到凌晨三点,突然注意到一个细节——两个不同方向的TLP,它们的Transaction ID居然重复了。就是它!硬件工程师一拍大腿:“这Tag位宽配置错了!”
这就是今天要聊的PCIE标签(Tag)和事务ID(Transaction ID)。很多工程师第一次接触时觉得这就是个“流水号”,直到在实际系统中踩了坑,才明白这小小的字段里藏着多少门道。
事务ID:TLP的“身份证”
每个Non-Posted TLP(比如Mem Read、IO Write、Config Write)都需要一个事务ID。它由三部分组成:
- Requester ID:发起者的Bus/Device/Function号,硬件自动填充
- Tag:请求者自己分配的编号,软件可参与管理
- TC(Traffic Class):流量类别,影响路由和QoS
重点在Tag字段。对于Endpoint来说,Tag位宽由Device Control Register的Max_Payload_Size字段决定吗?错!这是个经典误解。实际是M