深入了解PCIe协议

文摘   2024-12-24 20:51   北京  

——————————————————————————————

版权声明:

本文作者:烓围玮未。主要从事ISP/MIPI/SOC/车规芯片设计/SOC架构设计

知乎专栏:芯片设计进阶之路

微信公众号:芯片设计进阶之路(x_chip)

转发必须授权,同时保留这段声明,盗版必究!

——————————————————————————————

自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的速度运行。

  1. 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)等。地址映射确保了主机能够正确地寻址和通信,通过配置空间可以读取和修改设备的状态和设置。

  1. 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链路执行三个关键服务:

  1. 事务层数据包(TLP)的排序:由事务层生成的TLP按顺序排列。

  2. 确保TLP在两个端点之间的可靠传输:通过确认协议(ACK和NAK信号)明确要求重传未确认/错误的TLP。

  3. 初始化和管理流量控制信用:确保链路的流量控制。

在发送端,数据链路层为每个出站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)而言,协议开销主要包括以下几个方面:

  1. 编码开销

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%。

  1. 头部开销

  • TLP 头部:每个TLP(Transaction Layer Packet)都包含一个头部,头部大小取决于TLP的类型和复杂性。常见的TLP头部大小在16字节到32字节之间。

  • DLLP 头部:每个DLLP(Data Link Layer Packet)也包含一个头部,头部大小通常较小,约为4字节。

  1. 错误检测和纠正码

  • CRC(Cyclic Redundancy Check):用于检测数据传输中的错误。对于TLP,使用32位的LCRC(Link Cyclic Redundancy Check)。

  • ECRC(Enhanced Cyclic Redundancy Check):用于增强数据传输的可靠性,通常为32位。

  1. 控制符号(Control Symbols)

  • 有序集(Ordered Sets):用于链路管理,如链路训练和状态管理。常见的有序集包括SKP(Skip Ordered Set)和TS(Training Sequence)。

  • 空闲符号(Idle Symbols):用于维持链路的活动状态,防止链路进入低功耗模式。

举例来说,假设我们有一个PCIe 1.x通道,其物理层带宽为250 MB/s(单工), 我们来计算一下有效负载带宽

  1. 编码开销:

  • 8b/10b编码的开销为20%,因此实际的物理层带宽为:

  1. 头部开销:

假设每个TLP的头部为16字节,每个TLP的数据负载为1024字节,则每个TLP的总大小为1040字节。

头部开销为:

  1. 错误检测和纠正码:

假设每个TLP的LCRC为32位(4字节),则每个TLP的总大小为1044字节。

错误检测开销为:

  1. 控制符号:

    1.   控制符号的开销通常较小,假设为1%。

综合以上开销,有效负载带宽可以估算为:

  1. 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相关工作的,还是需要在了解全貌的基础上,以年为单位的深入去理解它。网上资料很多,还是以协议为根本。

后纪

技术很重要,技术背后的思想更重要!

技术背后的某些思想就是你解决以后问题的钥匙。我的文章可能一篇中知识点不太多,但是力求让你能深入理解,为你进阶打下基础。如果有一点点收获,也算是我对中国芯片行业的一点点贡献吧。

赠人玫瑰,手有余香。如果你有所收获,麻烦花一秒时间帮我点个赞和在看吧,谢谢!

知乎专栏:芯片设计进阶之路

微信公众号:芯片设计进阶之路 x_chip

——————————————————————————————

参考文献

  • 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*.



处芯积律
处芯积律,而后知所至。一个芯片人的技术和行业研究分享。
 最新文章