首页 理论教育TLP传送开销:PCIExpress体系结构解析

TLP传送开销:PCIExpress体系结构解析

【摘要】:图12-10 PCIe总线TLP格式由上图所示,一个PCIe设备发送TLP报文时,在经过数据链路层和物理层时,需要加上若干前缀和后缀。TLP在传送过程中,需要通过PCIe总线的事务层、数据链路层和物理层,因此必须考虑这些协议所带来的开销。在这两种情况之下,事务层的开销不同。由公式12-11,可以计算出与Max_Payload_Size参数对应的Payload_Ratio,并由此推算存储器写TLP在事务层上的开销。本章以这种方式为例分析存储器读TLP在事务层中的开销。

在PCIe总线中,TLP产生于事务层,并在通过PCIe总线的链路层与物理层时,加入若干前缀和后缀后,才能经由PCIe端口发送。PCIe总线定义了多种TLP,本章重点关心与存储器读写相关的TLP,包括存储器写TLP、存储器读请求TLP和存储器读完成TLP。这些TLP报文的通用格式如图12-10所示。

978-7-111-29822-9-Part02-191.jpg

图12-10 PCIe总线TLP格式

由上图所示,一个PCIe设备发送TLP报文时,在经过数据链路层和物理层时,需要加上若干前缀和后缀。

(1)Sta rt和End前后缀由物理层添加,表示一个TLP的开始与结束,各由一个字节组成,用于物理层同步TLP发送与接收。

(2)Sequence ID和LCRC前后缀由数据链路层添加,存放TLP的识别号和数据链路层的CRC校验,分别由2B和1DW组成。

(3)TLP Head前缀描述TLP的属性,由3~4个DW组成。

(4)ECRC后缀存放TLP在事务层的CRC校验,该字段可选。

(5)而Data Payload是真正的有效负载,其长度在0~1024DW之间。由上文所述,TLP的有效负载长度由PCIe设备的Max_Payload_Size参数确定,该字段通过上下游链路进行协商后获得。目前在多数处理器系统中,PCIe设备使用的Max_Payload_Size参数为128B或者256B。

我们假设TLP使用3DW的报文头,而且不需要ECRC校验,根据图12-10,在一个TLP中,Data Payload所占的比例如公式12-11所示。

Payload_Ratio=Payload/(Payload+20) (12-11)

假设PCIe设备的Max_Payload_Size参数为256B时,根据以上公式可以得出该PCIe设备最大的Payload_Ratio=256/(256+20)≈92.8%。但是TLP在PCIe链路中进行传送时,远不能获得Payload_Ratio大小的链路带宽。TLP在传送过程中,需要通过PCIe总线的事务层、数据链路层和物理层,因此必须考虑这些协议所带来的开销。

1.事务层的开销

事务层的开销需要分存储器写和存储器读两种情况讨论。在PCIe总线中,存储器写请求TLP使用Posted总线事务,而存储器读请求TLP使用Split总线事务。在这两种情况之下,事务层的开销不同。

PCIe设备进行DMA写的过程较为简单,当PCIe设备将一个4KB大小的数据传送到存储器时,首先将4KB数据封装到多个存储器写请求TLP中,然后发向RC,其中每个TLP最大的Payload为Max_Payload_Size。

PCIe设备的Max_Payload_Size参数由PCIe链路协商确定,目前x86处理器系统RC的Max_Payload_Size为128B或者256B,所以与RC直接相连的PCIe设备,其Max_Payload_Size参数只能为128B或者256B。由公式12-11,可以计算出与Max_Payload_Size参数对应的Payload_Ratio,并由此推算存储器写TLP在事务层上的开销。

PCIe设备进行DMA读的过程略微复杂。首先PCIe设备向RC发送存储器读请求TLP,当RC收到这个存储器读请求TLP后,将从存储器中获得数据,然后组成一个或者多个存储器读完成TLP,并将其传送给PCIe设备。(www.chuimin.cn)

存储器读完成TLP能请求的数据大小为MRRS(Max_Read_Request_Size),该参数的大小为128B~4096B。如果PCIe设备进行DMA读的大小超过该参数时,将以该参数为界,向RC发出多个存储器读请求TLP。而RC可以使用一个存储器读完成报文传递所有数据;也可以以RCB为边界,使用多个存储器读完成报文传递所有数据。大多数RC使用后一种方式传递存储器读完成TLP,而且一次存储器读完成报文的大小也不超过RCB。本章以这种方式为例分析存储器读TLP在事务层中的开销。

假设存储器读请求TLP头的大小为3DW,而且报文头中不包含ECRC校验。PCIe设备进行DMA读的大小恰好为MRRS时,RC需要使用MRRS/RCB个存储器读完成报文传递数据。此时一次DMA读操作中Data Payload所占的比例如公式12-12[104]所示。

Payload_Ratio=MRRS/(MRRS+3×4+3×4×MRRS/RCB) (12-12)

当MRRS为512B,而RCB为64B时,Payload_Ratio=512/(512+12+12*8)≈82.6%。由以上分析可以发现PCIe设备进行DMA读在事务层上的开销大于DMA写在事务层上的开销,这也是PCIe设备DMA写的速度略高于DMA读的主要原因。

除了事务层的开销之外,DMA读操作的数据传送路径也长于DMA写,因而访问延时大于DMA写操作的访问延时,这也为DMA读逻辑的设计带来了不小的麻烦。从第12.2.2节中,也可以发现DMA读逻辑的设计远比DMA写逻辑的设计复杂。

2.链路层的开销

由图12-10所示,链路层向TLP添加Sequence ID和LCRC前后缀,这些开销已经在上文中计算,本小节不再重复计算这些开销。本小节所关心的链路层开销由两部分组成,一个是ACK/NAK协议的开销,另一个是流量控制所带来的开销。如第7.2节所示,发送方在发送TLP时,首先将这些TLP放入到Replay Buffer中,直到收到接收方的ACK报文后,才能确认该TLP已经正确地被接收方接收;如果收到接收方NAK报文,则表示部分TLP没有被正确接收,需要重新发送这些TLP。这些ACK/NAK报文将占用部分链路带宽。

在PCIe设备的实现过程中,设计者可以调整TLP接收个数的阈值,这个阈值的定义为接收端收到多少TLP后,给发送端提供一次ACK/NAK DLLP。该阈值决定了数据接收端发送ACK/NAK报文的间隔。

该阈值越大,则发送端的Replay Buffer也将随之增大,否则发送端无法将数据及时填入Replay Buffer,从而阻塞了发送流水,并影响PCIe总线的传送效率;如果该阈值越小,则接收端需要发送较多的ACK/NAK报文给接收端,也会影响PCIe总线的效率。因此接收端需要合理地设置ACK/NAK的阈值,以最大程度地利用PCIe总线的带宽。

在链路层的设计中,需要选择合适的Replay Buffer的大小。如果Replay Buffer过小,事务层无法及时地将TLP发送到Replay Buffer,从而造成TLP发送流水线的中断。而保存在Replay Buffer中的报文需要得到对端设备的确认报文后,才能释放。

因此可以发现Replay Buffer的大小,只需要保证事务层发送TLP时,有足够的缓冲即可。Replay Buffer的大小与PCIe链路的延时相关。在实现中,Replay Buffer不能过大,否则将使用较多的芯片资源。

在链路层中,除了ACK/NAK报文的开销外,流量控制报文也需要占用PCIe总线的链路开销。PCIe总线使用Credit-Based流量控制策略,发送端需要保证接收端有足够的缓冲之后才能发送报文,而且接收端需要按照某种策略及时使用FC Update报文,向发送端通知剩余的数据缓冲。因此流量控制也需要占用一些PCIe总线的带宽。在PCIe总线中,流量控制是基于“端到端”的,而且PCIe总线并没有规定PCIe设备使用的流量算法,因此流量控制对PCIe总线带宽的影响与设备相关,并没有一个统一的公式。

3.物理层的开销

在PCIe V2.1总线规范中,TLP在物理层中还需要进行8/10b转换,这个转换将极大地降低PCIe总线的实际链路带宽,而且在PCIe总线中,这种带宽的浪费是无法避免的。在PCIe V3.0规范中,这个8/10b转换被升级为128/130转换。128/130转换将极大节约PCIe链路带宽的浪费。但是无论如何,TLP在发送过程中,仍然会因为这种转换浪费PCIe链路的一些带宽。

除了8/10b转换之外,物理层为了解决接收时钟与逻辑时钟间的漂移所带来的问题,每一个Lane需要在发送1180~1538个字符后,发送一个SKIP序列进行时钟补偿。这种定时的时钟补偿序列也将浪费PCIe链路的部分带宽。