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图把结构画出来,这样更清楚。

PCIe物理层结构(逻辑子层 + 电气子层) 逻辑子层 (Logical Sublayer) 打包/解包 (TLP/DLLP) 扰码 (Scrambling) 链路训练与状态管理 (LTSSM) 电气子层 (Electrical Sublayer) SerDes / PMA 时钟恢复 (CDR) 均衡器 (Equalizer) 逻辑子层负责数据组织与链路管理,电气子层负责信号实际传输。 Gen1/Gen2 8b/10b编码 2.5 / 5 GT/s 开销>20% Gen3/Gen4 128b/130b编码 8 / 16 GT/s 开销<1.5% Gen5 PAM4? 不, NRZ 32 GT/s 均衡增强

一点心得

我在做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同样适用。