PCIe总线-简介(一)

1.概述

早期的计算机使用PCI(Peripheral Component Interconnect)总线与外围设备相连,PCI总线使用单端并行信号进行数据传输,由于单端信号很容易被外部系统干扰,其总线频率很难进一步提高。目前,为了提高总线频率以获得更高的总线带宽,高速串行总线逐步替代了并行总线,PCI Express总线已逐渐替代了PCI总线。

PCI Express总线使用高速差分总线和端到端的连接方式,每个PCIe设备都有一个或多个独立的传输通道(称为"lanes"),这些通道直接连接到主板的芯片组或CPU。每条通道包含两对差分信号,一对用于发送数据,一对用于接收数据,因此支持全双工通信。若要增加带宽,只需要增加lanes的数量即可,更加灵活。

  1. Lane和版本
    PCIe的基本单元是lane,它由一对发送和一对接收差分信号组成。多条lanes可形成更宽的传输通道,例如x1、x2、x4、x8、x16和x32配置,其中x代表lane的数量。随着计算机的发展,PCIe标准也在发展,目前常见的版本是PCIe 1.0、2.0、3.0、4.0以及5.0,每个新版本提供的带宽相比前一版本大约翻一番。

  2. 可扩展性和兼容性
    PCIe对热插拔设备提供支持,同时它也向后兼容;也就是说较新版本的插槽可以插入较旧版本的卡,而较新版本的卡也可以插入到较旧的插槽中工作(但速度会降低至插槽所支持的最高标准)。这提供了极大的灵活性和系统升级的方便性。

  3. 使用场景
    PCIe被广泛用于各种类型的设备连接,包括显卡、固态硬盘、以太网卡、Wi-Fi控制器、雷电扩展卡和其他高速外部设备。由于它的高速度和低延迟特性,PCIe在现代计算中是首选接口。

  4. 技术优势
    PCIe的主要优势在于其高性能和可扩展的带宽,这使得它能够支持最新的存储设备、高性能GPU以及通信设备的速度要求。其他优势包括更小的物理占位、更好的I/O虚拟化支持和省电等。

随着计算需求的不断增长和新技术的出现,PCIe技术也在不断演进,以更好的适应未来硬件的发展需求。

2.速率

协议版本编码类型信号最大传输速度x1带宽x2带宽x4带宽x8带宽x16带宽推出时间
1.08b/10bPAM22.5 GT/s250MB/s500MB/s1GB/s2GB/s4GB/s2003年
2.08b/10bPAM25.0 GT/s500MB/s1GB/s2GB/s4GB/s8GB/s2007年
3.0128b/132bPAM28.0 GT/s~1GB/s~2GB/s~4GB/s~8GB/s~16GB/s2010年
4.0128b/132bPAM216.0 GT/s~2GB/s~4GB/s~8GB/s~16GB/s~32GB/s2017年
5.0128b/132bPAM232.0 GT/s~4GB/s~8GB/s~16GB/s~32GB/s~64GB/s2019年
6.01b/1b(Flit Mode)PAM464.0 GT/s8GB/s16GB/s32GB/s64GB/s128GB/s2022年
7.01b/1b(Flit Mode)PAM4128.0 GT/s16GB/s32GB/s64GB/s128GB/s256GB/s2025年
  1. NRZ(Non-Return-to-Zero,不归零编码): 使用高低电平传输数据位,在数据位脉冲结束后,不需要回归到零电平。
  2. PAM4(4-Level Pulse Amplitude Modulation,四电平脉冲幅度调制): 是一种调制技术,采用4个不同的信号电平传输数据。PAM4信号的每个符号周期包含了两个比特的逻辑信息,比如用逻辑信号“0”来代表逻辑信号“00”,“1”代表“01”,“2”代表“10”,“3”代表“11”。
  3. Flit Mode: 流控单元模式,是一种1b/1b的编码方式。之前是以TLP为单位进行事务传输,PCIe 6.0以FLIT为单位进行事务传输,每个FLIT有256B数据,每B数据占用4UI。

3.PCIe总线拓扑结构

