1. PCIe概述:从并行总线到高速串行的演进之路

大家好,我是你们的PCIe课程讲师。今天咱们聊聊PCIe总线的发展历程。说实话,我入行那会儿,PCI还是主流,PCI-X刚冒头。转眼间,PCIe已经统治了高速互联领域快二十年了。

1.1 PCI总线的发展历史

先说说PCI。1992年,Intel推出了PCI总线标准。那时候,它可是革命性的——32位并行总线,33MHz频率,理论带宽133MB/s。嗯,放在今天看确实不够看,但在当时,这已经是大杀器了。

我记得刚工作那会儿,调试PCI设备时最头疼的就是信号完整性。33MHz的并行总线,32根数据线要同时到达,稍微有点偏差就出问题。你想想看,这还只是33MHz,后来PCI-X跑到133MHz、266MHz,那简直是噩梦。

PCI-X是PCI的增强版,主要用在服务器领域。它把频率提到了133MHz,64位模式下带宽能到1GB/s。但问题来了——并行总线的物理瓶颈摆在那里,频率越高,信号同步越难做。

核心痛点:并行总线存在三大硬伤——信号同步困难、引脚数量过多、功耗居高不下。说白了,这条路走到头了。

1.2 PCIe与PCI/PCI-X的区别

2003年,PCI-SIG组织发布了PCIe 1.0标准。这玩意儿跟PCI完全是两码事。我给大家列个表,一目了然:

特性 PCI PCI-X PCIe
总线架构 并行共享总线 并行共享总线 串行点对点
数据传输 半双工 半双工 全双工
引脚数 124(32位)/184(64位) 184 16(x1)/64(x16)
带宽(x1) 133 MB/s 1 GB/s 250 MB/s(Gen1)
可扩展性

看到没?PCIe最大的变化就是——从共享总线变成了点对点串行链路。每个设备都有自己的专用通道,不用跟别人抢带宽了。我在项目中遇到过不少客户,他们总以为PCIe跟PCI一样是共享总线,结果做出来的系统性能惨不忍睹。

个人经验:PCIe的串行架构有个隐藏好处——链路宽度可以灵活配置。x1、x4、x8、x16,想用多少用多少。我曾经帮一个客户把x16的显卡插槽降级成x8用,省下的引脚正好接了俩NVMe SSD,美滋滋。

1.3 PCIe体系结构概览

PCIe采用分层模型,一共三层:事务层、数据链路层、物理层。我画了张图,大家感受一下:

PCIe分层模型 设备A(Root Complex) 事务层(Transaction Layer) TLP生成/解析 事务排序、流量控制 数据链路层(Data Link Layer) DLLP交换、CRC校验 ACK/NAK重传机制 物理层(Physical Layer) 8b/10b编码、串行化 链路训练、电气特性 设备B(Endpoint) 事务层(Transaction Layer) TLP生成/解析 事务排序、流量控制 数据链路层(Data Link Layer) DLLP交换、CRC校验 ACK/NAK重传机制 物理层(Physical Layer) 8b/10b编码、串行化 链路训练、电气特性 差分信号对

这张图我画得比较直观。每个设备内部都分三层,层与层之间通过接口通信。数据从上层往下传,每层加自己的头信息,到了物理层变成串行比特流发出去。接收端反过来,一层层剥开,拿到原始数据。

1.3.1 事务层(Transaction Layer)

事务层是最上层,也是跟软件打交道最多的层。它负责生成和解析TLP(Transaction Layer Packet)。说白了,CPU要读写数据,事务层就把这个请求打包成TLP,扔给下层处理。

事务层还管流量控制。每个设备都有信用额度(Credit),发数据前先看看对方有没有足够的接收空间。我刚开始学PCIe时,总觉得这玩意儿多此一举。直到有一次调试,发现设备因为接收缓冲区溢出导致数据丢失,才明白流量控制有多重要。

避坑指南:我曾经遇到过一个案例,某款FPGA实现的PCIe IP核,事务层的VC(Virtual Channel)配置搞错了,导致高优先级的中断请求被低优先级的数据传输堵死。查了三天才找到原因。记住——VC配置一定要跟实际业务场景匹配。

1.3.2 数据链路层(Data Link Layer)

数据链路层是中间层,负责可靠传输。它给TLP加上序列号和CRC校验码,组成DLLP(Data Link Layer Packet)。接收方收到后检查CRC,对了就回ACK,错了就回NAK要求重传。

这个机制保证了数据在链路上传输的可靠性。你想想看,物理层传的是高速串行信号,受噪声干扰难免出错。数据链路层就是兜底的——错了就重传,直到对方收到为止。

我习惯把数据链路层比作快递公司的中转站。包裹(TLP)到了中转站,工作人员(数据链路层)给每个包裹贴标签(序列号)、检查有没有破损(CRC),然后装车发走。下一站收到后,确认没问题就签收(ACK),有问题就退回重发(NAK)。

1.3.3 物理层(Physical Layer)

物理层是最底层,负责真正的信号传输。它把并行数据串行化,通过差分信号对发出去。PCIe用8b/10b编码(Gen1/Gen2)或128b/130b编码(Gen3+),保证直流平衡和时钟恢复。

物理层还负责链路训练——设备上电后,物理层自动协商链路宽度和速率。我记得有一次调试,板子上的PCIe链路死活只能跑x1,查了半天发现是PCB布线时有一对差分线长度差了200mil。嗯,物理层的东西,细节决定成败。

个人建议:做PCIe硬件设计时,物理层的PCB布线一定要严格遵循等长要求。x1链路还好说,x16链路要是有一对线没走好,整个链路可能降速甚至训练失败。我一般要求差分对内等长控制在5mil以内,对间等长控制在20mil以内。

小结

PCIe从PCI/PCI-X的并行共享总线,进化到了串行点对点架构。三层分层模型各司其职——事务层管数据打包和流量控制,数据链路层管可靠传输,物理层管信号收发。这个架构设计得相当精巧,既保证了高性能,又兼顾了可靠性。

好了,这一章就聊到这儿。下一章咱们深入事务层,看看TLP到底长什么样。


公众号:蓝海资料掘金营,微信deep3321