PCIe物理层基础:差分信号、码型、预加重与去加重

做PCIe链路均衡故障排查,你绕不开物理层。说白了,链路能跑多快、稳不稳,根子都在这三层基础上:差分信号、编码码型、预加重与去加重。我当年刚接手PCIe Gen3项目时,被眼图闭合搞得焦头烂额,最后发现是对去加重理解不够透。这一节咱们就把这几个坑填上。

1. 差分信号——PCIe的“铁路”

PCIe用差分对传输,就是两根线一起走,信号互为反向。好处很明显:共模噪声被抵消,抗干扰能力强。你想想看,一根线受干扰往上跳,另一根也往上跳,差值是零,对接收端来说等于没跳。这跟单端信号比,简直就是降维打击。

个人经验:我在调试一块Gen4交换板时,差分对走线间距没控制好,结果眼图在3dB点抖动超了spec。后来查手册发现差分阻抗要求100Ω±10%,实际Layout做了95Ω,硬是让信号反射回来了。所以别小看差分线的阻抗连续性和等长要求。

PCIe的差分信号电压摆幅很小,Gen3只有800~1200mV峰峰值。这么小的幅度加上高频损耗,没点均衡手段根本传不远。这就引出了后面的预加重和去加重。

2. 码型——数据怎么编码

PCIe用两种编码:老一点的是8b/10b,新一点的是128b/130b。我习惯把8b/10b叫“冗余换稳定”,128b/130b叫“效率换复杂”。

特性 8b/10b编码 128b/130b编码
使用代际 Gen1, Gen2 Gen3, Gen4, Gen5
编码效率 80% 98.46%
DC平衡 完美保证 通过加扰近似保证
时钟恢复 自带足够跳变 依赖加扰+SSP(有序集)
主要用途 低速、成熟、可靠 高速、高带宽、低误码

8b/10b每个字节编码成10位,多了2个bit来做DC平衡和保证过零点。而128b/130b只多了2位同步头,效率高出一大截,但对链路均衡和加扰算法要求更高。我在一次Gen3板卡测试中,发现加扰种子匹配出了问题,导致连续长0,接收端PLL失锁。这就是128b/130b的一个坑——必须保证加扰后的数据有足够的跳变。

强提醒:无论哪种编码,接收端都需要从串行数据中恢复时钟。如果链路均衡没调好,导致眼图闭合,时钟恢复就会出错,误码率飙升。

3. 预加重与去加重——信号“整形术”

高频信号在传输线上会衰减,而且不同频率衰减不一样。低频分量(长连续位)传得远,高频分量(快速跳变)衰减厉害。结果呢?到了接收端,高频跳变幅度变小,低频幅度相对变大,眼图就塌了。

解决方案就是:发送端“预强调”高频,或者在接收端“去加重”低频。我更喜欢从物理意义上去理解:预加重就是发送时主动把跳变沿的幅度抬高,让它在信道里衰减后正好平衡;而去加重则是把连续同符号位(低频)的幅度压低,相对突出了高频跳变。

我曾经踩过的坑:有一回Gen3链路在长走线(30英寸)上训练不通过,我一股劲在接收端加高价均衡芯片,结果发现是发送端去加重系数设错了。PCIe Training Sequence里预设的系数(比如-3.5dB、-6dB)是根据短距离优化的,换成长走线需要手动调。后来我把发送端去加重负幅加大,眼图立马打开了。记住:链路均衡是个双方配合的过程,不要只盯着接收端。

去加重通常用两个参数来描述:主游标(Post-cursor)和预游标(Pre-cursor)。主游标决定跳变后的下一个符号幅度,预游标决定跳变前的符号幅度。这个在PCIe CTLE(连续时间线性均衡)和DFE(判决反馈均衡)里都要配合使用。

知识体系结构图

下面这张图帮你看清物理层基础在整条链路中的位置和作用:

PCIe物理层基础链路示意图 发送端差分对 码型编码 预加重 传输信道 去加重/CTLE+DFE 时钟恢复 CDR 码型解码 接收端差分对 ⚠ 核心要点: 预加重(发送端)和去加重(接收端)共同补偿信道高频衰减。 码型编码保证DC平衡和时钟恢复条件,是均衡成功的前提。

看到没有?信号从发送端差分对出发,先经过码型编码,然后预加重,再穿越信道,最后在接收端通过去加重(含CTLE+DFE)、时钟恢复、解码,回到接收端差分对。任何一个环节出了问题,轻则眼图闭合,重则链路训练失败。

4. 实战中的直观感受

我建议你在做链路均衡调试时,手边放一份PCIe Base Spec的物理层章节。但别只看书,要用示波器测实际波形。我就养成了习惯:先测发送端去加重后的波形摆幅,再测经过不同长度信道的接收端眼图。摆幅差超过30%就要调系数了。

记住一条实用口诀:链路不稳,先看物理层;眼图不好,调预加重和去加重;编码错误,查加扰和DC平衡。这三板斧够你对付80%的初级故障。

这一节讲完了差分对、码型、预加重和去加重,为你拆解后续的均衡故障案例打了底。下次我们聊真正的故障排查流程——你会看到这些基础知识怎么一步步变成debug工具。