目录
1,PCIe的层次结构
PICe设备的体系结构可以分为三个层次:事务层(Transaction Layer)、数据链路层(Data Link Layer)、物理层(Physical)。每一个层次又可以分为两个部分,分别为处理发送和处理接收的部分。
也可以分为四个层次,将事务层以上的层次称为软件层(Software Layer)。
2,PCIe数据包
前文已经说过PCIe之间是以数据包的形式来传输数据的,协议共定义了3类数据包。与处理层相关的是处理层数据包(TLP),与数据链路层相关的是数据链路层数据包(DLLP),与物理层相关的是物理层数据包(PLP)。TLP包和DLLP包的大小如下图所以,DW代表一个双字(32bit),B代表一个Byte。
注意:物理层给TLP和DLP施加的Start (TLP施加的为K27.7,DLLP施加的为K28.2)字符并不一样,但End(K29.7)字符一样。
2.1,TLP包
TLP包起源于发送者的事务层,终止于接收者的事务层。但当TLP包经过数据链路层和物理层时,这两个层次也会对TLP包进行一定的处理。
事务层处理:
1,发送)事务层接收由软件层传来的组成TLP核心部分所需要的信息,并将数据组装成Header 和 Data(有些TLP没有DATA)。如果Header中的TD比特位为1,则根据Header和Data计算End-to-End CRC(ECRC),并将其附着在Data后面,如果TD为0,则该TLP不会有ECRC。
2,接收)通过ECRC判断TLP包是否有CRC错误,如果没错,则删掉ECRC,将其余数据传输给软件层,如果存在CRC错误,则......
数据链路层的处理:
1,发送)数据链路层接收事务层传过来的TLP包,然后在其前面加上12bit 的Sequence ID (上上图中为2B?),并根据目前所有的信息计算32bit 的CRC(LCRC),并附着在后面。
2,接收)检查TLP报的LCRC是否有CRC错误,如果有错误则丢弃TLP,然后发送NAK DLLP给Remote Device。如果没有错误,则将LCRC和Sequence ID去除,将其余数据发送给事务层,并且会发送ACK DLLP给Remote Device。
物理层的处理:
1,发送)物理层接收数据链路层传过来的TLP包,然后在其前面和后面分别附加1 Byte的 Start 和 End 帧字符。接收者根据这个来检测数据包的开始和结束。
2,接收)物理层将比特流经过一系列操作组装成数据包,并去除Start和 End帧字符后将数据传输给数据链路层。
2.2,DLLP包
DLLP包起源与发送者的数据链路层,终止于接收者的数据链路层。当DLLP包经过物理层时,物理层也会对其做一定处理。
DLLP包用于链路管理功能,包括ACK/NAK协议相关的TLP确认,电源管理,流控制。DLLP包在链路上两个直接连的数据链路层之间传输(没有路由功能),也就是在物理相连的两个PCIe设备之间传输。
数据链路层:
数据链路层存在多种DLLP包,数据链路层会在要发的DLLP包上附加16 bit的CRC。
物理层:
物理层接收数据链路层传过来的DLLP,然后在其前面和后面分别附加1 Byte的 Start 和 End 帧字符。接收者根据这个来检测包的开始和结束。
2.3,PLP包
PLP是一种非常简单的数据包。起源于发送者的物理层,终止于接收者的物理层。PLP的大小是4 Byte的整数倍,PLP包在链路上两个直接连的数据链路层之间传输(没有路由功能)。
PLP也被称为Ordered set(有序集)
PLP主要用于链路训练过程(LinkTraining process),时钟容差补偿(clock tolerance compensation)。
PLP包开始的第一个 Byte是 COM 字符,后面是定义PLP类型以及含有其他信息的3个或多个字符。