沧小海笔记之PCIE协议解析——第三章 PCIE的数据链路层

总目录在此哦~

https://blog.csdn.net/z123canghai/article/details/115644744


目录

3.1 链路层干的活

3.1.1 DLLP格式

3.1.2 ACK/NAK协议

3.1.3 数据链路层发送报文的顺序

3.2 链路层的初始化


我们对进行数据交换的两个个体有不同的称呼,或称之为源设备和目标设备,或是接收端和发送端。这样的不同称呼并不是随意为之。源与目标设备间的数据交换一般是按照一定的路由规则,也就是之间会经过很多“中转站”,而描述发送接收端则是一种点对点的通讯方案,两个个体通过在一定程度上固定的链路进行连接,实现数据的交互。而PCIE的链路层间的数据交换就是相邻两个点之间的数据收发。、

         对PCIE数据链路层的理解可以分为两个方面,一方面是干活,另一方面是维护。它作为事务层和物理层的中间阶段,扮演着承上启下的作用,也就意味着TLP数据要进过这里做些操作,其本身也会产生一种叫DLLP的数据包与相邻端点链路层进行数据交换。维护即对本层状态的一个监控,及将物理层、事务处与本层状态进行处理,用于链路维护。


3.1 链路层干的活

         如下图是链路层简单的拓扑结构图,链路层内部关于发送和接收的部分可分为发送和接收两个部件组成。其中发送部件由Replay Buffer、ACK/NAK DLLP、TLP发送模块组成,接收部件由“Error Check”、ACK/NAK发送逻辑和TLP接收模块组成,每个节点的链路层是一样的,均包含上述模块来实现数据的接收与发送。

 

         首先来看一下数据的传输机制。当PCIE进行数据传递时,首先在事务层中产生TLP数据包,随后将其发送给数据链路层,数据链路层给TLP加上前缀和CRC并放入Replay Buffer中,然后在发送到物理层。接收端收到数据后在链路层去掉前缀和CRC,再将数据送达事务层,这就是传输方式。这里面就涉及到了Replay Buffer、Error Check 和ACK/NAK协议相关概念。首先说下Replay Buffer,其实这就是个FIFO,其大小决定了可以缓存事务层交付给链路层的数据量。在完成数据发送或超时会释放对应空间,在这其中也有有些处理机制,就不展开阐述了。Error Check是对于接收端的数据检查,唯有检查通过才会发送到事务层,或根据需要返回给发送端一个完成信号,这个带有完成信号的数据包称之为DLLP,也就是ACK/NAK协议相关内容。


3.1.1 DLLP格式

         DLLP数据包是始于链路层并止于链路层。其存在意义是保证TLP数据包的正确传输和管理PCIE链路。DLLP数据包格式如下所示,一共是6个字节,这个长度是固定的。

 

         其中“DLLP Type”字段是表示数据包的类型,如下所示,下面就简单介绍下各类型。

 

1、ACK

         该数据包是接收端发送到发送端的数据包,表示接受到了对端数据,意味着一次的数据传输完成了。

2、NAK

         该数据包是接收端到发送端的数据包,该数据包表示接收端有哪些数据包并没有被接收,接收端接收后会释放以正确接收的数据包的缓存空间,重传未正确接收的TLP。

3、PM_**

         PM即power Management,也就是与电源管理相关,用于保证电源管理状态机的正常运行。

4、Vendor-Specific

         PCIE总线并没有对此进行规定,用户可自定义

5、其他

         这部分涉及到InitFC*、UpdateFC*相关数据包,是用于流量控制的,具体会在后面相关章节阐述。


