PCIe物理层概述:Gen1到Gen5的演进之路
聊CXL之前,咱们得先把PCIe物理层这摊子事捋清楚。为什么?因为CXL的物理层其实就“住”在PCIe物理层里面,两者共享底层的电气和逻辑接口。我个人习惯把PCIe物理层比作高速公路的路基,CXL就是上面跑的特殊货车——路基修到第几代,货车就得适配到第几代。
好,我们从头开始,看看PCIe物理层从Gen1到Gen5到底发生了什么变化。
基础概念:差分信号与通道
PCIe物理层的核心,说白了就是“差分信号对”。一对发送线(TX+,TX-),一对接收线(RX+,RX-),组成一个通道(Lane)。你想想看,一根线传数据容易受干扰,两根线互补着传,抗干扰能力就上来了。这叫差分传输,PCIe从Gen1到Gen5一直没变过。
关键概念
- Lane(通道):一组差分TX对 + 差分RX对,双向同时传。
- Link(链路):x1、x2、x4、x8、x16等,多个Lane绑定在一起用。
- Symbol(符号):物理层的最小数据单元,8位或10位不等。
Gen1到Gen5:每一代的跨越
我刚开始接触PCIe时,Gen2都算高端的。后来做CXL项目,Gen5已经成了标配。咱们直接从参数表切入,这样最直观。
| 代际 | 速率 (GT/s) | 编码方式 | 带宽 (x16, 单向) | 引入年份 |
|---|---|---|---|---|
| Gen1 | 2.5 | 8b/10b | 4 GB/s | 2003 |
| Gen2 | 5.0 | 8b/10b | 8 GB/s | 2007 |
| Gen3 | 8.0 | 128b/130b | 15.8 GB/s | 2010 |
| Gen4 | 16.0 | 128b/130b | 31.5 GB/s | 2017 |
| Gen5 | 32.0 | 128b/130b | 63 GB/s | 2019 |
注意看编码方式那一列。从Gen1到Gen2都是8b/10b,什么意思?每传8位有效数据,实际要发10位,浪费了20%的带宽。到了Gen3,直接改成128b/130b,开销骤降到1.5%不到。这是物理层最漂亮的一次升级,没有之一。
为什么会这样?因为信号质量上来了。早期SerDes(串行解串器)技术不够成熟,必须靠8b/10b来保证DC平衡和时钟恢复。后来锁相环和均衡器进步了,128b/130b就成了顺理成章的事情。我记得在Gen3刚出来那会儿,很多IP厂商的物理层都踩过坑——编码改了,但链路训练时序没跟上,导致协商失败。
物理层子块:逻辑与电气
PCIe物理层分两大块:逻辑子层和电气子层。逻辑子层管数据打包、扰码、链路训练;电气子层管信号电平、时钟、驱动。我用个SVG图把结构画出来,这样更清楚。
一点心得
我在做CXL控制器时,发现很多团队只盯着逻辑子层的LTSSM(链路训练与状态机),忽略了电气子层的均衡配置。结果链路可以训练上去,但误码率奇高。Gen5的32 GT/s对信号完整性要求非常苛刻,电气子层的CTLE(连续时间线性均衡器)和DFE(判决反馈均衡器)参数稍有偏差,就会导致链路不稳定。
关键演进点:速率与编码的博弈
我们拆开来看每一代的具体变化。
Gen1到Gen2:平滑升级
速率翻倍,从2.5 GT/s到5 GT/s。编码不变,物理层电气参数基本一样。很多老设备直接换PLL就能支持Gen2。但有一个坑:信号损耗随频率升高而增加,Gen2的插损预算比Gen1紧张不少。我曾经在一个项目中,PCB走线过长,Gen1跑得稳稳的,Gen2就是上不去——最后加了两级repeater才搞定。
Gen3:里程碑式的编码变革
8b/10b -> 128b/130b,这是PCIe物理层最大的一次跳跃。好处是有效带宽大幅提升,坏处是物理层逻辑子层几乎重写。扰码器换了,SKP ordered set的插入机制也变了。CXL就诞生在Gen3这个时代,所以CXL 1.x/2.x都依赖于Gen3及以上的物理层。
Gen4和Gen5:速率翻倍,但编码不变
8 GT/s -> 16 GT/s -> 32 GT/s,每一次速率翻倍,电气子层的压力都成倍增加。Gen5引入了更复杂的TX和RX均衡,以及可配置的预加重和去加重参数。我记得有一次调试Gen5链路,误码率始终在1e-12左右晃,死活降不到1e-15以下。最后发现是RX端的CDR(时钟数据恢复)环路带宽设得太宽,把高频噪声带进来了。调窄之后,误码率直接降到1e-18。
注意
PCIe Gen5虽然速率高达32 GT/s,但仍然是NRZ(不归零)调制,并没有采用PAM4。PCI-SIG在Gen6才会引入PAM4。这一点很多初学者会搞混。CXL 3.x支持Gen5物理层,所以目前也是NRZ为主。
误码率与链路质量
每一代PCIe对误码率(BER)的要求都不太一样:
- Gen1/Gen2:典型目标BER = 1e-12,实际设计通常按1e-15来留裕量。
- Gen3/Gen4:目标BER = 1e-12,但引入了更完善的纠错机制,比如CRC重传。
- Gen5:目标BER = 1e-12,但链路预算极其紧张,需要精心设计PCB和连接器。
CXL对BER的要求比普通PCIe更严格——因为它承载的是一致性协议,数据出错可能导致缓存污染,甚至系统崩溃。
我的一点总结
PCIe物理层从Gen1到Gen5,说白了就是一场「速率、编码、均衡」的三角博弈。Gen1和Gen2是奠基,Gen3是编码革命,Gen4和Gen5是速率冲刺。CXL选择复用PCIe物理层,既享受了PCIe生态的成熟性,也承受了物理层演进带来的约束。
比如CXL.mem要求超低延迟,PCIe物理层的重传机制和链路训练时间必须被优化。再比如CXL.io完全复用PCIe的物理层和事务层,所以PCIe Gen5的均衡配置对CXL 3.x同样适用。