学习 PCIe(Peripheral Component Interconnect Express)协议,最快的方法和 AXI 类似:先抓分层架构与核心术语。
PCIe 是一种点对点(Point-to-Point)、串行、基于数据包(Packet-based)的高速总线协议。与 AXI 这种片上总线(On-Chip Bus)不同,PCIe 是片外/板级总线,它要解决的是芯片与芯片、单板与单板之间的大带宽通信。
以下是为你量身定制的 PCIe 协议核心笔记总结:
1. Topography (拓扑结构与核心概念)
PCIe 不再像传统 PCI 那样让所有设备共享一根总线,而是采用树状拓扑。
- RC (Root Complex,根复合物):系统的“大脑”,通常集成在 CPU 内部,是整个 PCIe 树的根节点。负责发起 CPU 与 PCIe 设备之间的通信,管理内存映射。
- EP (Endpoint,终端设备):PCIe 树的“叶子”,也就是具体的物理设备,如 GPU、NVMe 固态硬盘、网卡。
- Switch (交换器):提供扩展口,允许一个 PCIe 端口连接多个 EP(类似于网络交换机)。
- Lane (车道/通道):PCIe 的一条 Lane 由两对差分信号线组成(Rx 一对,Tx 一对),实现全双工通信。x1, x4, x8, x16 代表并联的 Lane 数量。
2. Protocol Layers (核心三层架构)
PCIe 的数据流是分层处理的,从上到下分为三层。每一层都会给数据包加上专属的“机头和机尾”。
2.1 Transaction Layer (事务层)
- 核心任务:处理最高层的业务逻辑。它将 CPU 或 DMA 的读写请求打包成 TLP (Transaction Layer Packet,事务层数据包)。
- 核心内容:包含 Header(包含路由信息、地址、Tag、属性)和 Payload(实际数据)。
2.2 Data Link Layer (数据链路层)
- 核心任务:确保两点之间的通信绝对可靠。它负责在 TLP 外面再套一层,变成 DLLP (Data Link Layer Packet)。
- 核心机制:
- ACK/NAK 机制:接收端收到数据并校验无误回 ACK,发现错误回 NAK(要求发送端重发)。
- Flow Control (流控/Credit 机制):接收端会告诉发送端自己还有多少缓存空间(Credit)。如果接收端满了,发送端就必须憋着不能发,防止数据丢包。
2.3 Physical Layer (物理层)
- 核心任务:负责将电气信号真正发送出去。它处理 8b/10b 或 128b/130b 编码、串行化(Serializing)、加扰码(Scrambling,防止电磁干扰)以及 LTSSM(链路训练和状态机)。
3. Transaction Types & Routing (事务类型与路由)
PCIe 的通信完全通过 TLP 包来实现,主要有四大事务类型:
| 事务类型 (Type) | 缩写 | 作用 | 路由方式 (Routing) |
| Memory | Mem | 读写主存数据(DMA 搬运的核心) | 基于地址 (Address) |
| I/O | IO | 访问老式外设的 I/O 空间(现代系统极少用) | 基于地址 (Address) |
| Configuration | Cfg | 系统启动时,RC 去枚举和配置 EP 的寄存器 | 基于 ID (Bus/Device/Func 号) |
| Message | Msg | 传输中断(MSI/MSI-X)、错误报告、功耗管理等信号 | 隐式路由 / 广播 |
4. TLP Packet Structure (数据包结构补充)
在笔记中,一定要记住一个 TLP 是长什么样的(它在各层被包装的过程):
+-------------------------------------------------------------+
| Physical Layer: [ Start Frame ] |
| Data Link Layer: [ Sequence Number ] |
| Transaction Layer: [ TLP Header ] [ Payload ] [ ECRC ] |
| Data Link Layer: [ LCRC (校验和) ] |
| Physical Layer: [ End Frame ] |
+-------------------------------------------------------------+
- ECRC:端到端校验(Transaction 层生成,EP 到 RC 整体校验)。
- LCRC:链路校验(Data Link 层生成,相邻的两个设备间一步一校验)。
5. Ordering Model (保序模型)
类似于 AXI 的 ID 机制,PCIe 也有严格的保序规则,防止后发出的数据先写入,导致逻辑混乱。
- Relaxed Ordering (宽松保序 - RO):如果 TLP 里的 RO 属性位置 1,允许该数据包插队(绕过前面被阻塞的数据包),以提升总线吞吐量。
- ID-Based Ordering (基于 ID 保序 - IDO):来自不同发出者(Requester ID 不同)的数据包可以乱序执行。
- Strong Ordering (强保序):默认情况下,相同流量类型(TC)的写请求(Posted)必须严格按发出顺序到达,读请求不能越过写请求。
6. Interrupts & Power Management (中断与原子/高级特性)
6.1 Interrupts (中断机制演进)
- INTx:传统的引脚中断(通过硬件连线),效率低、容易冲突,PCIe 已不推荐。
- MSI / MSI-X (Message Signaled Interrupts):带内中断(In-band Interrupt)。设备中断 CPU 不再拉硬件引脚,而是直接向 CPU 指定的内存地址写一个特定的 TLP 数据包。MSI-X 支持更多、更灵活的中断向量,现代高性能设备(如 NVMe、GPU)标配。
6.2 Atomic Operations (原子操作)
PCIe 3.0 之后引入了 AtomicOps。允许 EP 直接对主存(Host Memory)发起原子操作(如 FetchAndAdd, CompareAndSwap)。这对于 GPU、FPGA 加速器与 CPU 之间共享内存、同步信号量至关重要,不需要像以前那样让 CPU 介入频繁干预。
💡 AXI 与 PCIe 的思维映射对照(帮助你快速记忆)
- AXI 的 VALID/READY 握手 → 在 PCIe 中进化成了数据链路层的 ACK/NAK 和 Flow Control (Credit) 机制(因为板级长距离传输不能靠单根时钟线实时握手)。
- AXI 的 ID 乱序 → 在 PCIe 中对应 Transaction ID (Bus/Device/Function) 和 Tag。
- AXI 的 Exclusive Access → 对应 PCIe 的 AtomicOps 事务。
你可以把这几页笔记和你的 AXI 笔记放在一起对比,片上总线(追求低延迟、握手直接)与片外总线(追求高可靠、数据包化)的差异一目了然。关于 PCIe 的某一层(比如配置空间 Cfg 或者是 LTSSM 状态机),需要再深入展开细化吗?
好的,我们把 PCIe 的这三层架构(事务层、数据链路层、物理层)做一次深度的干货总结,然后用一个最经典的“显卡(GPU)向 CPU 发起一次 DMA 读内存”的例子,把这三层串起来。
PCIe 三层架构核心总结
① 事务层 (Transaction Layer) —— 业务规划与打包
- 核心职责: 决定“干什么”。它直接面向 CPU 或设备内核,负责接收读写请求,并将其翻译成核心数据包 —— TLP(Transaction Layer Packet)。
- 关键机制:
- 地址映射与路由: 根据请求是去访问内存、配置空间还是发消息,在 TLP 头部(Header)写明目的地(地址或 ID)。
- 流量分类(TC): 给不同的数据包打上优先级标签。
- 原子操作(AtomicOps)与事务保序: 在这一层控制 TLP 是必须按顺序走,还是可以“插队(Relaxed Ordering)”。
- 生成的包裹内容:
[ TLP Header ] + [ Payload (数据,可选) ] + [ ECRC (端到端校验,可选) ]
② 数据链路层 (Data Link Layer) —— 确保绝对安全与控流
- 核心职责: 确保两点之间“安全送达”。它不关心 TLP 里装的是什么业务,它只关心包裹在从上一个设备传到下一个设备(比如从 GPU 到 Switch)的过程中有没有丢包或损坏。
- 关键机制:
- ACK/NAK 状态机: 发送 TLP 后,必须等待对方回
ACK数据包;如果对方回NAK或者是超时没动静,这一层硬件会自动重新发送该 TLP。 - Flow Control(信用额度机制/Credit): 接收方会实时告诉发送方:“我这现在还有能装 5 个包的坑(Credit)”。发送方数着坑位发包,坑满了就挂起,防止接收方溢出丢包。
- ACK/NAK 状态机: 发送 TLP 后,必须等待对方回
- 在 TLP 外部套壳: 在 TLP 头尾加上序列号(Sequence Number)和链路校验码(LCRC),变成可以通过链路传输的格式。
③ 物理层 (Physical Layer) —— 电气传输与链路训练
- 核心职责: 决定“怎么送出去”。将上层的数字信号,变成一根根差分线(Lane)上飞驰的高频微伏级电压信号。
- 关键机制:
- LTSSM(链路训练状态机): 决定 PCIe 插槽是跑在 Gen3、Gen4 还是 Gen5、Gen6 速率,识别当前插的是 x4、x8 还是 x16 的卡。
- 编码与数据处理: 进行数据加扰(Scrambling,打散数据防止电磁干扰)和电平编码(如 Gen3 之后的 128b/130b 编码),将并行数据转成串行高频信号送出。
- 最后的包装: 在数据最前和最后加上起始/结束帧标志(Start/End Frame)。
经典实例:GPU 从 Host 内存读取数据
我们假设一个场景:显卡(GPU/EP)需要从系统主存(Host Memory)的 0x9000_0000 地址读取 64 字节的神经网络权重数据。
看看这个“读请求(Memory Read Request)”和随后的“数据返回(Completion with Data)”是如何穿过这两端的三层架构的:
第一阶段:GPU 发出“我要读数据”的请求
1. GPU 事务层(出兵)
GPU 核心向其 PCIe 控制器下达指令。事务层立刻组装一个 Memory Read TLP。
- Header 里写明: “我是 GPU(Requester ID),我要去
0x9000_0000读 64 字节(Length=16 DW),我的这笔任务标签是 Tag=5。”(因为不需要写数据,所以这个 TLP 没有 Payload)。
2. GPU 数据链路层(穿防弹衣)
这个 TLP 进到数据链路层。
- 链路层在 TLP 前面贴上一个序号(比如
Seq = 101),在尾巴上根据整个包计算并贴上LCRC = 0xABCD。 - 同时,这一层会备份这个包到自己的 Replay Buffer(重发缓冲区) 中,防止路上丢了。
3. GPU 物理层(化整为零,出发)
包裹来到物理层。
- 物理层将其进行 128b/130b 编码、加扰码,并在头尾加上
Start和End标志。 - 随后,这个包被拆成 16 份,通过 x16 的高速差分线,以极高的速率(如 Gen4 的 16 GT/s)发射出去。
第二阶段:CPU 端的 Root Complex (RC) 收到并处理
1. RC 物理层(合体)
RC 接收到差分电信号,剥离 Start/End 帧,将串行信号重新拼回数字大包。
2. RC 数据链路层(安检)
- RC 的链路层检查
Seq = 101是否连续,并对包进行LCRC校验。 - 结果:校验正确! RC 的链路层立刻向 GPU 回复一个 ACK 专属小包 (DLLP)。
- (插曲:GPU 收到这个 ACK 后,就会把刚才 Replay Buffer 里备份的 101 号包安全地删掉)。
3. RC 事务层(拆包执行)
RC 事务层拿到 TLP,拆开 Header 一看:“哦,GPU 想要读 0x9000_0000 的内存。”
- RC 将请求通过系统总线(如片上 CHI/AXI)转发给 DDR 控制器。
- DDR 控制器从内存颗粒中把那 64 字节的数据给“抠”了出来,送回给 RC。
第三阶段:RC 把数据送回给 GPU(数据返回:CplD)
拿到数据后,RC 的各层开始反向包装,把数据送回给 GPU:
- RC 事务层 生成一个 CplD TLP (Completion with Data)。Header 里写着:“这货是回复给 GPU Tag=5 的请求的”,Payload 里面塞满了那 64 字节的数据。
- RC 数据链路层 贴上新的
Seq和LCRC。 - RC 物理层 串行化,从 Tx 差分线射向 GPU 的 Rx。
最后,GPU 的三层结构依次解包:物理层拼回数据 → 链路层校验并回 ACK → 事务层拆开 Header 看到 Tag=5,高喊:“老大,你要的 64 字节权重数据拿回来了!”,直接送进 GPU 核心计算单元。整个 PCIe 传输圆满结束。
PCIe与AXI对比
将 PCIe 和 AXI 放在一起对比,可以说是对计算机系统总线架构最深刻的一次复盘。
简单一句话概括它们的本质区别:AXI 是片上总线(On-Chip Bus),解决的是芯片内部“微观世界”的互联;而 PCIe 是片外/板级总线(Off-Chip/Board-Level Bus),解决的是芯片与芯片、板卡与板卡之间“宏观世界”的通信。
由于所处的物理环境截然不同,它们在设计哲学、通信机制和硬件成本上走向了完全不同的极端。
1. 核心差异横向对比
| 对比维度 | AXI 总线 (以 AXI4-Full 为例) | PCIe 总线 (以 PCIe 4.0/5.0 为例) |
| 应用场景 | 片上系统(SoC)内部。连接 CPU、DMA、GPU 与片上内存控制器。 | 板级/跨芯片互联。连接 CPU 与主板上的显卡、NVMe 固态硬盘、网卡。 |
| 物理形态 | 硅片内部的金属连线(晶体管级别的连线),距离极短(微米/毫米级)。 | PCB 走线、插槽或高速线缆,距离较长(厘米/米级)。 |
| 拓扑结构 | 总线矩阵(Interconnect/Matrix)。多对多互联,支持共享。 | 点对点(Point-to-Point)树状拓扑。RC 连 Switch 再连 EP。 |
| 时钟同步 | 同步总线。全芯片共用一个主时钟源(ACLK),线与线之间严格对齐。 | 异步/源同步总线。两端设备各自有独立时钟,数据中自带时钟恢复(Clock Recovery)。 |
| 信号类型 | 并行总线。地址、数据、控制信号各自有独立的几十根并行物理线。 | 串行总线。采用差分信号(Differential Signalling),只有发送(Tx)和接收(Rx)两对线组成一条 Lane。 |
| 传输基本单位 | 握手信号与突发(Burst)。直接操作地址、数据和控制电平。 | 数据包(Packet)。所有操作都被打包成 TLP、DLLP 报文在线上传输。 |
| 可靠性保障 | 默认绝对可靠。芯片内部物理环境稳定,基本不考虑丢包,无重发机制。 | 必须防错和重发。外部电磁干扰严重,必须通过 LCRC 校验 + ACK/NAK 机制来实现硬件级自动重发。 |
2. 深入理解:三大核心设计的碰撞
📌 第一对碰撞:并行 vs 串行(为什么 PCIe 不学 AXI 搞那么多通道?)
- AXI 追求低延迟: 芯片内部有成千上万条金属走线空间。AXI 索性任性地分了 5 个独立通道,地址、数据各走各的线。CPU 给出地址的瞬间,数据线就能传数据,没有任何打包解包的延迟。
- PCIe 追求跨PCB传输: 如果在主板上跑 128 位并行总线,物理上根本无法实现——高频下长距离的并行走线会产生严重的时钟偏斜(Clock Skew)和相互干扰。所以 PCIe 走向了串行,把地址、数据、命令全塞进一个串行数据流里,靠提高时钟频率(如 PCIe 5.0 的 32GT/s)和增加 Lane 数(x16)来对冲串行带来的延迟。
📌 第二对碰撞:VALID/READY 握手 vs ACK/NAK 信用流控
- AXI 面对面握手: AXI 的 Master 和 Slave 距离太近了,两个晶体管之间拉一根线,一眨眼(一个时钟周期)就能知道对方“行不行”(
VALID/READY同时为高)。 - PCIe 跨省寄快递: PCIe 设备之间由于距离长、速度快,发出去的电信号在路上要跑好几个时钟周期。如果还用
VALID/READY实时握手,总线大部分时间都在等信号传递,带宽直接雪崩。因此,PCIe 引入了数据链路层的 Credit 机制(接收方先圈出地皮,发送方看着地皮大小发包)和 ACK/NAK 机制,把通信变成了“异步包裹投递”。
📌 第三对碰撞:保序与乱序机制
- AXI 靠 ID 标签: AXI 区分不同的 Transaction 依靠的是
AxID。相同 ID 的必须按顺序执行,不同 ID 的可以随便乱序、甚至交织。 - PCIe 靠 TLP Header 的 Tag 属性: PCIe 发出非阻塞请求(如读请求)时,会带上一个
Tag。当接收方返回数据时,会在 CplD 包的 Header 里带上相同的Tag,告诉发送端:“这是你刚才要的那笔货”。
3. 它们在 SoC 中是如何协同的?
在现代的高性能芯片(如智能手机 SoC、智能汽车智驾芯片、服务器 CPU)中,这两者绝对不是对立的,而是里应外合的关系。
当你的电脑运行大型游戏时,GPU(显卡)需要通过主板上的 PCIe 插槽 向 CPU 发起 DMA 请求,去读取系统内存里的游戏贴图:
- 片外(PCIe 负责): 读请求通过 PCIe 链路,以数据包(TLP)的形式一路火花带闪电,经过 LCRC 校验、ACK 确认,安全送达 CPU 内部的 PCIe 控制器(RC)。
- 桥接转换: PCIe 控制器(RC)内部集成了 PCIe-to-AXI 桥接器(Bridge)。它把 PCIe 的读请求 TLP 包剥离,解包成 AXI 协议能懂的语言:将地址挂在
ARADDR上,配置好ARLEN,拉高ARVALID。 - 片内(AXI 负责): 转换后的 AXI 信号进到 CPU 内部的 AXI 总线矩阵,用极低的延迟瞬间触达 DDR 内存控制器,把数据抠出来。
- 数据再沿着原路反向包装:AXI 读数据 $\rightarrow$ PCIe 桥接打包成 CplD $\rightarrow$ 跨主板 PCIe 差分线 $\rightarrow$ 送入显卡。
总结口诀
AXI 是片内骨骼,多线并行,裸奔传输追求低延迟;PCIe 是片外高铁,串行长跑,全副武装(打包/校验/重发)确保高可靠。