3.1.2 ACK/NAK协议

         ACK和NAK是DLLP两种数据类型,用于保证传输TLP能够被正确的传输的。首先明确的是,链路层的数据交换是固定的两个设备间的数据交换,是固定的。每个设备都有一个发送模块、一个接收模块,如下图所示。

 

         保证数据完整性主要通过CRC校验和循环数校验,以及相对应的重传机制。ACK/NAK协议是一种滑动窗口协议,这个窗口其中就是环形缓冲区。发送端在发送TLP时,首先为这个TLP添加sequence(循环数)和校验码放入发送窗口中,并对这些TLP从0到N进行编号,只要发送窗口不满,发送端就可以持续的从事务层中接收报文。

         上文说的循环数就是发送端的包计数器,该计数器称之为NEXT_TRANSMIT_SEQ,位宽是12bit。发送端链路层每发送一包数据,这个计数器就加一,计满清零。接收端也有个类似的计数器,称之为NEXT_RCV_SEQ,当接收端接收一包数据后会比较接收的循环数与NEXT_RCV_SEQ是否一致,一致则说明包序正常无丢包,如果校验通过则会将这报数据发送到事务层,否则丢弃。

         接收端并不是对每一包数据都进行应答,这样太占用链路,而是采用收几包应答依次的方案,例如收了3包向发送端发送一包ACK数据包表示之前几包数据都收到了。在ACK数据包中添加了接收的序列号,叫做AckNak_Seq_Num。例如上图,发送端要发送3到7这几包数据,如果接收端返回应答包的序列是5表示第3、4、5包收到了,则可清空对应的缓冲区。如果收到了NAK数据包,则表示该包数据中的序列号对应的数据包未正常接收,发送端需重新发送,但不能一直重新发送,这样不仅占用链路,而且还会造成死锁,故需用些机制来有限制的纠错。

         对于链路层的通讯,有两种纠错机制,一种是校验错误,一种是超时判断。

         在发送端,有一个计数器,叫做REPLAY_NUM,这是个2bit位宽寄存器,接收端每收到一包NAK数据包则会加一,当计满后清零并终止TLP包发送并重新进行链训练。如果REPLAY_NUM加一后收到了ACK数据包,也就是校验通过的数据,则证明通讯恢复了,可继续进行数据传输。

         此外,发送端还有一个REPLAY_TIME计数器,用来记载一个TLP报文从发送到获得ACK/NAK回应的时间,如果时间超过阈值则发送端若认为PCIE链路出现故障,链路会进行重新训练等操作,以判断在TLP的传输过程中是否出现异常。另外,在接收端也有AckNAK_LATENCY_TIMER计数器,该计数器溢出时,接收端将重发NAK数据包。一般AckNAK_LATENCY_TIMER阈值是REPLAY_TIME的三分之一。


3.1.3 数据链路层发送报文的顺序

         数据链路层还规定了报文发送的顺序,DLLP和TLP数据包是共用一个PCIE链路,除此之外还有物理层的数据包,因此PCIE链路需要合理安排报文的发送数据,以避免锁死,故规定如下:

1、正在发送的TLP或者DLLP具有最高优先权。PCIE总线为了保证数据的完整性,不允许打断正在传送的报文。

2、处于底层的报文优先级高于处于协议高层的报文,例如NAK数据包优先于TLP

3、错误处理报文优先于正确的响应,例如NAK数据包优先于ACK

4、重传TLP数据包要优先于正常传输的TLP,因为重传数据包有问题,在其之后的数据包正确传输过去也不会正确接收

5、地址路由、电源管理等消息报文优先级最低。


3.2 链路层的初始化

         链路层需要通过物理层监控PCIE链路状态,并由控制与管理状态机“DLCMSM”状态机指示当前状态,如下图所示。链路层会从物理层获取DL_Inactive、DL_Init和DL_Active这三个相关状态信息。

 

DL_Inactive状态表示PCIE链路不可用,没有检测到与之相邻的设备,可能是链路或者对端设备存在问题,或根本不存在。当状态机在该状态复位后会对链路层进行全面的初始化操作,包括丢弃Replay BUFFer数据,将相关计数器清零等操作。

DL_Init状态表示PCIE链路层可用,且物理层正处于链路初始化状态,此时数据链路层不能接受或发送任何数据包,这时PCIE链路会初始化VC0的流量控制机制,然后再对其他虚拟通路进行流量控制初始化。当链路层的VC0初始化完毕,且物理层到链路层的“LinkUP”信号为1的时候,状态机会迁移到“DL_Active”状态。

DL_Active状态是设备正常工作的状态,此时可以进行正常的数据交换。根据上面的状态机迁移图可以看出,DL_Active不能倒DL_Ini状态,只能到DL_Inactive状态,从DL_Active状态到DL_Inactive状态的可能性有:1、Bridge Control Register位被系统置一;2、Link Disable被系统置一;3、对端设备发送来了PME_Turn_Off信号,本设备进入低功耗状态;4、若是支持热插拔的设备,Hot Plug Surprise或Power Controller Control置一,也就是在被拔出时候,当然还有其它,故等等。

链路层根据物理层状态会进行不同的状态,本层也会产生些状态信号告知事务层。主要有两个信号,一个是DL_DOWN,一个是DL_UP。

DL_Down状态表示PCIE对端没有发生其它设备或本设备链路层、物理层处于不可用状态。当链路层处于DL_Inactive状态状态时该状态位有效。DL_Up状态表示PCIE链路的对端连接了其他设备,可以进行正常的数据交换。

  • 5
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值