信号说明:
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;
以axi总线为例,对ost能力进行说明:
mst接口的ost能力,以axi_mst接口的aw、w和b通道为例说明ost的控制方式(不带前一级控制,只受到fifo/buffer空满控制):
slv接口的ost能力,这里的slv的指令是从模块内部路由过来的(不带前一级控制,只受到fifo/buffer空满控制):
测试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即可;