下图是一个典型的x86计算机PCIe总线拓扑结构。RC(Root Complex)是每条PCIe总线的开始,PCIe设备通过RC和CPU通信。在x86计算机中,RC集成了PCIe总线端口、存储器控制器等一系列与外部设备有关的接口,比较复杂,而在其他体系结构的计算机中,RC可能只包含PCIe总线端口,通常只有一个端口。下图中的RC内部通过PCI-PCI桥扩展出来3个端口。第一个端口下面节了一个Switch,Switch的作用是扩展链路,该Switch通过内部的PCI-PCI桥扩展出来3个下行端口,这3个端口都可以接PCIe设备,PCIe设备被称为EP(Endpoint)。第二个端口没有扩展,可以直接接PCIe设备。第三个端口接了一个PCIe转PCI或PCI-X桥,该桥下面可以接PCI或PCI-X设备。

PCIe_Topology_Example

在PCIe总线中,每个PCIe设备的功能,包括PCIe桥中的虚拟P2P桥的功能,都可以使用唯一的BDF(Bus,Device,Function)编号表示。BDF中,Bus Number占用8位,Device Number占用5位,Function Number占用3位。显然,PCIe总线最多支持256个子总线,每个子总线最多支持32个设备,每个设备最多支持8个功能。

PCIe总线采用的是一种深度优先(Depth First Search)的拓扑算法,且Bus0总是分配给Root Complex。Root中包含有集成的Endpoint和多个端口(Port),每个端口内部都有一个虚拟的PCI-to-PCI桥(P2P),并且这个桥也应有设备号和功能号。每个设备必须要有功能0(Fun0),其他的7个功能(Fun1~Fun7)都是可选的。

下图展示了一个PCIe总线的BDF编号分配情况。

PCIe总线BDF示意图

下图是intel 10代酷睿和400系列芯片组的示意图。CPU通过DMI总线和PCH芯片(南桥)连接。DMI总线使用和PCIe总线相同的物理层,因此带宽也和PCIe相同。CPU和400系列芯片组都集成了PCIe RC。CPU中RC引出的x16 lanes连接显卡。400系列芯片组的RC引出的24 lanes连接对带宽要求不高的设备,比如PCIe网卡、M.2 NVMe SSD等。

400系列芯片组示意图

下图是intel 12代酷睿和600系列芯片组的示意图。相比10代酷睿和400系列芯片组,12代酷睿和600系列芯片组将PCIe总线版本提升到5.0,同时提升了PCIe总线数量,增加了CPU直出PCIe总线数量,避免经过南桥芯片引起的性能损失。

Z690芯片组示意图

4.PCIe总线层次结构

PCIe总线是一个分层结构,结构如下图所示,包含了应用层(Device Core、PCIe Core Hardware/Software Interface)、事务层(Transaction Layer)、数据链路层(Data Link Layer)、物理层(Physical Layer)。报文中的数据在应用层中产生,发送后会依次穿越事务层、数据链路层和物理层,接收端收到报文后的处理顺序与发送端相反,其依次经过物理层、数据链路层和事务层,数据最终被交付到接收端的应用层。

PCI_Express_Device_Layers

和网络报文类似,PCIe报文发送时,会在报文头和报文尾加上该层PCIe协议规定的数据,接收端接收到报文后再依次剥离相应的协议数据。如下图所示,发送时Data在应用层产生,穿越事务层时会加上Header和ECRC(End-to-end CRC),穿越数据链路层时会加上Sequence Number和LCRC(Link CRC),穿越物理层时会加上Framing。接收数据时,穿越物理层时剥离Framing,穿越数据链路层时剥离Sequence Number和LCRC,穿越事务层时剥离Header和ECRC,最终数据交付到接收端的应用层。PCIe总线规范对事务层、数据链路层和物理层做了明确的规定,要求设计者严格遵守,而对于应用层,PCIe总线规范没有严格规定,设计者可以根据需求自行设计。

ECRC是可选的,其主要的目的是解决Switch中可能的传输错误问题,如果用户的PCIe总线中没有Switch(只是简单的Root与Endpoint的端对端直连),完全可以不使用ECRC。

