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

(89) 2024-06-30 09:01:01

信号说明:

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),每次猝发看地址在[下边界地址,上边界地址)之间,如果猝发地址等于上边界地址则会卷绕会下边界地址,以此类推,上下边界地址计算公式如下:

下边界地址:wrapaddr=(int(addr/(number_byte*burst_len))) *(number_byte*burst_len)
上边界地址:wrapaddr+(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个数;

Axi:名词解释、乱序、间插、卷绕、窄带访问、非对齐访问、OST (https://mushiming.com/)  第1张

  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能力;

Axi:名词解释、乱序、间插、卷绕、窄带访问、非对齐访问、OST (https://mushiming.com/)  第2张


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即可;

THE END

发表回复