PCIe起源:从并行总线到串行总线
还记得PCI吗?
聊PCIe之前,得先说说它的老前辈——PCI。我刚开始做硬件那会儿,PCI还是的主流。那时候主板上一排白色的PCI插槽,插什么网卡、声卡都没问题。但时间长了,问题就暴露出来了。
PCI是并行总线,32位或64位的数据线同时传输。表面上看起来很快,但实际坑很多。
当年我调试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的几十倍。
变革动机归纳
我个人总结,从并行到串行的变革动机,可以归纳为四点——
- 频率瓶颈:并行总线受限于时钟偏移,频率上不去。PCIe采用差分信号+嵌入式时钟,可以轻松跑到GHz级。
- 引脚数量:并行总线需要大量引脚,占用PCB空间,增加成本。PCIe用差分对,x1通道只需4根线(发送+接收各一对)。
- 功耗与噪声:并行总线同时翻转的数据线会产生巨大的同步开关噪声(SSN)。串行总线的信号幅度小,功耗更低。
- 可扩展性:PCIe通过通道捆绑(x1, x4, x8, x16)灵活调整带宽。并行总线改一次宽度,就要重新设计整套控制器。
一个经典的避坑案例
我曾经在一个PCI转PCIe桥接芯片的项目中,吃过并行总线的亏。PCI端的布线需要做等长设计,32根数据线长度差不能超过0.5英寸。我们一开始没当回事,结果板子回来,PCI设备就是枚举失败。后来老老实实做了等长绕线,才解决问题。
而PCIe这边,差分对内等长是关键(一般要求5-10 mil以内),但差分对之间的等长可以宽松很多。这也是为什么PCIe的PCB设计反而比PCI好做。
一张图看懂从PCI到PCIe的演进
一点补充:为什么当时不继续优化PCI?
有人会问:为什么不在PCI的基础上继续优化,比如增加频率、改善信号质量?
我个人的看法是:并行总线的物理天花板太明显了。频率每提高一倍,PCB布线难度翻几倍。而且PCI是共享总线架构,所有设备挂在同一条线上,一个设备出问题,整个系统都可能挂掉。
PCIe采用点对点连接,每个设备单独跟根联体通信。这不仅提高了可靠性,也让带宽不再被其他设备抢占。这个设计思想,后来也影响了CXL。
最后说一句
理解PCIe的起源,关键在于理解那个时代的取舍。并行不是不好,只是串行在高速场景下更优雅。我记得当年带一个新人,他问我为什么不是做128位的PCI而是做PCIe。我说:你想想,如果有一天数据速率要达到每秒几十Gbit,你觉得128根线同步跑更现实,还是几根线跑高速更现实?
嗯,答案很明显了。