Axi:名词解释、乱序、间插、卷绕、窄带访问、非对齐访问、OST

Axi:名词解释、乱序、间插、卷绕、窄带访问、非对齐访问、OST卷绕模式为 burst 2 的情况 包括 awburst arburst 每次进行猝发激励时会计算一个上边界地址和下边界地址 根据 start addr number byte burst len 每次猝发看地址在 下边界地址 上边界地址 之间 如果猝发地址等于上边界地址则会卷绕会下边界地址 以此类推 上下边界地址计算公式如下 下边界地址 wrapaddr int addr number byte burst len number byte burst len 上边界地址 wrapaddr awburst

信号说明:

AWBURST、ARBURST:

指示burst type,有3种burst类型。
Fixed:固定地址模式,每次burst传输首地址固定,用于访问FIFO
INC:递增递增模式,每次传输,地址从首地址开始递增
WRAP:wrap模式,地址递增,到达wrap边界时,返回到起始的size对齐的地址上。Wrap边界是由传输size来确定的。
对于wrap模式,有2个约束。第一,首地址要根据传输size对齐;第二,burst长度在4个取值范围内,2,4,8,16

AWLOCK、ARLOCK

特殊访问模式,设置成00,则指示是normal access;
01:exclusive,理解是read exclusive访问,然后就对该读地址进行监控,后续再有对相同地址进行exclusive 写操作时,必须写入的数据与之前读出的数据一致,否则就会在反馈通道中输出EXERR。
10:lock模式,该模式访问后,锁定了一个master的访问。之后不允许有其他ID的master进行访问,直到unlock解锁完成

乱序:举例说明,发送awid顺序为0、1、2、3,由于dut(前提是dut支持乱序操作)内部的busy状态导致bid的返回顺序为1、2、3、0,这种情况为乱序;

间插:间插表示的是一个burst中某一些bit在前一个或后一个burst中返回,比如burst1读回来的数据为:11h、22h、33h、44h,burst2读回来的数据为:66h、77h、88h、99h,但是由于dut支持间插且dut当前触发间插状态,导致dut最终读回数据为:11、22、88、33、44、66、77、99,这种情况即为间插;(间插即交织)

间插必乱序;


卷绕模式为burst=2的情况,包括awburst、arburst,每次进行猝发激励时会计算一个上边界地址和下边界地址(根据start_addr、number_byte、burst_len),每次猝发看地址在[下边界地址,上边界地址)之间,如果猝发地址等于上边界地址则会卷绕会下边界地址,以此类推,上下边界地址计算公式如下:

addr:猝发地址

number_byte:字节数(2^size)

burst_len:len+1

注:每次猝发都需要对上下边界地址进行计算、判断;

现象如下:

burst=2、arsize=4、arlen=4

经计算,addr0~3的下边界都为00、上边界都为40,所以总线访问地址分别如下:

addr___00:00、10、20、30

addr___10:10、20、30、00(注:卷绕了1个地址)

addr___20:20、30、00、10(注:卷绕了2个地址)

addr___30:30、00、10、20(注:卷绕了3个地址)

对应refm中的实现:

for(int i=0;i<=len;i++)

begin

        if(len==1)addr[4] += i%2;

        if(len==3)addr[5:4] += i%4;

        if(len==7)addr[6:4] += i%8;

end


以128bit位宽总线为例子:

Axi窄带访问:一次axi总线写transf(1个burst中包含len+1个transf)的有效数据量不够128bit(使用wstrb控制);

非对齐传输:addr和size必须对齐,否则为非对齐传输,size=5时,表示每次trans的数据量为128bit,需要0x10地址,但是如果addr不为0x10的整数倍,则为非对齐传输,如burst的地址为A1=0x8007,则为非对齐传输(如果burst的初始地址为非对齐,一般情况下每个transf地址也肯定为非对齐);但是一般情况都支持和size对齐传输;


ost的一些理解:

ost的实现方式:ost一般实现是通过fifo、buffer实现的,但是寄存器打拍一般也会增加ost能力,比如多打一拍,ost能力加1;

  1. 除了以fifo、buffer的空满进行控制之外,一般也会在fifo、buffer的前级增加控制电路,比如通过计数获取push_cmd、pop_cmd的个数,当push_cmd(受pop_cmd个数的控制)达到提前设置的最大值时,dut自动拉低ready信号,即不可在将命令输入进来,达到前一级的控制;
  2. 不用进行前一级的控制,只需要fifo、buffer的空、满进行控制;
  3. 其他的控制方式;

以axi总线为例,对ost能力进行说明:

mst接口的ost能力,以axi_mst接口的aw、w和b通道为例说明ost的控制方式(不带前一级控制,只受到fifo/buffer空满控制):

  1. 拉低bready;
  2. 持续发送aw_cmd,命令会被压入到cmd_fifo中,core从fifo中获取cmd进行处理,但由于force bready=0,导致b通道不能将bresp信号输出,导致当前处理的cmd不能从fifo中pop出去,最终fifo会报full信号,反压不能在进行cmd的输入,这时即达到ost最大能力;

slv接口的ost能力,这里的slv的指令是从模块内部路由过来的(不带前一级控制,只受到fifo/buffer空满控制):

  1. 作为slv接口,其ost能力是在模块内部实现的,如下图,bar口的ost能力是通过模块内部的两级矩阵实现的,其实就是两级矩阵pipeline中可以存放的cmd个数;

  1. 如上图,只激励pp0口时,bar口的ost受两级矩阵最小的ost控制(两级矩阵都是可以配置ost,并且两者的ost不一样),其实上图中就是1x2矩阵的ost,因为2x1矩阵的ost比较大;
  2. 同时并行激励pp0、pp1,bar口的ost是两个1x2矩阵ost之和;

测试bar的ost时,读bar口的cmd个数为bar口的ost,这时读pp0、pp1的cmd个数,问这两个ost有什么关系吗?

答:这两个没任何关系,测bar口的ost时,force *ready=0,读bar口发出去的cmd个数,就是bar口的ost;需要测pp0口的ost时,需要force pp0的*ready=0,这时读到的cmd个数是pp0口的ost。

实测:ost说的是burst的数量,不管Xwlen、Xsize为多少(自测过);

猜测:当Xwlen、Xsize都为较大值的时候,由于cmd_fifo的full信号还未拉高,data_fifo的full信号已经拉高,这时候应该也会控制cmd_fifo不再接收cmd信号,即达到ost能力(这是我的一种猜测);


ost的说明:ost的一种实现方法,reg slice用来实现硬件中的打拍作用,但是如上文所说,reg slice会给某一边的接口增加ost能力;


slv口ost的测试方式:

1)force接口的bready、rready信号:由于force的是对外接口的信号,并且bready、rready信号是dut的输出,一般这种force的方式,不能达到你想要实现的目的;但有种方式可以改进force测试ost的方法,就是force dut中bready、rready这两个信号最源头(本人没有尝试过);(不推荐)

2)大流量用例:这种实现起来比较简单,但是在仿真波形中看cmd的ost比较麻烦,有可能需要看长时间的仿真波形才能找到(看实现ost的fifo空满的话应该会比较省时省力);

3)延时:在用例中配置延时,一般是配置bresp、resp返回时间进行实现的;(最推荐)

mst口ost的测试方式:

1)force接口的bready、rready信号为0即可;

今天的文章 Axi:名词解释、乱序、间插、卷绕、窄带访问、非对齐访问、OST分享到此就结束了,感谢您的阅读。
编程小号
上一篇 2024-12-26 23:27
下一篇 2024-12-26 23:21

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ji-chu/96458.html