欢迎光临散文网 会员登陆 & 注册

PCIe协议概览总结

2023-02-22 09:54 作者:开发员阿梦  | 我要投稿

简述

PCIe总线是一种高速差分总线。(高速差分总线代替并行总线也是大势所趋)。与单端并行信号相比,高速差分总线可以使用更高的时钟频率,更少的信号线,完成之前需要许多单端并行总线才能达到的总线带宽。

PCIe总线继承了一些PCI总线中的核心思想,比如“桥”的概念,PCIe总线将通过一种类似的方式进行总线扩展(Switch)。PCI总线与设备之间是共享总线的连接方式,许多设备连接到同一条PCI总线上。而PCIe使用的是端到端的连接方式。一条PCIe链路的两端只能各连接一个设备,这两个设备互为数据的发送端和接收端。PCIe总线有多个层次,这种结构与网络协议栈类似。

 

如上图所示,一对发送端和接收端的链路。图中下方是是PCIe总线的物理链路(Lane)。每个Lane中有两组差分信号(比如图中的D-与D+是一组差分信号)。可以看到,发送端的TX部件与接收端的RX部件使用一组差分信号连接,于是此链路叫做发送端的发送链路,接收端的接收链路;反之亦然。一个PCIe可以由多个Lane组成(发送设备/接收设备有多个发送/接收部件/接口?)。

PCIe总线使用的信号与PCI总线大不相同。这里一个有趣的知识点是,PCIe总线中有JTAG(Joint Test Action Group)信号。JTAG其实是一种国际标准的测试协议,主要用于芯片内部测试。当然对于我来说最常见的场景是在FPGA上使用JTAG进行在线编程。处理器也可以使用JTAG接口进行系统级的调试,设置断点、读取内部寄存器和存储器等一系列操作。因此JTAG真的可以用于“逆向工程”,分析产品的实现细节。所以,在正式产品中一般不保留JTAG接口。

PCIe采用了串行的连接方式,并使用数据包(Package)进行数据传输,采用这种结构有效去除了在PCI总线中存在的一些边带信号,如INTx(中断信号)和PME#等信号。

层次结构

PCIe总线的各个层次由硬件逻辑实现。数据报文首先在设备的核心层(Device Core)产生,然后经过设备的事务层(Transaction Layer)、数据链路层(Data Link Layer)和物理层,最终发送出去。接收端发送的数据也需要经过层级最终到达核心层。

 

按照顺序讲。

事务层:定义了PCIe总线使用的总线事务,其中多数总线事务与PCI总线事务兼容。事务层接收来自于PCIe设备核心层的数据,并将其封装为TLP(Transaction Layer Packet)后,发向数据链路层。事务层也接收从数据链路层发来的数据报文,然后转发到设备的核心层。事务层要处理PCIe的“序”。在PCIe总线中,事务层传递报文时可以乱序,这为PCIe设备的设计制造了不小的麻烦。事务层还使用流量控制机制保证PCIe链路的使用效率。

数据链路层:该层保证来自发送端事务层的报文可以可靠、完整地发送到接收端的数据链路层。来自事务层的报文在通过数据链路层时,将被添加Sequence Number前缀和CRC后缀(形成DLLP)。数据链路层使用ACK/NAK协议保证报文的可靠传递。PCIe总线的数据还定义了多种DLLP(Data Link Layer Packet),其产生于数据链路层,终止于数据链路层。

物理层:最后,物理层是PCIe总线的最底层,将PCIe设备连接在一起。PCIe总线的物理电气特性决定了PCIe链路只能使用端到端的连接方式。PCIe总线的物理层为PCIe设备间的····数据通信提供传送介质,为数据传送提供可靠的物理环境。物理层是PCIe体系结构最为重要也是最难以实现的组成部分。PCIe总线的物理层定义了LTSSM(Link Training and Status State Machine)状态机,PCIe使用该状态机管理链路状态,并进行链路训练,链路恢复和电源管理。在物理层还定义了一些专门的“序列”,有的书籍将物理层这些“序列”称为PLP(Physical Layer Packet)这些序列用于同步PCIe链路,并进行链路管理。

 链路扩展方式

PCI总线中使用PCI桥进行总线扩展。在PCIe总线中,扩展组件是Switch。

Switch是一个特殊的设备,其有一个上游端口,和2~n个下游端口。被叫做上游端口是因为能够和PCIe的根复合体(RC, Root Complex)相连;其他的端口都是下游端口。下游端口一般与端点设备相连(EndPoint, EP)或者是连接其他的Switch。对应的概念有上游链路(与上游端口相连的PCIe链路)和下游链路。

 

