接口/总线/驱动
在处理TLP报文时,根据Fmt字段以及Type字段可以将TLP报文分为二十多种,当TLP报文送至数据链路层时,数据链路层在进行流量控制处理时则不会考虑这么多种情况。数据链路层里面的Flow Control,则会将报文分为三类:
Flow Control的初始化在DL_INIT中:
所用到的DLLP报文为:
按照Spec里面的规定,Flow Control的初始化顺序为:
按照协议里,最大可以支持到16bit。而FC域仅有12bit,协议里规定了FC的定义:
在cocotbext-pcie里,关于FC位宽的定义,Header、Data采用12、16bits:
Flow Control的初始化在cocotbext-pcie中也很明了简单:
可以看到,由于FC_INIT1、FC_INIT2内容基本一致,FC2基本没有做什么处理(具体真实的实现不了解)。
发送端发送一个TLP报文,在数据链路层需消耗Header、Data令牌。每一个TLP报文需消耗一个TLP,而如果有数据负载则每四个DW消耗一个Data令牌:
数据链路层进行判定是否能发送该数据出去:
令牌周期性的更新所用到的DLLP格式为:
接收端按照HdrFC、DataFC中的内容更新其令牌:
这里面看起来有一点不太合适的地方就是没有考虑Scale,按照DLLP里面的报文解析:
由于FC只有12bit,这里对于16bit的场景支持欠妥。
无论是Flow Control还是之前所说到的ACK/NAK,协议中都规定了最大发送间隔时间。在cocotbext-pcie中的计算方式如下:
这里面的计算单位是Symbol Time(物理层发送1Byte数据的时间)。这里面可能乍看懵逼,这部分在PCIe Spec 5.0里对应Appendixes H里:
Flow Control Latency:
ACK Latency:
全部0条评论
快来发表一下你的评论吧 !