1 PCIe概述

​ PCIe是第三代外围设备总线,英文缩写为PCIe或者PCI Express。PCIe是点对点,全双工的差分传输信号总线。点对点互连表示链路上的电气负载有限,从而使发送和接收频率可扩展到更高。PCIe目前成熟的版本有GEN1,GEN2,GEN3,GEN4和GEN5,每一代相较上一代传输速率和传输带宽都有了很大幅度的提升。PCIe每个Function的配置空间从PCI的256B扩展到了4KB,但前64B(PCI Header)配置寄存器仍然是相同的。

差分信号对:PCIe采用差分对来串行传输数据。

img

链路:PCIe链路是两台设备之间的物理连接。

img

2 PCIe带宽

​ PCIe GEN1在链路上的传输速率为2.5Gb/s。PCIe在GEN1和GEN2采用了8b/10b编码方式,也就是说链路上传输10b数据,实际传输的有效数据只有8b。对于GEN1 x1的PCIe链路,传输的有效带宽为:

img

3 PCIe拓扑结构

​ PCIe主要的组件有RC(Root Complex),SW(Switch),EP(Endpoint)。RC可以和所有device进行通信,一个EP也可以和一个PCIe系统中的EP来通信(Peer-to-Peer)。RC是指连接CPU和存储器子系统以及PCIe结构的设备,可以支持一个或多个PCIe Port,下图中RC支持3个PCIe Port,每个Port连接EP或者SW,SW形成一个子层,又可以挂接其他PCIe设备。RC上的port可以进行数据交互,但协议并没有规定必须支持。SW是PCIe链路上进行转接的一类设备,拥有一个upstream prot和多个downstream port。可以将SW当作多个PCIe桥组成的设备。EP是PCIe链路的末端,有两种类型:Legacy Endpoint 和 PCIe Endpoint。传统EP支持IO事务,而且还需要能接收锁定事务。而PCIe EP不必支持IO事务和接收锁定事务,但必须支持MSI中断。

img

4 PCIe Transaction

事务:Transaction指 requester 和 completer 之间完成一次信息传送时所需要完成的一系列或多个数据包传送的过程。PCIe支持的事务类型与PCI、PCI-X支持的事务类型相同,包括存储器读和存储器写,IO读和IO写,配置读和配置写,此外还增加了一种新事务:消息(message)。

4.1 PCIe 事务的分类

​ PCIe事务可以分为Non-Posted 和 Posted。Non-Posted指 requester 发送TLP请求包给completer时,completer需要返回一个TLP完成数据包requester。Posted指requester 发送TLP请求事务包给 completer时,completer不需要回复TLP完成数据包给requester。TLP完成包带数据信息的称为CPLD,不带数据信息的称为CPL。

img

img

5 PCIe的层次结构

​ PICe设备的体系结构可以分为三个层次:事务层(Transaction Layer)数据链路层(Data Link Layer)物理层(Physical)。每一个层次又可以分为两个部分,分别为处理发送和处理接收的部分。也可以分为四个层次,将事务层以上的层次称为软件层(Software layer)。

img

6 PCIe数据包

​ 前文已经说过PCIe之间是以数据包的形式来传输数据的,协议共定义了3类数据包。与处理层相关的是处理层数据包(TLP),与数据链路层相关的是数据链路层数据包(DLLP),与物理层相关的是物理层数据包(PLP)。TLP包和DLLP包的大小如下图所以,DW代表一个双字(32bit),B代表一个Byte。

img

6.1 TLP包

​ TLP包起源于发送者的事务层,终止于接收者的事务层。但当TLP包经过数据链路层和物理层时,这两个层次也会对TLP包进行一定的处理。

img img

事务层处理:

  • 发送:事务层接收由软件层传来的组成TLP核心部分所需要的信息,并将数据组装成Header 和 Data(有些TLP没有DATA)。如果Header中的TD比特位为1,则根据Header和Data计算End-to-End CRC(ECRC),并将其附着在Data后面,如果TD为0,则该TLP不会有ECRC。

  • 接收:通过ECRC判断TLP包是否有CRC错误,如果没错,则删掉ECRC,将其余数据传输给软件层,如果存在CRC错误,则……