在Switch中,数据流出的端口被称为Egress端口,Ingress指的数据流入Switch使用的端口。对于RC(Root Complex,根复合体)也有同样的定义。PCIe的Switch还支持一种CrossLink传输方式。此方式主要是为了解决不同处理器系统之间的互连。

 

如上图所示,此方式在物理结构上表现为一个Switch的上/下游端口与另一个Switch的上/下游端口直接相连,但是其实这个PCIe链路经过训练后,仍然是一个端口作为上游端口,而另一个端口作为下游端口[P109]。

 

接下来一部分内容是PCIe中的复位方式(初始化),以及复位信号的说明。

再之后的内容,是关于PCIe体系结构的组成。

根复合体RC

以下是一幅PCIe总线的体系结构示意图。关于细节的部分我这里不详述,但是可以看到,这里出现了核心组件RC的内部结构。

 

PCIe总线中RC的定位,可以理解为PCI总线中HOST主桥的定位。PCIe总线中也没有定义RC应当如何设计,因此不同处理器对RC的结构设计不同,甚至不一定有明确的RC设计。比如在书中提到的PowerPC处理器P4080中,定义的PCIe控制器起的作用类似于RC。但是总的来说,PCIe总线的处理器有以下的通用结构。

 

如PCI总线中的HOST主桥一样,RC也担负着存储器域和PCI域地址转换的功能。但是其功能不止于此。RC还要完成物理信号的转换(因为在处理器中的总线如FSB和外设的PCIe总线之间的电气特性并不兼容)。

Switch内部结构

下图是Switch内部的结构。

 

如上图所示,从软件的角度来看,Switch内部是由多个虚拟PCI桥组成的。(图中的P2P Bridge,是PCI to PCI桥)。每一个Switch内的上下游端口都对应一个虚拟的PCI桥。在Switch内部,还有一条虚拟的PCI总线来连接这些虚拟的PCI桥。(这里的虚拟应当都是指软件实现)。和PCIe总线中的RC和EP一样,Swtich也需要处理PCIe总线传输过程中的QoS问题。PCIe中的不同数据报文有不同的优先级,根据优先级不同的报文获得不同的数据带宽。PCIe总线要保证优先级高的报文优先到达。在具体的PCIe通路传输中,PCIe总线采用了虚拟多通路技术(VC, Virtual Channel),并为数据报文设定一个TC(Traffic Class),此标签由3位组成,为报文设置8个优先级。这8类数据报文可以根据需要选择不同的VC进行传递。

在PCIe总线的每一条链路上,最多可以支持8个独立的VC,每个VC可以设置独立的缓冲,用来接收和发送数据报文。TC和VC之间紧密相连,是一对多的关系。具体地讲,就是说同一个VC上可以传输很多不同优先级(TC)的报文,但是同一个优先级的报文只能在一条指定的VC上传输。

 PCIe链路中的仲裁

了解了Switch中通道的问题之后,稍作思考可知,既然在同一个通道上会存在多个TC的数据报文,则必然会存在数据报文在传输产生的竞争问题。于是,在Switch中必须有对应的仲裁机制。即PCIe总线中基于的VC仲裁。

在PCIe中,有两种形式的仲裁,基于端口的仲裁基于VC的仲裁

基于端口的仲裁,当然就是对端口的使用出现了竞争情况。根据前面,对PCIe总线中端口的分类,就是说当多个Ingress端口访问同一个Egress端口时,就会出现端口竞争的情况。

我们对着图讲。

 

具体地讲,有以下三种情况。注意,上图中的EP代表EndPoint,即端点设备。

       1. Switch的Egress端口。当EPA与EPB同时访问EPC、EPD或者DDR时,二者对分别通过Ingress PortA、B对Egress PortC的访问就形成了竞争,Switch内部需要通过端口仲裁决定EPA还是EPB的数据报文先通过EPC。

       2. RC的Egress端口。比如当端口1、3同时对EPC进行访问,则二者的请求在RC的Egress Port2处必然要经过端口仲裁。

       3. RC通往主存储器的端口。当RC中的端口1、2、3同时对DDR Controller发起了访问,那么三者的请求在RC的端口4处,必然要进行仲裁放行。

 

当数据报文到达端口后,先进行端口仲裁,然后才进行VC仲裁。PCIe总线规定了3种VC仲裁方式:严格优先级(Strict Priority)、时间片轮转(RR)、加权时间片轮转(WRR)。更具体地讲,端口仲裁的结果是使得数据报文获得VC的使用权;而VC仲裁进一步决定哪个VC先通过输出端口发送到物理链路。[P121-122]

 

往后的4.3节详解了PCIe中扩展配置空间的寄存器信息。


PCIe协议概览总结的评论 (共 条)

分享到微博请遵守国家法律