第2章 PCIe链路层基础:差分信号、预加重、去加重、去预加重概念

各位,咱们今天聊点实实在在的东西。PCIe的高速信号能跑在Gen5/Gen6,靠的可不是运气,而是链路层那一套精细的均衡机制。我刚入行时也觉得这些概念很抽象,直到亲手调过好几块板子,才真正体会到它们的重要。

2.1 差分信号:为什么非它不可?

先说个最简单的起点。PCIe的信号传递,用的是差分对——也就是 D+ 和 D- 两根线。接收端看的是两个引脚之间的电压差,而不是对地电压。

为什么要这么麻烦?我做过一个25Gbps的项目,用单端信号连了10cm走线,结果串扰直接把眼图打成了“一团糊”。换成差分对之后,问题基本消失了。原因很简单:外部噪声会同时叠加在D+和D-上,差模接收器一相减,噪声就被干掉了。用行话说就是“共模抑制比高”。

要点:差分信号的抗干扰能力,来源于“差分 → 减法 → 噪声抵消”这个基本原理。

差分信号还带来两个额外好处:

  • 电压摆幅小:典型PCIe发送端只有800 mV~1.2 V的差分摆幅,功耗更低,也更适合高频切换。
  • 电磁辐射低:两根线上的电流方向始终相反,远场的磁通互相抵消,EMI自然就小了。

2.2 预加重:在发送端“提前使劲”

高速信号经过PCB走线、连接器、过孔……每经过一级损耗,高频分量就会被削弱一大截。你想想看,方波里含有丰富的高频成分,损耗后变成圆滚滚的波形,码间干扰(ISI)就开始作祟了。

怎么办呢?最简单粗暴的方法——在发送端就把信号的高频分量提前“打足”。这就是预加重。具体做法是:发送一个bit时,如果当前bit和上一个bit不同(即发生了跳变),我就让发送器在这第一个bit上多给一点幅度;如果连续发相同的bit(比如一连串的1),就不加额外幅度。这样做,高频能量被补上了,经过信道衰减后,接收端看到的波形反而更干净。

我个人的习惯:调预加重系数时,先跑一份PCIe Gen3的内部回环测试,看一眼眼图是否张开。如果眼高不够,我会先加大预加重的比值(比如从3 dB提到6 dB),而不是盲目加接收端的CTLE。

2.3 去加重:换个角度看同一件事

预加重是给跳变bit“补”能量。那么去加重呢?它是反过来——把连续相同bit(比如长串的“111111”)的幅度压低。效果上两者本质相同:高/低频分量的相对比例变了,只是执行角度不一样。

很多新手搞混这两者,我快速对比一下:

对比项 预加重 去加重
操作对象 跳变后的第一个bit 连续相同的bit(非跳变位)
幅度变化 该bit幅度增大 该bit幅度减小
相对关系 跳变位幅度 > 非跳变位 非跳变位幅度 < 跳变位
实际应用 PCIe发送端大多使用预加重 部分高速串行标准(如SATA)使用去加重

嗯,这里要注意:预加重和去加重不能同时正交使用,因为它们是同一个调节参量的不同表述。PCIe链路训练时会协商出一组系数,这组系数就决定了每个bit的预加重/去加重深度。

2.4 去预加重:补上概念的最后一环

你可能看到过“de-emphasis”和“pre-emphasis”,那“de pre-emphasis”又是什么?说白了,就是把去加重反过来看,强调了对“前一个bit”的影响。我在一本老芯片手册里第一次见到这个说法,当时也愣了一下。

从数学上讲:发送端可以做一个三抽头的FIR滤波器(前标、主标、后标)。调整后标系数就能实现去加重,调整前标系数就是预加重。PCIe规范里更常见的是用去加重的dB值来描述(比如-3.5 dB),所以大多数人直接叫“去加重”。不过遇到老一辈文档上写“de pre-emphasis”,你心里清楚它就是指“发送均衡中的去加重部分”就行。

我曾经摔过的坑:有一个项目,接收端CTLE已经调到最大了,眼图还是打不开。我反复读PCIe Base Spec,才发现是发送端预加重系数被BIOS写成了0(没开均衡)。后来加上-3.5 dB的去加重参数,眼图直接开了50%。所以务必确认发送端均衡真正生效了,别光盯着接收端猛调。

2.5 从概念到流程:链路均衡处理图

下面这张SVG图把整个发送端均衡处理路径画出来了。你可以对照自己的板子,看看哪个环节可能被忽略。

PCIe发送端均衡处理流程 原始数据 010101… FIR均衡 前标/主标/后标 差分驱动 D+/D-输出 信道损耗 插损/回损/ISI → 接收端CTLE/DFE 均衡后的眼图 眼宽/眼高达标 预加重系数 ↑ → 高频补偿增强 去加重(3.5 dB / 6 dB) → 低频压制等效 两者通过FIR的“主标/后标”系数统一控制

2.6 实操避坑清单

聊了这么多概念,我总结几条自己踩过的和看别人踩过的坑:

  1. 不要以为开了均衡就万事大吉:有次Gen4板卡测试,眼图一直有“双线”,查了半天发现发送端预加重系数虽然是-3.5 dB,但码型发生器配的PRBS模式太短,根本没测出真正的长ISI。后来换成PRBS31,问题立刻暴露。
  2. 预加重不是越大越好:过度预加重会让跳变处出现过冲,反而增加EMI和接收端过应力。建议从PCIe规范推荐值(Gen3通常-3.5 dB)开始,逐步微调。
  3. 差分信号走线必须等长:差分对内时延差>5 ps时,共模抑制能力急剧下降。我曾见过一根板卡D+比D-长10 mil,结果眼图歪了30%,加什么均衡都救不回来。修等长后才恢复正常。
  4. 去加重参数是“负收益”场景:如果信道损耗极小(比如1 cm短距),加去加重反而会降低信噪比。所以PCIe链路训练时会自动协商,不要手动把系数写死。
实用技巧:调参时用SigTest或PCIe Compliance Base工具抓取眼图模板。先看眼高是否>120 mV(Gen3),再看眼宽是否>0.3 UI。如果两项都不达标,优先调整发送端均衡,其次是接收端CTLE,最后才动DFE。

好,以上就是差分信号、预加重、去加重、去预加重这些基础概念的来龙去脉。别忘了,它们背后的数学本质就是一个三抽头FIR滤波器:前标(pre-cursor)控制预加重,后标(post-cursor)控制去加重。只要你理解了这一点,后面再讲CTLE和DFE就顺了。