127、调试手记:为什么数据到了对端,CRC却对不上?
127、调试手记:为什么数据到了对端,CRC却对不上?最近在调试PCIE设备间的数据传输,遇到了一个诡异的问题:数据包明明成功到达对端设备,应用层却频繁报错。抓包分析发现TLP的LCRC校验全部通过,但上层业务数据就是有误。折腾了一下午,最后发现是ECRC配置出了问题——设备使能了ECRC生成,但接收端却没开启ECRC校验。今天我们就来聊聊PCIE里那些容易让人混淆的CRC机制。基础回顾:TLP里的三种CRC刚接触PCIE时,很多人只知道TLP有个LCRC(Link CRC),用于链路层校验。实际上在端到端的数据完整性保障中,还有两个更关键的CRC角色:ECRC(End-to-End CRC)和ACRC(Advanced CRC)。LCRC只管链路这一段是否出错,ECRC才负责从源头到终点的完整校验。LCRC由数据链路层自动添加和校验,硬件实现,对软件透明。它的问题是只能检测链路传输中的错误,如果错误发生在发送端组装TLP时,或者接收端处理TLP时,LCRC就无能为力了。这时候就需要端到端的保护。ECRC:端到端的守护者ECRC的“E”代表End-to-End,它的校验范围覆盖整个TLP头和数据 payload。关键点在于:ECRC由发送设备的PCIE事务层计算,跟随TLP一路穿越可能的交换设备(Switch),最终由接收设备的事务层校验。中间的任何交换设备都不会修改ECRC值(除非开启了ACRC,这个后面讲)。使能ECRC需要在设备控制寄存器中设置: