4. PCIe物理层:Gen1/Gen2/Gen3/Gen4/Gen5速率对比、8b/10b与128b/130b编码、链路训练与初始化、电气特性
各位同学,咱们今天聊聊PCIe物理层。说实话,这是整个PCIe子系统里最「硬核」的部分。我当年刚接触高通芯片时,被这些速率和编码搞得头大。后来踩过几次坑,才慢慢摸清门道。
4.1 速率演进:从Gen1到Gen5
先看这张表,一目了然:
| 代际 | 单通道速率 | 编码方式 | 有效带宽(x1) | 推出年份 |
|---|---|---|---|---|
| Gen1 | 2.5 GT/s | 8b/10b | 250 MB/s | 2003 |
| Gen2 | 5.0 GT/s | 8b/10b | 500 MB/s | 2007 |
| Gen3 | 8.0 GT/s | 128b/130b | 985 MB/s | 2010 |
| Gen4 | 16.0 GT/s | 128b/130b | 1.969 GB/s | 2017 |
| Gen5 | 32.0 GT/s | 128b/130b | 3.938 GB/s | 2019 |
注意看,GT/s是每秒传输的比特数,不是字节。Gen1的2.5 GT/s,扣掉8b/10b编码的20%开销,实际有效带宽就是2.5 * 0.8 = 2 Gbps,换算成字节就是250 MB/s。
我个人习惯,在评估系统带宽时,直接按有效带宽算。比如高通骁龙8 Gen2的PCIe控制器支持Gen4 x4,那就是4 * 1.969 ≈ 7.9 GB/s。这个数字够不够用?得看你挂什么外设。NVMe SSD一般吃不满,但如果是AI加速卡,就得掂量掂量了。
核心要点:速率翻倍,但编码效率也在变。Gen3之后改用128b/130b,开销从20%降到1.5%左右。这才是真正的「提速」。
4.2 编码方式:8b/10b vs 128b/130b
为什么Gen1/Gen2用8b/10b,Gen3开始换128b/130b?
说白了,8b/10b是为了保证DC平衡。每8位数据编码成10位,保证0和1的数量尽量相等。这样信号不会出现长串的连续0或1,接收端容易恢复时钟。但代价是20%的带宽浪费。
到了Gen3,速率提到8 GT/s,再浪费20%就太心疼了。于是引入了128b/130b编码。130位里只有2位是开销,效率高达98.5%。
嗯,这里要注意:128b/130b不是简单的「压缩」。它用了加扰(Scrambling)技术,把数据随机化,避免出现长串相同比特。我在项目中遇到过,有些老工程师担心加扰会增加延迟,其实硬件实现后几乎感觉不到。
避坑指南:我曾经在一个Gen3转Gen2的兼容性测试中,发现某些老设备不支持128b/130b。解决办法是强制降速到Gen2,用8b/10b。所以设计时一定要留好降速回退路径。
4.3 链路训练与初始化
链路训练,就是PCIe设备上电后互相「握手」的过程。你想想看,两个设备速率不同、宽度不同,怎么协商?
整个过程分几个阶段:
- 检测(Detection):发送端发一个脉冲,看接收端有没有回应。说白了就是「有人在吗?」
- 轮询(Polling):双方交换训练序列,确定位锁定和符号锁定。
- 配置(Configuration):协商链路宽度和速率。比如一个x16的插槽,插了个x4的卡,这里就会降宽。
- 恢复(Recovery):如果链路质量不好,可以重新训练,降速或降宽。
- L0状态:正常数据传输。
我建议你们重点看Configuration阶段。高通芯片的PCIe控制器里,有个寄存器叫Link Control 2,里面Target Link Speed字段就是干这个的。代码里经常这么配:
// 设置目标速率为Gen3
pcie_write(link_ctrl2, 0x02); // 0x01=Gen1, 0x02=Gen2, 0x03=Gen3
// 触发链路重训练
pcie_write(link_ctrl, 0x20); // Retrain Link bit
实际项目中,我遇到过链路训练失败的情况。最常见的原因是参考时钟抖动太大。高通芯片对时钟要求很严,100MHz参考时钟的抖动要控制在几十ps以内。否则训练序列对不上,链路就起不来。
警告:千万不要在链路训练期间读写配置空间!我见过有人踩这个坑,导致控制器死锁。正确的做法是等链路状态寄存器显示L0后再操作。
4.4 电气特性
电气特性这块,说难不难,说简单也不简单。我挑几个关键点讲:
- 差分信号:PCIe用差分对传输,一对TX,一对RX。电压摆幅从Gen1的800mV降到Gen5的400mV左右。为什么?速率高了,摆幅大反而容易产生EMI。
- 阻抗匹配:差分阻抗100Ω,单端50Ω。高通芯片内部一般集成了终端电阻,但PCB走线必须严格控制阻抗。我建议走线时留出阻抗测试点,方便调试。
- AC耦合电容:发送端和接收端之间必须串电容,典型值100nF。这个电容不能省,也不能用错。我见过有人用0402封装的电容,结果耐压不够,打火击穿了。
- 去加重(De-emphasis):Gen2及以上速率,发送端会对第一个比特加重,后续比特衰减。这样能补偿高频损耗。Gen3之后又加了预加重(Pre-emphasis),更复杂了。
我记得有一次调试Gen3链路,眼图总是闭合。查了半天,发现是PCB过孔太多,导致阻抗不连续。后来改成背钻工艺,眼图立马打开了。所以啊,高速设计,PCB layout比芯片本身更考验功力。
总结一下:PCIe物理层,速率是骨架,编码是血肉,训练是灵魂,电气是根基。高通芯片的PCIe控制器虽然集成度高,但外围电路和PCB设计一点都不能马虎。你想想看,一个Gen5的信号,32 GT/s,周期才31.25 ps。这么短的时间里,信号要穿越芯片封装、PCB走线、连接器,任何一个小瑕疵都会导致链路不稳定。
好了,物理层就讲到这里。下一节咱们聊聊数据链路层,那里有更精彩的流控和重传机制。