数据链路层的处理:

  • 发送:数据链路层接收事务层传过来的TLP包,然后在其前面加上Sequence ID (,并根据目前所有的信息计算32bit 的CRC(LCRC),并附着在后面。
  • 接收:检查TLP报的LCRC是否有CRC错误,如果有错误则丢弃TLP,然后发送NAK DLLP给Remote Device。如果没有错误,则将LCRC和Sequence ID去除,将其余数据发送给事务层,并且会发送ACK DLLP给Remote Device。

物理层的处理:

  • 发送:物理层接收数据链路层传过来的TLP包,然后在其前面和后面分别附加1 Byte的 Start 和 End 帧字符。接收者根据这个来检测数据包的开始和结束。

  • 接收:物理层将比特流经过一系列操作组装成数据包,并去除Start和End帧字符后将数据传输给数据链路层。

6.2 DLLP包

​ DLLP包起源与发送者的数据链路层,终止于接收者的数据链路层。当DLLP包经过物理层时,物理层也会对其做一定处理。DLLP包用于链路管理功能,包括ACK/NAK协议相关的TLP确认,电源管理流控制DLLP包在链路上两个直接连的数据链路层之间传输(没有路由功能),也就是在物理相连的两个PCIe设备之间传输。

img img

数据链路层:

  • 数据链路层存在多种DLLP包,数据链路层会在要发的DLLP包上附加16 bit的CRC。

物理层:

  • 物理层接收数据链路层传过来的DLLP,然后在其前面和后面分别附加1 Byte的 Start 和 End 帧字符。接收者根据这个来检测包的开始和结束。

6.3 PLP包

​ PLP是一种非常简单的数据包。起源于发送者的物理层,终止于接收者的物理层。PLP的大小是4 Byte的整数倍,PLP包在链路上两个直接连的数据链路层之间传输(没有路由功能)。PLP也被称为Ordered set(有序集)PLP主要用于链路训练过程(LinkTraining process),时钟容差补偿(clock tolerance compensation)。PLP包开始的第一个 Byte是 COM 字符,后面是定义PLP类型以及含有其他信息的3个或多个字符。

img img

7 体系结构

img

7.1 Transaction Layer

  • 发送:事务层接收来自软件层的数据,组装成TLP包,并根据Header中的TD位来决定是否生成ECRC。将待发送的TLP包放入VC transmit buffer,在Flow Control表示接收端有足够空间的VC receive buffer来接收后,将TLP传输给数据链路层,然后经过物理层发送出去。
  • Flow Control后面会有章节进行介绍,简单来说就是接收设备定期的发送一种DLLP包(FCx DLLP)给发送设备,用来表示接收设备中VC receive buffer还存在多大的空间。发送设备收到DLLP,解析得到空间足够,就会发送需要发送的TLP包。也就是说物理连接的两个设备,两端的TX都会定期发送流控制DLLP包,两端的RX都会接收到,两个设备的发送部分都会知道对方设备的接收部分中VC receive buffer还存在多大的空间,从而控制发送部分是否发送TLP包。

img

​ 数据链路层主要功能是保证在各链路上发送和接收数据包时数据的完整性。在Flow Control机制下,当接收方有足够的VC receive buffer后,数据链路层将接收到事务层传输过来的TLP。然后将Sequence ID附加在TLP前面,并根据目前所有的信息(Sequence ID,TLP)计算CRC(LCRC),并附着在后面。

  • 重传机制:Device A的数据链路层会将打包后的TLP通过物理层发送给Remote Device B,并会保留一个备份放在Replay Buffer中。如果没有错误,Device B会返回一个带 Sequence ID的ACK DLLP包给Device A,A接收到后,就认为TLP包成功到达B了(TLP的目的地不一定时B,也许需要B去转发),然后会将Replay Buffer中相应Sequence ID的TLP包删除。
  • 接收TLP:接收到TLP后,会进行CRC检查,如果有错误,将会将该TLP包丢弃,并返回一个NAK给Device A。如果没有错误,将会返回一个ACK给Device A,并将TLP包的Sequence ID和LCRC去除后传输给事务层。

img

7.3 Physical Layer

​ 物理层可以分为逻辑物理层(Logic Physical Layer)和电气物理层(Electrical Physical Layer),逻辑物理层主要指物理层的数字电路部分,电子物理层主要指物理层的模拟电路部分。功能:发送和接收数据包,完成链路训练和初始化(Link Training and Initialization)。

8 MRd包传输示例

​ 以MRd TLP包的传输为例,说明一个Non-Posted事务的TLP是如何在PCIe系统层次中处理的。

img

  • Requester的软件层发送需要传送的信息给事务层;
  • 事务层将数据打包成TLP的Header(和Data,MRd TLP没有Data),并根据需要是否附加ECRC,将完成的TLP存入相应的VC transmit buffer。流控制机制确保TLP在合适的时间被发送到数据链路层;
  • 数据链路层将TLP前增加Sequence ID,并在后面附加LCRC。然后将TLP存入 Replay buffer备份,并将TLP传输给物理层。
  • 物理层将TLP增加Start 和 End 字符,然后将TLP包进行字节拆分、加扰、编码、并串转换,再通过TX发送到链路上。
  • Completer的物理层RX接收到差分信号,将信号进行并串转换,在一个弹性buffer中组装数据包,(组装好的数据已经被解码、去扰了)。然后检测并删除Start和End字符。将最后得到的TLP发送给数据链路层。
  • 数据链路层进行CRC检查。
    • 如果没有错误,则形成ACK的DLLP包,通过物理层发送给对方。对方的数据链路层接收到ACK包后,会根据ACK包中的Sequence ID信息删除保存在Replay buffer中相应的TLP包。
    • 如果有错误,则形成NAK的DLLP包,通过物理层发送给对方。对方的数据链路层接收到NAK包后,会根据NAK包中的Sequence ID信息重新发送保存在Replay buffer中对应的TLP包
  • 数据链路层删除TLP包的Sequence ID和 LCRC,将得到的TLP包发送给事务层相应的VC receive buffer。
  • 事务层检查CRC错误(如果有ECRC),如果没有错误,则将TLP包中的信息发送给软件层。