第2章 PCIe物理层基础

物理层是PCIe协议的“手脚”,所有数据最终都得靠它传输。我刚开始接触PCIe时,觉得物理层就是一堆电气参数,没什么意思。但后来抓包遇到信号质量引起的误码,才意识到——底层不稳,上层全白搭。

2.1 电气特性与差分信号

PCIe物理层用的是差分信号,说白了就是一对线传一个bit。一根传正信号,另一根传反信号,接收端看两者差值。这样做的好处很明显:抗共模干扰强,电压摆幅小,功耗低。

我当年在调试一块PCIe Gen3板卡时,遇到过莫名其妙的链路降速。最后用示波器量差分电压,发现其中一根走线长了5mm,导致眼图闭合。嗯,差分信号对等长和阻抗控制要求非常苛刻。

关键参数:PCIe Gen1/Gen2发射端差分电压典型值为800 mV p-p,Gen3/Gen4降低到约500 mV。接收端灵敏度在Gen4时已低于100 mV。

避坑指南:我曾经在layout阶段没注意差分对间距,导致串扰严重。后来每遇到新板,我都会先跑一遍SI仿真——别嫌麻烦,比流片回来再改强十倍。

2.2 链路宽度与速率

PCIe链路可以“捆”在一起用。x1是一条lane,x16就是16条lane同时跑。每条lane独立收发,速率相同。链路宽度协商是物理层自动完成的,咱们做验证时经常要关心这个能力。

你想想看,如果设备明明支持x8,但只协商成x4,性能直接砍半。我在项目里就碰到过这种情况,最后发现是某个lane的AC耦合电容焊错了。

PCIe代际每lane速率有效数据速率(x1)x16理论带宽
Gen12.5 GT/s250 MB/s4 GB/s
Gen25.0 GT/s500 MB/s8 GB/s
Gen38.0 GT/s~1 GB/s~16 GB/s
Gen416.0 GT/s~2 GB/s~32 GB/s
Gen532.0 GT/s~4 GB/s~64 GB/s

注意:GT/s是每秒传输的符号数,不等于有效数据速率。因为编码有开销,后面会讲。

容易搞混的点:链路宽度是硬件决定的,但速率由链路训练状态机协商。我见过有人以为插上x16槽就一定跑x16——不一定!如果板子只支持x8,或者槽位被降级,照样只能跑x8。抓包时记得先看Training Set里的Link Width字段。

2.3 编码方案

PCIe的编码方案随代际变化。Gen1/Gen2用8b/10b,每8位数据转成10位符号,额外2位用于DC平衡和时钟恢复。开销是20%。Gen3/Gen4改用128b/130b,开销只有1.56%,效率大幅提升。

我刚开始做Gen3验证时,看到协议说128b/130b需要加扰,还以为是字面意思的干扰。后来读spec才知道——加扰是为了防止长串0或1导致接收端锁相环失步。抓包时如果看到链路连续误码,多半是加扰后的码型序列有异常。

编码对比:

  • 8b/10b:自带游程长度控制,时钟恢复容易;但编码效率低(80%)。
  • 128b/130b:需要外加扰码器,但效率高(98.44%),适合高频。

2.4 物理层核心概念关系

下面这张图把物理层的几个关键块串在一起,你一看就明白。

PCIe物理层核心概念关系图 PCIe物理层核心概念 发送端 (TX) 差分信号对 (D+/D-) 接收端 (RX) 链路宽度 (x1/x4/x8/x16) 速率 (GT/s) 编码 (8b/10b | 128b/130b) 关键理解: • 发送端通过差分信号对将数据传送到接收端。 • 链路宽度决定并行lane数,速率决定每lane符号传输速度。 • 编码方案影响有效带宽和信号质量,不同代际需适配调整。

2.5 物理层验证抓包要点

抓物理层的包,用示波器和协议分析仪是标配。但你要看的东西很明确:

  1. 训练序列:TS1/TS2是否正确?链路宽度和速率字段是不是你想要的值?
  2. 眼图:Gen3以上需要测眼图张开度,我习惯在室温、高温、低温各测一次。
  3. 误码率:物理层误码率要求低于10^-12。如果跑长距离后错误激增,大概率是信号完整性出了问题。

个人习惯:每次开始验证前,先让板子在Gen1低速下稳定建链,再逐步升到目标速率。这样能快速区分是物理层问题还是协议层问题。

好了,物理层这块地基就算打好了。接下来上层协议才能站稳脚跟。记住一句话:差分信号是骨架,链路宽度是肌肉,编码是心脏。哪个出问题,你的PCIe都跑不起来。