自 1992 年引入以来,PCI(Peripheral Component Interconnect)标准一直是计算机系统内部通信的重要组成部分。随着技术的进步,PCIe(Peripheral Component Interconnect Express)于 2003 年推出,它提供了一个更高效、更高带宽的接口。随着时间的发展,PCIe 已经成为现代计算平台的标准,从最初的 1.0 版本发展到了如今的 6.0 版本。
如果说 AMBA AXI/ACE/CHI 是 SoC 内部的总线,那么 PCIe 就是计算机板级的总线了。PCIe 不仅支持高速数据传输,还具备低延迟、高可靠性和灵活性,这些特点使其成为连接各种外设(如显卡、存储设备、网络适配器等)到主板的主要手段。无论是个人计算机还是企业级服务器,PCIe 都是不可或缺的一部分。作为板级芯片和芯片互联的主要数据通路,PCIe 作用越来越重要。了解 PCIe 对一个 SoC 的从业者,是十分必要的。
1. PCIe 基础知识
- 什么是 PCIe?
PCIe 是一种点对点的高速串行连接方式,设计用于替代旧式的并行总线架构。它使用了分层的体系结构,其中每一层负责特定的功能:
1.1 PCIE 通道配置
PCI Express(PCIe)的通道(lane)配置是决定 PCIe 设备性能的关键因素。通道配置通常用“x”后跟一个数字表示,如 x1、x4、x8、x16 等,这个数字代表了有多少个独立的 PCIe 通道被使用,即有几个 lane。这些配置影响了设备的带宽和数据传输速率,从而影响了整体的系统性能。x32 基本没有产品实现过,所以一般最大是 x16.
x1:这是最小的通道配置,只使用一个 PCIe 通道。尽管带宽最低,但它足够用于低带宽需求的设备,如一些网络适配器、声卡或 USB 扩展卡。
x4:使用四个 PCIe 通道,提供了四倍于 x1 配置的带宽。这样的配置常用于需要更高带宽但又不需要 x8 或 x16 带宽的设备,如某些高速的存储解决方案或中等带宽需求的网络卡。
x8:配置有八个 PCIe 通道,提供了八倍于 x1 配置的带宽。x8 通常用于高性能的存储设备,如 RAID 控制器。
x16:这是最常见的高性能配置,使用 16 个 PCIe 通道,提供了 16 倍于 x1 配置的带宽。x16 配置主要用于图形卡(GPU),因为这些设备需要非常高的带宽来处理大量的图形数据。
x32:虽然 PCIe 规范中定义了 x32 配置,但实际上很少见。理论上,x32 配置将提供 32 倍于 x1 配置的带宽,但由于成本、功耗和设计复杂性,大多数系统中并未采用这种配置。
1.2 PCIe 版本演变
- 从 PCIe 1.0 到最新版本的关键变化
- PCIe 1.0:提供 2.5 GTps 的单向带宽,每个通道的最大传输速率为 250 MB/s。
- PCIe 2.0:带宽翻倍至 5.0 GTps,每个通道的最大传输速率为 500 MB/s。
- PCIe 3.0:再次翻倍至 8.0 GTps,每个通道的最大传输速率为 1 GB/s,同时提高了编码效率,从 8b/10b 编码改为 128b/130b 编码。
- PCIe 4.0:带宽达到 16.0 GTps,每个通道的最大传输速率为 2 GB/s。
- PCIe 5.0:最新版本,带宽为 32.0 GTps,每个通道的最大传输速率为 4 GB/s。
- PCIe 6.0:带宽达到 64.0 GTps,每个通道的最大传输速率为 8 GB/s,引入了 PAM4 调制技术,进一步提高传输效率。
对应表格如下:
1.3 版本兼容
PCIe 设计时考虑了向下兼容性,即较新的设备可以在较老的系统上工作,尽管可能达不到最佳性能。例如,一个 PCIe 4.0 设备可以插入到 PCIe 3.0 插槽中,但只能以 PCIe 3.0 的速度运行。
2.PCIE 架构及主要组件
2.1 架构层次
PCIe 架构可以分为以下几层:
- 应用层:这不是 PCIe 规范正式定义的一部分,而是由具体实现者根据需求设计的部分。应用层决定了设备的功能和类型,例如存储设备、网络适配器或图形卡。
- 事务层(Transaction Layer):负责处理事务的初始化和完成,包括读取、写入、配置和中断等操作。事务层还管理事务的优先级和流量控制,确保数据请求和响应的高效处理。
- 数据链路层(Data Link Layer):分为两个子层:
- 链路子层(Link Sublayer):负责链路的建立、训练、维护和错误检测,确保数据包的准确传输。
- 物理媒体附件子层(Physical Media Attachment Sublayer):负责数据的编码和解码,确保数据在物理层的正确传输。
- 物理层(Physical Layer):包括电气信号的生成、接收和处理,以及串行数据的编码和解码。物理层进一步细分为两个子层:
- 电气子层(Electrical Sublayer):处理电气信号的生成和接收,确保信号的完整性和稳定性。
- 介质访问控制子层(Media Access Control Sublayer):管理数据在物理介质上的传输,包括信号的编码和解码。
通过这种分层架构,PCIe 能够实现高效、可靠的数据传输,满足各种应用场景的需求。
2.2 主要组件
PCIe 架构的主要组件包括:
- Root Complex (RC):通常位于系统主板上,与 CPU 紧密集成,作为 PCIe 架构的起点。Root Complex 负责初始化和配置 PCIe 总线,管理事务处理,并提供到 CPU 和内存的接口。
- Switches:允许构建复杂的 PCIe 拓扑,通过连接多个端点设备或其他 Switches,实现灵活的系统架构。Switches 可以扩展 PCIe 总线,允许更多设备连接到系统中,从而提高系统的扩展性和灵活性。Switch 可以将一个上游端口连接到多个下游端口,实现多路径传输。
- Endpoint (EP):连接到 PCIe 总线的终端设备,如显卡、存储控制器、网络适配器等。它们是 PCIe 总线的消费者,与 Root Complex 或 Switches 相连,执行具体的 I/O 操作和数据处理任务。
- PCI Express to PCI/PCI-X Bridge :PCI Express 到 PCI/PCI-X 桥接器提供了一个连接 PCI Express 架构和 PCI/PCI-X 层次结构的接口,使现代 PCI Express 系统能够与传统的 PCI 或 PCI-X 设备兼容。
2.3 配置空间与地址映射
每个 PCIe 设备都有一个配置空间,其中包含了设备的信息和控制寄存器。配置空间分为多个寄存器,包括 Vendor ID、Device ID、Class Code、BAR(Base Address Register)等。地址映射确保了主机能够正确地寻址和通信,通过配置空间可以读取和修改设备的状态和设置。
3.PCIe 硬件层次概要
PCI Express 使用数据包在组件之间传输信息。数据包在事务层和数据链路层形成,以携带信息从发送组件传输到接收组件。当传输的数据包流经其他层时,会被添加必要的附加信息,以便在这些层处理数据包。在接收端,这一过程相反,数据包从物理层表示形式转换为数据链路层表示形式,最终(对于事务层数据包)转换为接收设备的事务层可以处理的形式。下图展示了事务级数据包信息通过各层的概念流程。
3.1 事务层(Transaction Layer)
架构的上层是事务层。事务层的主要职责是组装和拆解事务层数据包(TLP)。TLP 用于通信事务,如读取和写入,以及某些类型的事件。事务层还负责管理基于信用的流量控制。每个需要响应包的请求包都实现为分离事务。每个包都有一个唯一的标识符,使响应包能够定向到正确的发起者。包格式支持不同的寻址形式,具体取决于事务的类型(内存、I/O、配置和消息)。包还可以具有诸如 No Snoop、Relaxed Ordering 和 ID-Based Ordering (IDO)等属性。
事务层支持四种地址空间:它包括三种 PCI 地址空间(内存、I/O 和配置),并增加了消息空间。PCIe 规范使用消息空间来支持所有先前的侧带信号,如中断、电源管理请求等,作为带内消息事务。可以将 PCI Express 消息事务视为“虚拟线”,因为它们的效果是消除了目前平台实现中使用的大量侧带信号。
事务层传输的基本单位是 TLP(Transaction Layer Packet),事务层包,是在 PCIe 链路上进行数据传输的基本单位。TLP 包含了事务的所有必要信息,包括请求类型、目标地址、数据负载等。
TLP 通常由以下几个部分组成:
- 包头(Header):包含有关事务的元数据,如事务类型、地址、长度、事务 ID 等。
- 数据负载(Data Payload):包含实际要传输的数据。
- 尾部(Tail):可选部分,通常用于表示 TLP 的结束。
TLP 类型和四种地址空间对应:
- Memory Read/Write:用于内存读写操作。
- I/O Read/Write:用于 I/O 地址空间的读写操作。
- Configuration Read/Write:用于设备配置空间的读写操作。
- Message:用于发送控制信息,如中断、电源管理命令等。
3.2 数据链路层(Data Link Layer)
PCIe 链路的中间层是数据链路层,它作为事务层和物理层之间的中间阶段。数据链路层的主要职责包括链路管理和数据完整性,包括错误检测和错误纠正。
数据链路层的发送端接受由事务层组装的 TLP,计算并应用数据保护代码和 TLP 序列号,然后提交给物理层进行跨链路传输。接收端的数据链路层负责检查接收到的 TLP 的完整性,并将它们提交给事务层进行进一步处理。在检测到 TLP 错误时,这一层负责请求重新传输 TLP,直到信息正确接收,或确定链路已失效。
数据链路层还生成和消耗用于链路管理功能的包。为了区分这些包与事务层使用的 TLP,当提到由数据链路层生成和消耗的包时,将使用术语数据链路层包(DLLP)。
数据链路层负责可靠地将事务层(Transaction Layer)提供的 TLP(Transaction Layer Packet)通过 PCI Express 链路传输到另一组件的事务层。数据链路层提供的服务包括:
数据交换
- 接受事务层提供的 TLP 并将其传递给物理层(Physical Layer)进行传输。
- 接受物理层从链路接收到的 TLP 并将其传递给接收事务层。
错误检测和重试
- 生成 TLP 序列号和 LCRC(Link Cyclic Redundancy Check)。
- 存储已传输的 TLP 以支持数据链路层重试。
- 对 TLP 和数据链路层包(DLLP)进行数据完整性检查。
- 生成正确认和负确认 DLLP。
- 提供错误报告和记录机制的错误指示。
- 链路确认超时重播机制。
初始化和电源管理
- 跟踪链路状态并将其活动/复位/断开状态传达给事务层。
数据链路层为 PCIe 链路执行三个关键服务:
- 事务层数据包(TLP)的排序:由事务层生成的 TLP 按顺序排列。
- 确保 TLP 在两个端点之间的可靠传输:通过确认协议(ACK 和 NAK 信号)明确要求重传未确认/错误的 TLP。
- 初始化和管理流量控制信用:确保链路的流量控制。
在发送端,数据链路层为每个出站 TLP 生成一个递增的序列号。这个序列号作为每个传输 TLP 的唯一标识标签,并插入到出站 TLP 的头部。每个出站 TLP 的末尾还附加了一个 32 位的循环冗余校验码(在 PCIe 上下文中称为链路 CRC 或 LCRC)。
在接收端,接收的 TLP 的 LCRC 和序列号都在链路层进行验证。如果 LCRC 检查失败(表明数据错误),或者序列号不在范围内(与上次有效接收的 TLP 不连续),则认为该 TLP 及其之后接收到的所有 TLP 无效并丢弃。接收器发送一个带有无效 TLP 序列号的否定确认消息(NAK),请求重新传输该序列号之后的所有 TLP。如果接收到的 TLP 通过了 LCRC 检查且序列号正确,则认为它是有效的。链路接收器递增序列号(跟踪最后接收到的好 TLP),并将有效的 TLP 转发到接收器的事务层。发送一个 ACK 消息到远程发送器,指示 TLP 成功接收(并且隐含地,所有具有过去序列号的 TLP 也成功接收)。
如果发送器接收到 NAK 消息,或者在超时期限内没有收到任何确认(NAK 或 ACK),发送器必须重新传输所有没有正面确认(ACK)的 TLP。除非设备或传输介质持续故障,否则链路层向事务层呈现一个可靠的连接,因为传输协议确保了在不可靠介质上的 TLP 传输。
除了发送和接收由事务层生成的 TLP,数据链路层还生成和消耗数据链路层数据包(DLLP)。ACK 和 NAK 信号通过 DLLP 进行通信,还有一些电源管理消息和流量控制信用信息(代表事务层)。
实际上,链路上未确认的 TLP 数量受两个因素限制:发送器的重放缓冲区的大小(必须存储所有传输的 TLP 副本,直到远程接收器确认它们)和接收器向发送器发出的流量控制信用。PCI Express 要求所有接收器发出最低数量的信用(credits),以确保链路允许发送 PCIConfig TLP 和消息 TLP。
3.3 PCIe 物理层(Physical Layer)
物理层包括所有接口操作所需的电路,包括驱动器和输入缓冲器、并行到串行和串行到并行转换、PLL(锁相环)和阻抗匹配电路。它还包括与接口初始化和维护相关的逻辑功能。物理层以实现特定的格式与数据链路层交换信息。这一层负责将从数据链路层接收到的信息转换为适当的串行格式,并以与链路另一端连接的设备兼容的频率和宽度进行传输。
PCI Express 架构具有“hooks”,“hooks”指的是预先设计的机制或接口,用于支持未来的技术改进和性能提升。具体来说,这些“hooks”允许在未来引入更高的速度、更先进的编码技术和新的传输介质,而不会对整个系统的架构造成重大改动。这些机制通常包括预留的参数、扩展接口或可配置的选项,以便在需要时进行更新或扩展。
PCIe 物理层规范分为两个子层,分别对应电气和逻辑规范。逻辑子层有时进一步划分为 MAC 子层和 PCS(物理编码子层),尽管这种划分不是 PCIe 规范的正式部分。
逻辑子块有两个主要部分:
- 传输部分(Transmit Section):准备从数据链路层传递过来的出站信息,以便由电气子块进行传输。
- 接收部分(Receiver Section):识别并准备接收到的信息,然后将其传递给数据链路层。
逻辑子块和电气子块通过状态和控制寄存器接口(或功能等效接口)协调每个收发器的状态。逻辑子块负责物理层的控制和管理功能。
编码方式
PCI Express 使用不同的编码方式,具体取决于数据速率:
- 当数据速率为 2.5 GT/s 或 5.0 GT/s 时,使用 8b/10b 编码。
- 当数据速率大于或等于 8.0 GT/s 时,使用 128b/130b 编码。
PCIe Spec 只是规定了物理层需要实现的功能、性能与参数等,至于如何实现这些却并没有明确的说明。也就是说,厂商可以根据自己的需要和实际情况,来设计 PCIe 的物理层
3.4 链路效率(Efficiency of the link)
正如任何“网络”通信链路一样,一些“原始”带宽被协议开销所消耗。例如,PCIe 1.x 车道在物理层之上提供的数据速率为 250 MB/s(单工)。这并不是有效负载带宽,而是物理层带宽。
额外信息:PCIe 车道必须携带额外的信息以实现完整功能。
这些额外的信息包括协议开销,如编码开销、头部信息、错误检测和纠正码等,这些都会占用一部分带宽。因此,实际的有效负载带宽会低于物理层带宽。
对于 PCI Express(PCIe)而言,协议开销主要包括以下几个方面:
- 编码开销
8b/10b 编码:在 PCIe 1.x 和 2.x 中使用 8b/10b 编码。每 8 位数据被编码为 10 位,这意味着编码开销为 20%。
对于 8b/10b 编码:
对于 128b/130b 编码:在 PCIe 3.x 及更高版本中使用 128b/130b 编码。每 128 位数据被编码为 130 位,这意味着编码开销为 1.5625%。
- 头部开销
- TLP 头部:每个 TLP(Transaction Layer Packet)都包含一个头部,头部大小取决于 TLP 的类型和复杂性。常见的 TLP 头部大小在 16 字节到 32 字节之间。
- DLLP 头部:每个 DLLP(Data Link Layer Packet)也包含一个头部,头部大小通常较小,约为 4 字节。
- 错误检测和纠正码
- CRC(Cyclic Redundancy Check):用于检测数据传输中的错误。对于 TLP,使用 32 位的 LCRC(Link Cyclic Redundancy Check)。
- ECRC(Enhanced Cyclic Redundancy Check):用于增强数据传输的可靠性,通常为 32 位。
- 控制符号(Control Symbols)
- 有序集(Ordered Sets):用于链路管理,如链路训练和状态管理。常见的有序集包括 SKP(Skip Ordered Set)和 TS(Training Sequence)。
- 空闲符号(Idle Symbols):用于维持链路的活动状态,防止链路进入低功耗模式。
举例来说,假设我们有一个 PCIe 1.x 通道,其物理层带宽为 250 MB/s(单工), 我们来计算一下有效负载带宽
- 编码开销:
- 8b/10b 编码的开销为 20%,因此实际的物理层带宽为:
- 头部开销:
假设每个 TLP 的头部为 16 字节,每个 TLP 的数据负载为 1024 字节,则每个 TLP 的总大小为 1040 字节。
头部开销为:
- 错误检测和纠正码:
假设每个 TLP 的 LCRC 为 32 位(4 字节),则每个 TLP 的总大小为 1044 字节。
错误检测开销为:
- 控制符号:
- 控制符号的开销通常较小,假设为 1%。
综合以上开销,有效负载带宽可以估算为:
4.PCIe 电源管理(Power Management)
在低功耗越来越重要的今天,功耗管理是一个协议非常重要的部分,有可能是成功的关键部分。
PCIe 协议规定的电源管理状态如下:
- D 状态:与特定功能相关联
- D0:操作状态,消耗最多的电能
- D1 和 D2:中间省电状态
- D3 Hot:非常低的电能状态
- D3 Cold:断电状态
- L 状态:与特定链路相关联
- L0:操作状态
- L0s, L1, L1.0, L1.1, 和 L1.2:各种低电能状态
电源管理提供以下服务:
- 识别功能的电源管理能力的机制
- 将功能转换到特定电源管理状态的能力
- 通知功能的当前电源管理状态
- 在特定事件上唤醒系统的选项
PCI Express (PCIe) 链路电源管理状态旨在在链路不主动传输数据时减少功耗。这些状态由活动状态电源管理 (ASPM) 管理,并且可以由硬件自主地进入和退出。下面是链路电源管理状态总结表。详细的信息内容非常多,可以查阅 PCIe 的协议。
总结
PCIe 凭借其卓越的性能、灵活的设计和强大的生态系统,将继续在未来的计算平台中发挥核心作用。随着技术的不断进步,我们可以期待 PCIe 带来更多的创新和可能性。例如,未来的 PCIe 版本可能会引入更高的带宽、更低的延迟和更强的安全性,以满足日益增长的计算需求。
对于希望利用 PCIe 技术的开发者和工程师来说,了解其底层机制和高级特性至关重要。此外,关注最新的标准更新和技术趋势也是必不可少的。建议开发者和工程师:
- 学习 PCIe 的英文资料最经典的是 Mindshare 的 PCI Express SYSTEM ARCHITECTURE,网上有英文版本和中文版本,找不到的可以留下邮箱我发给你。
- 深入学习 PCIe 协议规范,掌握其物理层、数据链路层和事务层的详细工作原理。
- 关注 PCIe 的最新版本和标准更新,了解新的特性和优化。
- 以 PCIe 的 IP 为抓手,深入学习 PCIe 的硬件实现。
PCIe 协议非常复杂,内容众多,这里也只是简单介绍。也不算深入了解,只是对全貌做了一个基本介绍。需要做 PCIe 相关工作的,还是需要在了解全貌的基础上,以年为单位的深入去理解它。网上资料很多,还是以协议为根本。
后纪
技术很重要,技术背后的思想更重要!
技术背后的某些思想就是你解决以后问题的钥匙。我的文章可能一篇中知识点不太多,但是力求让你能深入理解,为你进阶打下基础。如果有一点点收获,也算是我对中国芯片行业的一点点贡献吧。
参考文献
- PCI-SIG. (2021). PCI Express Base Specification Revision 5.0. PCI Special Interest Group.
- PCI-SIG. (2022). PCI Express Base Specification Revision 6.0. PCI Special Interest Group.
- Intel Corporation. (2019). PCI Express Technology Overview.
- NVIDIA Corporation. (2020). NVMe over Fabrics Technical Overview.
- AMD Corporation. (2021). PCIe 4.0 and 5.0 Whitepaper.
END
文章来源:处芯积律
推荐阅读
- 当机器人学会扫堂腿:一场踢向万亿市场的芯片机遇
- 递归设计:高效实现前导 0 计算电路
- 一文搞懂 CRC 的并行实现
- 浅谈 PCIe PHY:Original 与 SerDes PIPE Architecture 对比
- 用“北京地铁图”看懂 SoC 设计
更多 IC 设计干货请关注IC设计专栏。欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。