2. PCIe物理层介绍:分层、电气特性与差分信号

各位同学,咱们今天聊聊PCIe物理层。嗯,这层是数据真正“上马路”的地方。你协议层讲的再花哨,最后也得靠物理层这几个引脚把0和1发出去。我经常跟团队里的小朋友说,链路不稳定,八成问题出在物理层。你搞不定物理层,后面的均衡调试就是空中楼阁。

2.1 物理层到底分几层?

很多人以为物理层就一个“铁壳子”,其实它内部有自己的一套小班子。PCIe物理层从功能上分为两个子层:电气子层(Electrical Sublayer)和逻辑子层(Logical Sublayer)。逻辑子层再往下,还能细分出一个物理编码子层(PCS,Physical Coding Sublayer)。这不像协议层那么抽象,它离硬件最近。

我们打个比方:逻辑子层负责“翻译”和“排队”,电气子层负责“喊话”。

  • 逻辑子层:负责对发送数据进行编码(比如128b/130b编码),做加扰(Scrambling),然后组织成一个个有序集(Ordered Set)——比如TS1、TS2这些训练序列。
  • 电气子层:负责驱动差分线对,做信号均衡(TX Equalization/RX CTLE/DFE),处理阻抗匹配。这子层直接跟PCB走线、连接器、板级寄生参数打交道。

核心理解:逻辑子层把数据变成“一串带规则的符号”,电气子层把这串符号变成“能在铜线上跑的电信号”。一个管格式,一个管力道。

我记得第一次调试Gen3链路时,发现链路只Link到Gen1。我排查了三天,最后发现是逻辑子层的加扰模块没完成初始化,导致发送的TS1有序集格式不对。接收端根本认不出来。你看,这种问题你光看眼图是看不出毛病的。

2.2 电气特性:不是你想象的那么简单

电气特性说白了就是电压、电流、时序、阻抗这四样东西。PCIe从Gen1到Gen5,电压摆幅越来越小,频率越来越高。Gen1是1.5V左右的差分摆幅,到了Gen5就只剩0.8V了。为什么?高频下你还那么大摆幅,功耗受不了,而且EMI也控制不住。

几个关键参数,我帮你梳理一下:

参数 Gen1/Gen2 Gen3 Gen4 Gen5
差分峰值电压 800-1200 mV 800-1200 mV 800-1200 mV 800-1200 mV
差分低电平电压 -1200 到 -800 mV -1200 到 -800 mV -1200 到 -800 mV -1200 到 -800 mV
接收器差模阻抗 80-120 Ω (差分) 80-120 Ω 80-120 Ω 80-120 Ω
数据速率 2.5/5.0 GT/s 8.0 GT/s 16.0 GT/s 32.0 GT/s
编码方式 8b/10b 128b/130b 128b/130b 128b/130b

注意这个表里的阻抗。PCIe要求差分阻抗为100Ω,允许偏差±10%。我曾经调试一块板子,眼图死活张不开,后来切片一看,PCB走线在换层过孔处阻抗掉到了85Ω。那一点点不连续,在高频下就是个大坑。

实战技巧:设计PCB时,PCIe差分对的换层过孔要加回流地孔,且孔间距不超过信号上升沿长度的1/4。Gen5的上升沿可能只有20ps,算下来地孔距离不得大于2mm。

2.3 差分信号:PCIe的“筋骨”

差分信号是PCIe最核心的物理传输方式。每条Link由一对发送差分对(TX+ / TX-)和一对接收差分对(RX+ / RX-)组成。为什么用差分?说白了,抗干扰。

你想想看,普通单端信号,你走一根线,地平面上的噪声全部耦合进来。差分信号有两条线,一根走正信号,一根走负信号。外界噪声来袭,两根线同时受到影响,做减法(RX+ 减去 RX-)后,噪声相互抵消了。

这里有个简单的示意图(不用在意参数,看原理):

发送端:           PCB走线:              接收端:
  TX+ ──────────//──────────> RX+
  TX- ──────────//──────────> RX-
                 ↓
              共模噪声
              被抵消

差分信号还有个好处:它不需要一个干净的参考地平面。两根线自己构成一个回路,所以对地弹、电源噪声的容忍度更高。我记得有一年设计服务器主板,CPU和PCH之间跨接一个很长的走线,中间过了一个连接器。单端信号那个区域根本工作不了,但PCIe Gen3的差分对跑得稳稳的。

但要注意,差分信号对等长和间距极其敏感。你两根线长度差超过10mil,在高频下就会产生共模噪声,直接拉低眼图高度。

避坑指南:我曾经有一块Gen4板子,PCIe链路加完均衡才勉强到Gen2速率。查了半天,发现TX差分对内等长差了15mil。你以为0.5mm的差距微不足道?在16GT/s的速率下,这0.5mm能导致接收端产生几十mV的定时误差。修完等长,链路直接稳定上Gen4。

下面这张图是我画的物理层结构示意图,帮你把今天的内容串起来:

PCIe 物理层核心结构 事务层 / 数据链路层(上层接口) 物理层 (Physical Layer) 逻辑子层 (Logical) 128b/130b 编码 加扰 (Scrambling) 有序集生成 (TS1/TS2/SKP) 电气子层 (Electrical) TX 均衡 (De-emphasis) RX CTLE / DFE 阻抗匹配 / 抖动补偿 数据流向 差分信号对 (Differential Pair) TX+ / TX- | RX+ / RX- | 100Ω差分阻抗 共模噪声抑制 等长 / 等间距约束 电压摆幅 (0.8-1.2V) 物理层 = 编码 + 驱动 + 抗干扰

这个图你可以存下来。我经常在方案评审时拿出来讲:逻辑子层管“数字的语言”,电气子层管“模拟的力气”,而差分信号就是它们之间传递消息的那根“电话线”。三者缺一不可。

2.4 关于眼图,我想多说两句

眼图是评估PCIe物理层信号质量的最直观工具。你在示波器上看差分信号,叠加很多个UI后形成了类似“眼睛”的形状。眼图张开的宽度代表定时裕量,高度代表电压裕量。

PCIe规范对眼图有明确要求:Gen3要求眼高不低于100mV,眼宽不低于0.4UI。但实际调试中,我建议你留20%的余量。你永远不知道产线上的板子会多糟糕。

实用观点: 物理层不是“一次性交付”的东西。板子打样回来,先测眼图。链路不稳定,先看物理层参数。不要跳过这一步去分析协议层超时——很多时候是物理层丢了符号,你协议层再怎么重传都没用。