Packet_Flow_Through_the_Layers

  1. 应用层
    这一层决定了PCIe设备的类型和基础功能,可以由软件和硬件协同实现。如果该设备为EP,则其最多可拥有8项功能(Function),且每项功能都有对应的配置空间(Configuration Space)。如果该设备为Switch,则应用层需要实现包路由(Packet Routing)等相关逻辑。如果该设备为RC,则应用层需要实现虚拟的PCIe总线0(Virtual PCIe Bus 0),并代表整个PCIe总线系统与CPU通信。应用层是所有请求的目的或者源。

  2. 事务层
    接收端的事务层负责事务层包(Transaction Layer Packet,TLP)的解码与校检,发送端的事务层负责TLP的创建。此外,事务层还有QoS(Quality of Service)和流量控制(Flow Control)以及Transaction Ordering等功能。

  3. 数据链路层
    数据链路层负责数据链路层包(Data Link Layer Packet,DLLP)的创建、解码和校检。同时,本层还实现了Ack/Nak的应答机制,以处理传输失败的情况。

  4. 物理层
    物理层负责Ordered-Set Packet的创建和解码,同时负责发送与接收所有类型的包(TLPs、DLLPs和Ordered-Sets)。在发送之前需要对包进行一系列的处理,如Byte Striping、Scramble(扰码)和Encoder(8b/10b for Gen1/Gen2, 128b/130b for Gen3/Gen4)。在接收端需要进行相反的处理。此外,物理层还实现了链路训练(Link Training)和链路初始化(Link Initialization)的功能,一般通过链路训练状态机(Link Training and Status State Machine,LTSSM)完成。

每一个PCIe接口(interface)都必须包含事务层、数据链路层和物理层,比如Switch的每个port,如下图所示。

Switch_Port_Layers

PCIe总线层次结构的详细信息如下图所示,这里不再赘述。

PCIe总线层次结构的详细信息

5.PCIe总线信号

下图是一个PCIe x4的金手指示意图,包括了电源信号、差分信号、复位信号、时钟信号、唤醒信号、JTAG信号、SMbus信号、热插拔信号。PCIe卡的信号、连接器、电气参数、尺寸由PCI Express® Card Electromechanical Specification规范定义。

PCIe接口信号

5.1.电源信号

PCle卡使用双轨供电,分别是+3.3V和+12V,还有一种可选的3.3Vaux。PCle设备的主要逻辑模块使用+3.3V和+12V供电,而一些与电源管理相关的逻辑模块使用3.3Vaux供电。PCle EP中某些特殊的寄存器通常使用3.3Vaux供电,即使PCIe设备的+3.3V和+12V断开,这些与电源管理相关的逻辑状态和特殊寄存器的内容也不会发生改变。使用3.3Vaux的主要原因是为了降低功耗和缩短系统恢复时间。

PCIe设备电源信号要求

5.2.差分信号

处理器系统中通常提供x16的PCle插槽,并使用PETpO-15、PETn0-15和PERpO-15、PERn0~15共64根信号线组成32对差分信号,其中16对PETx信号用于发送,另外16对PERx信号用于接收。

5.3.复位信号

PERST#信号为全局复位信号,由处理器系统提供。当该信号有效时,PCIe设备将进行复位操作。PCle总线定义了多种复位方式,其中Cold Reset和Warm Reset的实现与该信号有关。

5.4.时钟信号

REFCLK+和REFCLK- 是参考时钟信号。在一个处理器系统中,可能含有多个PCle设备,这些设备可以作为Add-In卡与PCle插槽连接,也可以作为内置模块与处理器系统提供的PCIe链路直接相连。PCle插槽的REFCLK+和REFCLK-时钟由处理器系统提供。PCIe卡可以直接使用插槽提供的参考时钟,也可以使用独立的参考时钟,但参考时钟必须在100MHz±300ppm范围内。内置的PCIe设备可以直接使用处理器系统提供的参考时钟,也可以使用独立的参考时钟。

5.5.唤醒信号

当PCIe设备进入休眠状态时,主电源会停止供电。若PCle设备需要唤醒,则需要使用WAKE#信号向处理器系统提交唤醒请求,使处理器系统重新为该PCIe设备提供主电源。在PCe总线中,WAKE#信号是可选的,因此使用WAKE#信号唤醒PCle设备的机制也是可选的。值得注意的是产生该信号的硬件逻辑必须使用辅助电源3.3Vaux供电。WAKE#是一个OpenDrain信号,一个处理器的所有PCle设备可以将WAKE#信号进行线与后,统一发送给处理器系统的电源控制器。当某个PCe设备需要被唤醒时,该设备首先置WAKE#信号有效,然后在经过一段延时之后,处理器系统开始为该设备提供主电源,并使用PERST#信号对该设备进行复位操作。此时WAKE#信号需要始终保持为低,当主电源上电完成之后,PERST#信号也将置为无效并结束复位,WAKE#信号也将随之置为无效,结束整个唤醒过程。

