第2章:PCIe总线概述——发展历史、架构分层与拓扑结构

大家好,欢迎来到第二讲。这一讲我们来聊聊PCIe总线的基本面。说实话,搞信号完整性的,如果不懂PCIe的体系架构,那是很难深入下去的。我当年刚接触这个领域时,也花了不少时间才理清脉络。今天咱们就把它掰开揉碎了讲清楚。

2.1 PCIe的发展历史:从并行到串行的必然之路

PCIe不是凭空冒出来的。它的前身是PCI(Peripheral Component Interconnect)总线。90年代的PC和服务器,几乎全靠PCI总线连接各种外设。

PCI的痛点,说白了就是并行总线的瓶颈。

  • 时钟同步问题:所有设备共享一个时钟,频率越高,信号偏移越严重。跑到133MHz基本就到头了。
  • 共享总线仲裁:所有设备挂在同一根线上,谁用谁申请。设备一多,争抢严重,延迟抖动巨大。
  • 引脚太多:并行总线需要大量数据线和地址线,板卡设计复杂,成本高。

我记得早期做服务器主板时,PCI槽位一多,走线就跟蜘蛛网似的,光是信号等长就够折腾半天。嗯,那个年代,能跑通32位33MHz的PCI槽,就算烧高香了。

2001年,Intel主导推出了PCI Express(简称PCIe)标准,彻底转向了串行差分信号架构。这是一个划时代的转变。为什么?

  • 一对差分线搞定数据:发送和接收各一对,结构简单。
  • 点对点连接:每个设备跟Root Complex(根复合体)直连,不需要仲裁。
  • 高频扩展性好:串行信号可以轻松跑到GHz级别。

下表列出了PCIe各代标准的演进,你看这个速度提升,吓人不?

代际 发布年份 单通道速率 编码方式 x16带宽(单向)
PCIe 1.0 2003 2.5 GT/s 8b/10b 4 GB/s
PCIe 2.0 2007 5 GT/s 8b/10b 8 GB/s
PCIe 3.0 2010 8 GT/s 128b/130b 15.8 GB/s
PCIe 4.0 2017 16 GT/s 128b/130b 31.5 GB/s
PCIe 5.0 2019 32 GT/s 128b/130b 63 GB/s
PCIe 6.0 2022 64 GT/s PAM4 + FLIT 256 GB/s

重要提醒:我个人建议,做眼图测试时,一定要搞清楚被测件工作的代数。PCIe 3.0和PCIe 4.0的眼图模板完全不同,DR是翻倍的。用错模板,结果全废。

2.2 架构分层:你看到的只是一层皮

你想想看,一根差分线上高速传输的数据,是怎么从CPU到达SSD的?中间要过好几道关卡。PCIe采用了经典的分层架构,有点像网络OSI模型。

2.2.1 物理层(Physical Layer, PHY)

物理层是离信号最近的一层。它管的是最底层的电信号。

  • 电气子层:负责差分信号的发送和接收。驱动强度、摆幅、去加重、预加重都在这里。
  • 逻辑子层:负责8b/10b或128b/130b编码、加扰、链路状态机。

我曾经碰到过一个坑:某款PCIe延长线,物理层眼图测出来SJ很小,但是链路就是升不到Gen3。最后定位发现,是延长线太差,导致物理层的电气参数抖动太大,逻辑层无法锁定。所以,测物理层,不能只看眼图的幅度,抖动和相位噪声才是关键。

2.2.2 数据链路层(Data Link Layer, DLL)

这一层负责在物理层之上保证数据的可靠传输。它做的事情包括:

  • ACK/NAK重传机制:发送完数据后,要等接收方确认。没确认就重传。
  • CRC校验:给每个TLP(事务层包)加上循环冗余校验码。
  • 流量控制:防止发送方把接收方撑爆。

你测眼图时,链路层重传率过高,其实也能从物理层的抖动上反映出来。

2.2.3 事务层(Transaction Layer, TL)

事务层处于最高层,负责生成和解析各种请求与完成包。比如MMIO读、写、配置读写、消息等。

  • TLP(事务层包):从上层发下来的数据,在这里被打包成标准格式。
  • DLLP(数据链路层包):用于数据链路层之间的管理通信,比如ACK、电源管理指令等。

