目录

1,PCIe体系结构

1.1,Transaction Layer

1.2,Data Link Layer

1.3,Physical Layer

1,PCIe体系结构

前文已经说了PCIe可以分为三个层次:Transaction LayerData Link LayerPhysical Layer。下图中为PCIe设备层的详细模块图,左半部分为发送,右半部分为接收,两边有所区别。下文将分别对三个层次的结构和功能做一个简短的介绍。

1.1,Transaction Layer

功能:编码TLP和解码TLP,支持Quality of Service(QoS:服务质量),含有Virtual Channel buffer(VC buffer:虚拟通道缓冲区,设备必须含有VC0),进行VC仲裁。

QoS后面会有章节进行介绍,简单来说就是以不同的优先级去传送不同的TLP包。TLP包中含有TC位(3 bit:0~7),代表不同的类型。而Transaction Layer中可以有多个VC,可以将一个或多个TC映射到一个VC,但一个TC不能映射到多个VC。不同的VC传输数据时会有优先级,同一个VC中的不同TC的TLP包传输优先级一样。例如:软件将TC0~TC2映射到VC0,TC3~TC7映射到VC1,并且配置VC1的优先级高于VC0,如果同时发送TC0和TC3的TLP包,通过VC仲裁可得TC3的TLP包将会被先传输。

发送:事务层接收来自软件层的数据,组装成TLP包,并根据Header中的TD位来决定是否生成ECRC。ECRC通过Header和Data的所有bit(除了Header中的EP比特,Type的比特0 这个两个bit。在计算时,总认为这两个比特都为1)计算出来。将待发送的TLP包放入VC transmit buffer,在Flow Control表示接收端有足够空间的VC receive buffer来接收后,将TLP传输给数据链路层,然后经过物理层发送出去。

接收:根据ECRC去检查TLP包的CRC错误,如果没错,则删掉ECRC,将其余数据传输给软件层。如果TLP存在CRC错误,则.......

Flow Control后面会有章节进行介绍,简单来说就是接收设备定期的发送一种DLLP包(FCx DLLP)给发送设备,用来表示接收设备中VC receive buffer还存在多大的空间。发送设备收到DLLP,解析得到空间足够,就会发送需要发送的TLP包。

也就是说物理连接的两个设备,两端的TX都会定期发送流控制DLLP包,两端的RX都会接收到,两个设备的发送部分都会知道对方设备的接收部分中VC receive buffer还存在多大的空间,从而控制发送部分是否发送TLP包。

1.2,Data Link Layer

数据链路层主要功能是保证在各链路上发送和接收数据包时数据的完整性。

发送TLP:在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 IDACK DLLP包给Device A,A接收到后,就认为TLP包成功到达B了(TLP的目的地不一定时B,也许需要B去转发),然后会将Replay Buffer中相应Sequence ID的TLP包删除。

如果存在CRC错误,Device B会返回一个带Sequence IDNAK DLLP包给Device A,A将会重新发送保存在Replay Buffer中相应Sequence ID的TLP包。并在数据链路层生成用于错误报告和记录机制的错误标记。

注意:是Sequence ID将ACK/NAK 和 Replay Buffer中保存的TLP包联系起来。

接收TLP:接收到TLP后,会进行CRC检查,如果有错误,将会将该TLP包丢弃,并返回一个NAK给Device A。如果没有错误,将会返回一个ACK给Device A,并将TLP包的Sequence ID和LCRC去除后传输给事务层。

接收DLLP:接收DLLP后,会进行CRC检查,如果有错误,将会将该DLLP包丢弃,丢弃一个DLLP包所损失的信息可以自我修复,因为紧接着后续的一个DLLP将会替代丢失的信息?(丢一个直接拿后一个DLLP来用?)

1.3,Physical Layer

物理层可以分为逻辑物理层(Logic Physical Layer)和电气物理层(Electrical Physical Layer),逻辑物理层主要指物理层的数字电路部分,电子物理层主要指物理层的模拟电路部分。

功能:发送和接收数据包,完成链路训练和初始化(Link Training and Initialization)。

         链路训练和初始化后面会有章节介绍,在此过程中主要确定如下事情:

            1)链路宽度

            2)链路数据速录

            3)通道反转

            4)极性反转

            5)每通道Bit锁定

            6)每通道Symbol锁定

             7)多通道链路内通道到通道之间的相位补偿

发送:将从数据链路层接收到的数据包(TLP,DLLP)加上Start和End字符,组装成最终的发送结构。然后将数据包拆分为字节,对数据进行加扰,然后进行8b/10b(GEN1和GEN2)或者128b/130b(GEN3及以上)编码,最后进行并串转换成串行比特流,然后将其以差分信号发送出去。

加扰:将源数据与一个随机的数据进行异或操作,得到新的数据,该新数据也可以看作是一个随机数据。从而降低数据流的EMI噪声。

随机数据如何得到:PCIe总线通过一个16位线性反馈移位寄存器(Linear Feedback Shift register, LFSR)产生为随机序列,该移位寄存器的表达式如下所示:

       G(x)=X^16+X^5+X^4+X^3+1

加扰更多信息可以参考:https://blog.csdn.net/icxiaoge/article/details/80023404

编码:编码主要是为了DC平衡。让数据流中0和1的个数尽量相等。GNE1和GEN2中采用8b/10b编码,GEN3及以上采用的是128b/130b编码。

接收:接收会将串行的数据流通过串并转化转化为并行数据,接收还有一个弹性buffer(elastic buffer),可以用于调节发送时钟和接收时钟之间的时钟频率变化。然后会将数据进行解码,将10bit数据还原成8bit,并会对数据进行解扰操作,再将数据进行反拆分,重新组成原始的数据包。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