首先这篇文章跟大家之前看到的文章不一样,通过耐心阅读相信大家一定能有深刻的理解。

一、各个参数含义

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