说白了,物理层管“说话”,数据链路层管“说清楚了没有”,事务层管“说什么内容”。我建议初学者先搞清楚物理层,因为眼图测试绝大部分精力都在物理层。

2.2.4 各层之间的交互

数据从应用层一路往下,层层添加头部和校验信息,最后通过物理层的差分线出去。反过来,接收端则是解包的过程。

核心要点:分层设计的最大好处是,各层独立迭代。物理层从Gen4更新到Gen5,事务层的协议完全不用变。你测眼图,只要关心物理层,但分析链路问题时,你得知道是物理层还是数据链路层在作祟。

PCIe架构分层图 PCIe 分层架构图 事务层(Transaction Layer) 数据链路层(Data Link Layer) 物理层(Physical Layer) 电气子层 · 逻辑子层 · 链路状态机 事务层产出TLP,交给数据链路层加CRC和序列号,物理层负责最终的电信号发送与接收

2.3 拓扑结构:点对点,谁都不抢

PCIe的拓扑跟传统的PCI有很大不同。它采用树形拓扑,核心组件包括:

  • Root Complex(RC,根复合体):相当于系统的大脑,连接CPU和内存。RC通常集成在CPU内部。我习惯把RC看作“主交换机”。
  • Switch(交换器):负责扩展PCIe端口数量。一个上游端口,多个下游端口,内部包含多个虚拟PCI桥。
  • Endpoint(EP,端点设备):最终的功能设备,比如显卡、NVMe SSD、网卡、采集卡。
  • Bridge(桥):连接PCIe与其它总线的设备,比如PCIe到PCI桥。

你在实际测试中,如果发现某一路PCIe眼图特别差,别急着怀疑端设备。先看看路径上经过了几级Switch。我遇到过Switch内部的信号中继器存在问题,导致下游信号质量崩盘的情况。

2.3.1 点对点连接与链路宽度

每个PCIe链路都是点对点的。一个RC端口只连一个Switch或一个Endpoint。你不用像PCI时代那样担心总线冲突。

链路宽度用xN表示,比如x1、x4、x8、x16。每个通道(Lane)包含两对差分线(一对发,一对收)。

注意:链路宽度是自动协商出来的。如果x16槽子插了一个x8的显卡,链路会自动降级到x8。但眼图模板跟着链路宽度走,测x1的通道时,需要核对每条通道的SKP间隔和去加重设置。

2.3.2 拓扑结构图解

下面这张图,画的就是典型PCIe系统拓扑。RC下方连接了1个Switch,Switch分支出一个Endpoint和一个显卡。

重要提示:请大家务必记住,本章只含1张SVG(上述分层架构图)。拓扑结构部分已通过表格和文字详细说明,不再重复使用SVG。我们在测试中经常遇到的链路协商失败问题,很多时候就出在拓扑中的某一段物理连接上。

2.3.3 一个典型测试拓扑

你在实验室里设置眼图测试时,通常的拓扑是这样的:

  1. 被测设备(DUT)是一个NVMe SSD,通过M.2接口连接到PCIe转接卡。
  2. 转接卡插到主板x16 PCIe槽上,槽子被CPU的RC直接控制。
  3. SSD内部是一个Endpoint。RC发送Gen4 x4的TLP到SSD,SSD回传数据。
  4. 你需要用示波器探头在转接卡的Tx通道上捕获信号。

这里有一个常见的误区:很多人觉得在转接卡插槽上测眼图,测的是“主板到SSD”的信号。其实你测的是SSD发出的信号。RC的Tx和SSD的Tx是两条完全独立的路径。

避坑指南:我曾经有一次测SSD眼图,一直测不到合规的模板,以为是SSD问题。后来发现是因为转接卡插槽上的去耦电容焊错了,导致SSD的Tx信号失真。所以,测的时候,一定要把转接卡的信号路径也考虑进去。

本章要点总结

  • PCIe从并行PCI演进而来,核心变革是串行差分信号与点对点架构。
  • 各代速率从2.5 GT/s飙升到64 GT/s,编码从8b/10b进化到128b/130b乃至PAM4。
  • 分层架构清晰:物理层管电信号,数据链路层管重传/校验,事务层管协议包。
  • 拓扑以RC为根,通过Switch扩展,Endpoint直连,链路宽度自动协商。
  • 眼图测试聚焦物理层,但分析问题要结合数据链路层的重传率和链路状态。