091、PCIE数据总线反转(DBI)与字节剥离(Stripping):从一次眼图异常说起
091、PCIE数据总线反转(DBI)与字节剥离(Stripping):从一次眼图异常说起
上个月调一块PCIe Gen3的板子,链路训练能过,但压力测试一到高负载就偶发丢包。抓眼图发现发送端的电压摆幅不对称,查了半天硬件没问题,最后在LTSSM日志里看到DBI标志位异常跳变——这才意识到问题出在数据编码上。
DBI到底在解决什么?
PCIe总线用的是8b/10b或128b/130b编码,这两种编码有个共同特点:直流平衡性不是绝对的。连续发0x00和连续发0xFF,线上的直流电平能差出几百毫伏。Gen3之后速率上到8GT/s,这种直流偏移会导致接收端基线漂移,眼图直接闭合。
DBI(Data Bus Inversion)的机制很巧妙:它比较当前待发送的8位数据和前一个周期数据,如果“1”的个数超过4个,就把整个字节取反发送,同时在DBI通道加个标志位告诉接收端“我反了”。这样线上“1”和“0”的数量基本对半开,直流平衡性大幅改善。
// 实际实现大概长这样uint8_tapply_dbi(uint8_tcurrent