第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理论带宽 |
|---|---|---|---|
| Gen1 | 2.5 GT/s | 250 MB/s | 4 GB/s |
| Gen2 | 5.0 GT/s | 500 MB/s | 8 GB/s |
| Gen3 | 8.0 GT/s | ~1 GB/s | ~16 GB/s |
| Gen4 | 16.0 GT/s | ~2 GB/s | ~32 GB/s |
| Gen5 | 32.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 物理层核心概念关系
下面这张图把物理层的几个关键块串在一起,你一看就明白。
2.5 物理层验证抓包要点
抓物理层的包,用示波器和协议分析仪是标配。但你要看的东西很明确:
- 训练序列:TS1/TS2是否正确?链路宽度和速率字段是不是你想要的值?
- 眼图:Gen3以上需要测眼图张开度,我习惯在室温、高温、低温各测一次。
- 误码率:物理层误码率要求低于10^-12。如果跑长距离后错误激增,大概率是信号完整性出了问题。
个人习惯:每次开始验证前,先让板子在Gen1低速下稳定建链,再逐步升到目标速率。这样能快速区分是物理层问题还是协议层问题。
好了,物理层这块地基就算打好了。接下来上层协议才能站稳脚跟。记住一句话:差分信号是骨架,链路宽度是肌肉,编码是心脏。哪个出问题,你的PCIe都跑不起来。