V6 GTX 在PCIE应用中的复位问题和解决方法
背景
在V6 PCIE GEN1 X4应用中,客户发现PCIE概率性地不能建链。在检查PCIE状态机,发现状态机停留在CONFIG.POLLING状态下。
检查GTX的状态,每路都没有8B10B错。但是有一条LANE 的输出数据比其他LANE快了16字节。
分析
从现象看,可以确定这个问题和SI无关。整个问题的关键应该在于各个通道间的SKEW。
可能引入SKEW的方面有:
- PCB 线路;
- 各路GTX起始工作时间,特别是CDR锁定时间不同;
- RX BUFFER指针偏移;
- GTX参数设置有错。
和客户分析看,PCB的SKEW是严格控制的,而且它不会导致16字节那么大的SKEW。而每路RXBUFFER 在初始化后是有复位的。但这都不能解决问题。
对于2, 客户说起每路GTX的RXELECIDLE并不是同时变0的。这个表示有GTX跳出OOB状态并不和其他GTX同时。这应该是导致所有问题的关键。
检查代码,我们发现MAX_SKEW参数设置的是7。这个值的单位是RXUSRCLK周期。对于V6,内部固定2字节的位宽。对于8B10B应用,是20bit。而对于PCIE而言,其TS1/TS2的长度是16字节。MAX_SKEW = 7应该太大,在通道绑定时有机会在RXBUFFER里看到2个CBS。那通道绑定模块会错开16字节对齐。这和看到的现象是符合的。
解决
解决这个问题,需要从复位着手。
既然看到各路的GTX不同时出OOB状态,那可以等到所有的RXELEICLDE都变低后,把所有的GTX都复位一下。然后在RXRESETDONE都拉高后,复位一下RXBUFFER。这样可以让各路GTX的SKEW最小。这是解决问题的一个方面;
同时,需要把MAX_SKEW改成4。这样可以使通道绑定模块的搜索范围变小,以避免错开对齐的情况发生。
结果
在按上述说明修改完代码后,我们发现这个问题再也没有出现。整个工程工作正常。