PCIe起源:从并行总线到串行总线

还记得PCI吗?

聊PCIe之前,得先说说它的老前辈——PCI。我刚开始做硬件那会儿,PCI还是的主流。那时候主板上一排白色的PCI插槽,插什么网卡、声卡都没问题。但时间长了,问题就暴露出来了。

PCI是并行总线,32位或64位的数据线同时传输。表面上看起来很快,但实际坑很多。

⚠️ 并行总线最大的敌人:时钟偏移(Clock Skew) 当信号跑得越来越快,所有32条数据线很难同时到达目的地。任何一根线晚到了,整个总线都得等它。频率越高,这个问题越严重。

当年我调试PCI时遇到的坑

我记得有一次调一个PCI网卡驱动,死活读不到正确的设备ID。查了两天才发现:板卡插槽的某些引脚接触不良,导致某根数据线一直拉高。嗯,这就是并行总线的另一个头疼点——引脚太多了。

PCI至少需要 120+ 根引脚。你想想看,这么多引脚,不仅PCB布线困难,信号串扰也大。频率稍微往上提一点,电磁干扰问题就来了。

明明并行更快,为什么业界要转向串行?

说实话,我第一次听到串行总线替代并行总线时,心里也犯嘀咕。串行?一根线上一次只传1比特?那得多慢?

但实际上,真相是这样的——

指标 并行总线(PCI) 串行总线(PCIe)
数据线数量 32或64根 差分对(2根一组)
极限频率 ~66 MHz(PCI-X可达533 MHz) 16 GT/s(Gen 4)以上
时钟同步 共享时钟源 嵌入式时钟(CDR提取)
信号质量 受串扰影响大 差分信号抗干扰强

串行总线的核心竞争力,就是把单根线的频率做上去。PCI的66 MHz放到PCIe的2.5 GT/s(Gen1)面前,直接被秒杀。虽然一次只传1 bit,但传输速率是PCI的几十倍。

串行总线的核心思想:用更高的时钟频率,弥补数据宽度的劣势。说白了就是“一次干不快,那就干得更快了”。

变革动机归纳

我个人总结,从并行到串行的变革动机,可以归纳为四点——

  1. 频率瓶颈:并行总线受限于时钟偏移,频率上不去。PCIe采用差分信号+嵌入式时钟,可以轻松跑到GHz级。
  2. 引脚数量:并行总线需要大量引脚,占用PCB空间,增加成本。PCIe用差分对,x1通道只需4根线(发送+接收各一对)。
  3. 功耗与噪声:并行总线同时翻转的数据线会产生巨大的同步开关噪声(SSN)。串行总线的信号幅度小,功耗更低。
  4. 可扩展性:PCIe通过通道捆绑(x1, x4, x8, x16)灵活调整带宽。并行总线改一次宽度,就要重新设计整套控制器。

一个经典的避坑案例

我曾经在一个PCI转PCIe桥接芯片的项目中,吃过并行总线的亏。PCI端的布线需要做等长设计,32根数据线长度差不能超过0.5英寸。我们一开始没当回事,结果板子回来,PCI设备就是枚举失败。后来老老实实做了等长绕线,才解决问题。

而PCIe这边,差分对内等长是关键(一般要求5-10 mil以内),但差分对之间的等长可以宽松很多。这也是为什么PCIe的PCB设计反而比PCI好做。

一张图看懂从PCI到PCIe的演进

PCI到PCIe演进路线 从并行PCI到串行PCIe的变革动机 并行总线(PCI) 大量并行数据线(32-64根) 共享时钟,容易产生时钟偏移 频率受限,典型值33~66 MHz 串行总线(PCIe) 差分信号对(2根一组) 嵌入式时钟(CDR恢复时钟) 频率可达 2.5 GT/s 以上 动机1:突破频率限制 并行总线靠多个低频率通道,串行总线靠单个高频率通道 动机2:减少引脚与布线复杂度 PCIe x1仅4根信号线,相比PCI的120+根大幅简化 动机3:降低功耗与噪声 差分信号幅度小,规避同步开关噪声(SSN) 动机4:灵活的可扩展性 通过通道捆绑(x1/x4/x8/x16)实现带宽弹性伸缩 本质:用单通道的高速率取代多通道的低速率,规避并行物理瓶颈
💡 PCIe并不是简单地把并行改成串行,它从底层协议、电气特性、链路管理都重新设计了。但理解这个变革动机,是搞懂PCIe一切特性的基础。

一点补充:为什么当时不继续优化PCI?

有人会问:为什么不在PCI的基础上继续优化,比如增加频率、改善信号质量?

我个人的看法是:并行总线的物理天花板太明显了。频率每提高一倍,PCB布线难度翻几倍。而且PCI是共享总线架构,所有设备挂在同一条线上,一个设备出问题,整个系统都可能挂掉。

PCIe采用点对点连接,每个设备单独跟根联体通信。这不仅提高了可靠性,也让带宽不再被其他设备抢占。这个设计思想,后来也影响了CXL。

最后说一句

理解PCIe的起源,关键在于理解那个时代的取舍。并行不是不好,只是串行在高速场景下更优雅。我记得当年带一个新人,他问我为什么不是做128位的PCI而是做PCIe。我说:你想想,如果有一天数据速率要达到每秒几十Gbit,你觉得128根线同步跑更现实,还是几根线跑高速更现实?

嗯,答案很明显了。