006、PCIE物理层基础:通道、速率与编码
006、PCIE物理层基础:通道、速率与编码
上周调一块新板子,链路死活训练不到Gen3。示波器眼图看着还行,但LTSSM卡在Recovery状态反复跳。折腾两天发现是参考时钟的Spread Spectrum配置和下游设备不匹配。这种问题查起来特别费劲,因为物理层的问题往往藏在最底层,信号质量、时钟、编码任何一个环节出问题,链路都起不来。今天咱们就拆开PCIE物理层这黑盒子看看。
物理层到底在干什么
物理层干的是苦力活:把上层传来的TLP/ DLLP包变成差分线上的电平跳变,再把对方发来的跳变还原成数据。听起来简单?这里面的水比想象中深。有一次我遇到个诡异问题:系统随机丢包,最后发现是PCB上某个lane的等长没做好,skew超了规范几个ps,高温下就出问题。
物理层三大核心:通道(Lane)、速率(Generation)、编码(Encoding)。这三者相互牵制,设计时得一起考虑。
通道:不是一根线,是一对线
新手容易误解的地方:PCIE的每个lane是差分对,RX和TX各一对,全双工工作。所以x16的卡实际上有64根信号线(还不算地线)。布线时差分对内等长要比差分对间等长更重要,内等长差个5mil,信号质量就可能劣化明显。
通道绑定(Lane Bonding)是个有意思的机制。x4的链路不是四个独立的lane,而是物理层把数据拆到四个lane上同步传输。调试时见过一个案例:某个lane失效后,系统降速为x1模式,但实际吞吐量比预期还低,后来发现是驱动里的Lane反转配置没处理好。
速率:每一代都不是简单的翻倍
Gen1的2.5 GT/s,Gen2的5.0 GT/s,Gen3的8.0 GT/s,Gen4的16.0 GT/s,Gen5的32.0 GT/s。注意单位是GT/s(Giga Transfers per second),不是Gbps,因为编码开销要扣除。
升级速率不光是提高时钟频率。Gen1/Gen2用8b/10b编码,每10bit里只有8bit是有效数据,所以2.5 GT/s的实际数据率是2.0 Gbps。Gen3开始换128b/130b编码,开销降到1.54%,但代价是更复杂的加扰和同步机制。
这里有个坑:很多芯片的Gen3模式需要外接高精度参考时钟(100MHz ±300ppm以内),用普通晶振可能会训练失败。我吃过这个亏,查了一周才发现是时钟芯片的配置寄存器没配成低抖动模式。
编码:不只是为了省带宽
8b/10b编码有三个作用:保证足够的电平跳变用于时钟恢复(DC平衡)、提供控制字符(K码)、实现字节对齐。它的运行不一致性(Running Disparity)机制挺巧妙,通过控制0和1的数量差来维持直流平衡。
但8b/10b有20%的开销,到Gen3时成了瓶颈。128b/130b编码几乎没开销,但需要更复杂的同步头(Sync Header)和加扰(Scrambling)。加扰用的LFSR多项式是固定的,但初始种子(Seed)可以协商。见过两个厂家的设备互操作性有问题,最后发现是加扰器使能时机不一致。
物理层包(Ordered Set)用特殊的编码,比如TS1/TS2序列,这些包用不同的控制字符,接收端靠这个来识别。调试时抓物理层log,看到TS1/TS2反复交换,基本就是在训练链路。
信号完整性那些事儿
预加重(Pre-emphasis)和均衡(Equalization)是高速串行的关键。预加重在发射端增强高频分量,补偿通道损耗。均衡在接收端用CTLE(连续时间线性均衡)或DFE(判决反馈均衡)来修复信号。
均衡训练(EQ Training)过程很精细:发射端发不同预设值的TS1,接收端评估信号质量,反馈给对端调整。这个过程在Gen3以后变得特别重要。有次调一个背板系统,链路能起来但误码率高,最后发现是接收端CTLE的配置太保守,没敢放开增益。
个人经验与建议
调物理层问题,示波器+协议分析仪是黄金组合。先看眼图张不开,再看LTSSM状态机卡在哪一步。状态机停在Polling.Compliance基本是发射端问题,停在Recovery.Speed往往是均衡训练失败。
设计时预留测试点:AC耦合电容前后都引出来,方便戳探头。PCB布局时,参考时钟线要当高速信号对待,远离噪声源。速率能自动协商就别写死,但初始化时可以降速启动,稳定后再尝试升速。
最实在的建议:拿到新芯片先仔细读物理层配置章节,特别是那些厂商特有的寄存器。有些默认值在公版设计上能用,但在你的板子上可能就是坑。物理层调通了,上层协议栈才有得玩。
下次咱们聊链路层怎么组包拆包,那里又是另一套玩法。