5.6.JTAG信号

JTAG(Joint Test Action Grup)是一种国际标准测试协议,与IEEE1149.1兼容,主要用于芯片内部测试。目前绝大多数器件都支持JTAG测试标准。JTAG信号由TRST#、TCKTDI、TDO和TMS信号组成。其中TRST#为复位信号;TCK为时钟信号;TDI和TDO分别与数据输入和数据输出对应;而TMS信号为模式选择。JTAG允许多个器件通过JTAG接口串联在一起,并形成一个JTAG链。处理器也可以使用JTAG接口进行系统级调试工作,如设置断点、读取内部寄存器和存储器等一系列操作。

5.7.SMbus信号

SMbus(System Mangement Bus)由SMCLK和SMDAT两根信号线组成。SMbus源于I2C,但是与I2C总线有一些差别。SMBus总线最高频率为100kHz,而I2C总线可以支持400kHz和2MHz的总线频率。SMBus总线上的从设备具有超时功能,当从设备发现主设备发出的时钟信号保持低电平超过35ms时,将引发从设备的超时复位,而I2C总线上的从设备没有此功能。在正常情况下,SMBus的主设备使用的总线频率最低为10kHz,以避免从设备在正常使用过程中出现超时。在SMbus中,如果主设备需要复位从设备时,可以使用这种超时机制。而I2C总线只能使用硬件信号才能实现复位操作。SMBus还支持Alert Response机制。当从设备产生一个中断时,并不会立即清除该中断直到主设备向0b0001100地址发出命令。

上文所述的SMBus和I2C总线的区别还是局限于物理层和链路层上,实际上SMBus还含有网络层。SMBus还在网络层上定义了11种总线协议,用来实现报文传递。SMBus在x86处理器系统中得到了大规模兽及,其主要作用是管理处理器系统的外部设备,并收集外设的运行信息,特别是一些与智能电源管理相关的信息。PCI和PCe插槽也为SMBus预留了接口,以便PCI/PCle设备与处理器系统进行交互。

5.8.热插拔信号

PRSNT1#和PRSNT2#信号与PCIe设备的热插拔相关。在PCIe卡上,PRSNT1#和PRSNT2#信号直接相连,而在处理器主板中,PRSNT1#信号接地,PRSNT2#信号通过上拉电阻拉高。当PCIe卡没有插人时,处理器主板的PRSNT2#信号由上拉电阻接为高,而当PCIe卡插入时主板的PRSNT2#信号将与PRSNT1#信号通过PCIe卡连通,此时PRSNT2#信号为低。处理器主板的热插拔控制逻辑将捕获这个“低电平”,得知PCIe卡已经插入,从而触发系统软件进行相应处理。PCIe卡拔出的工作机制与插人类似。当PCIe卡连接在处理器主板时,处理器主板的PRSNT2#信号为低;当PCIe卡拔出后,处理器主板的PRSNT2#信号为高。处理器主板的热插拔控制逻辑将捕获这个“高电平”,得知PCIe卡已经被拔出,从而触发系统软件进行相应处理。

在实现热插拔功能时,PCIe卡需要使用“长短针”结构,如下图所示。PRSNTI#和PRSNT2#信号使用的金手指长度是其他信号的一半。因此当PCle卡插入插槽时,PRSNTI#和PRSNT2#信号在其他金手指与PCle插槽完全接触,并经过一段延时后,才能与插槽完全接触;当PCIe设备从PCe插槽中拔出时,这两个信号首先与PCle插槽断开,再经过一段延时后,其他信号才能与插槽断开。系统软件可以使用这段延时,进行一些热拔插处理。

PCIe卡热插拔长短针结构

参考资料

  1. PCIEXPRESS体系结构导读
  2. PCI Express technology 3.0
  3. PCI_Express_Base_r3.0_10Nov10
  4. PCIe7_0_Intro_PCIe_6_0_Solution
  5. http://blog.chinaaet.com/justlxy/p/5100053251
  6. https://www.jianshu.com/p/5889b7963558
  7. PCI Express® Card Electromechanical Specification
  8. https://www.bilibili.com/read/cv26988469/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值