AXI协议中使用五个通道进行数据的传输,分别是:
- Read address channel
- Read data channel
- Write address channel
- Write data channel
- Write response channel
其中,Read data channel以及Write response channel是从Slave interface返回给master interface的数据。因此在Synopsys AXI VIP中存在有专门的Slave response。
directed_test中使用的是axi_slave_reorder_response_sequence,为更清楚的看到各个transaction的返回顺序,给每一个transaction赋一个ID。使用`uvm_do_with在随机化时对某些字段添加约束,使用for循环随机化transaction时,添加约束限制此transanction的ID为一个定值。例如添加以下约束:
for (int i = 0;i < 8;i++) begin
`uvm_do_with(write_tran[i],
{
xact_type == svt_axi_transaction::WRITE;
id == i;
burst_type == svt_axi_transaction::INCR;
burst_length inside {4,8,16};
}
)
for (int x = 0;x < sequence_length;x++) begin
`uvm_do_with(read_tran[x],
{
xact_type == svt_axi_transaction::READ;
id == x;
})
添加以上约束后,transaction会被赋予一个ID值,这个ID值会被放到WID和RID上,AXI4中WID被取消,写数据通道的数据必须严格的按照写地址通道的数据顺序传送,这里不讨论写数据的乱序问题。读数据过程分为两个部分,读地址通过Read address channel,Master发送给Slave后,Slave需返回相应数据,这个数据返回的顺序可以通过设置重新排序算法reordering_algorithm进行设置,reordering_algorithm分为三种,分别是:
- RANDOM
- PRIORITIZED
- ROUND_ROBIN
RANDOM,即随机,表示transaction将按照任意随机顺序处理,与收到transaction的顺序无关。
PRIORITIZED,即存在优先,transaction将按照优先顺序处理,优先级通过 reordering_priority指定。reordering_priority通过read_data_reordering_depth 先设置允许访问读取数据通道的transaction,然后对这些transaction的进行重排序优先级。
ROUND_ROBIN,即transaction将按照接收到的transaction顺序处理。
以上三种设置方式仅适用于Slave agent。
1.PRIORITED设置及运行结果
主要讨论PRIORITIZED按照优先级返回transaction的方法,设置代码如下:
if(req_resp.xact_type == svt_axi_slave_transaction::WRITE) begin
if(req_resp.id == 5) begin
req_resp.reordering_priority = 8;
end
else begin
req_resp.reordering_priority = 1;
end
put_write_transaction_data_to_mem(req_resp);
end
else begin
case(req_resp.id)
4:req_resp.reordering_priority=1;
3:req_resp.reordering_priority=2;
2:req_resp.reordering_priority=3;
5:req_resp.reordering_priority=4;
1:req_resp.reordering_priority=5;
6:req_resp.reordering_priority=6;
7:req_resp.reordering_priority=7;
default:req_resp.reordering_priority=1;
endcase
get_read_data_from_mem_to_transaction(req_resp);
end
在directed_test中,设置Slave中的read_data_reordering_depth为7,与for循环中的transaction数量相等,这样,7个transaction都可以进行优先级的排序。当下xact_type的类型为READ时,设置各个transaction的优先级,按照上述所示代码的case语句,分别设置相应ID的transaction对应的优先级如下表:
PRIORITIZED | ID |
1 | 4 |
2 | 3 |
3 | 2 |
4 | 5 |
5 | 1 |
6 | 6 |
7 | 7 |
跑directed_test,波形显示的Read data channel返回数据的顺序如图所示:
波形显示返回transaction的ID顺序为7,6,1,5,2,3,4。说明对reordering_algorithm的设置生效,其返回顺序是按照设置的优先级进行返回的。
做这样一个实验,将某一个ID值的prioritized设置为最大,设置其它ID的值为相同并且小于最大prioritized,如下列代码所示:
if(req_resp.id==6) begin
req_resp.reordering_priority = 2;
end
else begin
req_resp.reordering_priority = 1;
end
设置ID为6的reordering_priorited为2,其它所有ID的值为1,运行结果如下图:
根据文档所写,多个transaction ID具有相同的优先级时,按照这些transaction接收到的顺序进行处理,在这种情况下,ID为6的transaction最先出现,后面顺序依次为7,5,4,3,2,1。
问题:文档中所说是The transactions with the least value for this attribute will get higher priority,此属性值最小的将获得更大的优先级,但从波形上来看,是属性值最大的获得更大的优先级。
2.RANDOM运行结果
设置优先级算法reordering_algorithm为RANDOM。
运行结果如图所示:
从波形图上来看,对transaction的处理非常随机。
3.ROUND_ROBIN运行结果
设置优先级算法reordering_algorithm为ROUND_ROBIN。
运行结果如图所示:
对于ROUND_ROBIN这个算法,在之前顺序无误的情况下,read_data_reordering_depth设置为何值对其结果没啥影响,设置了也是按照返回的顺序进行处理。
通过以上三种reordering_algorithm的讨论,可以得出slave返回response的顺序可以通过指定算法类型进行顺序的设定。其中algorithm=PRIORITIZED可以进行任意顺序的设定。
以上均是等待重排序transaction与transaction数量相等的情况。