PCIe一些系统参数(MPS, MRRS, RCB)的深度解析
首先这篇文章跟大家之前看到的文章不一样,通过耐心阅读相信大家一定能有深刻的理解。
一、各个参数含义
1、MPS(Max Payload Size)
该参数含义是一个TLP包里携带的有效净荷的最大值是多少字节(该限制条件同时适用于写操作和读操作)。
2、MRRS(Max Read Request Size)
该参数含义是一个TLP读请求包,一次最多能向接收端请求读出多少字节。
请求读多少字节是在TLP包头的Length字段(见上图)指定的。要注意,Length是以DW(4个字节)为单位的,而MPS/MRRS/RCB参数的单位都是字节。
3、RCB(Read Completion Bounary)
该参数含义是接收端在向发送端返回读响应数据时,多个TLP包的大小必须是RCB的倍数,即必须对齐到RCB地址边界上。
这个参数不容易理解,下面通过一个具体例子来感受一下。
For instance if you read 100h (256) bytes from address 00010028h and the RCB is 64 bytes. The data will most likely be returned as follows:
a) 先返回一个24 bytes长度的CplD包(为什么会先返回24字节长度的包?原因是首地址10028h不是RCB值即64B的整倍数,为了对齐地址,需要先返回一个24B的包,这样地址就对齐到了10040h)。对应地,地址递增情况是:10028h + 18h = 10040h
b) 再返回一个64 bytes长度的CplD包。对应地,地址递增情况是:
10040h + 40h = 10080h
c) 再返回一个64 bytes长度的CplD包。对应地,地址递增情况是:
10080h + 40h = 100C0h
d) 再返回一个64 bytes长度的CplD包。对应地,地址递增情况是:
100C0h + 40h = 10100h
e) 再返回一个40 bytes长度的CplD包。对应地,地址递增情况是:
10100h + 28h = 10128h
There are other valid combinations here that could be used, but most root complexes tend to return the smallest completions as allowed.
有人会问为什么会出现10028h这样没有对齐到64B的倍数的地址?原因是读请求的大小在MRRS限定的范围内是随意的(意思是可以不是64B的倍数)。
二、参数之间的对比
-For read request baundary is Maximum Read Request Size
-For one completion baundary is Maximum Payload Size(此限制对读写均适用)
-For multiple completion baundary is RCB
三、思考
MRRS参数出现的原因大家有没有想过……其实设定MRRS的原因是为了避免某个设备长时间占用总线
参考链接:https://forums.xilinx.com/t5/PCIe-and-CPM/any-useful-for-128bytes-Read-Completion-Boundary-RCB/td-p/9533
本文地址:https://blog.csdn.net/weixin_39615959/article/details/111862928