前言
在张强《UVM实战》中的179页,提到了“uvm_do系列宏其实是将下述动作封装在一个宏中”,这句话大概的提到了uvm_do这个宏里边的具体实现,但是这些内容是怎么通过sequencer,与底层的driver进行交互的,确不得而知。本文主要记录一下,uvm_do这个宏,与底层driver交互的方式,从而进一步帮助我们理解数据的传递方式。
一、`uvm_do宏与底层driver交互的方式
上图中展示了,底层driver与sequencer之间,数据包传递控制的细节,具体描述如下:
1、sequence中的uvm_do宏展开分为四个操作,分别是创建、开始、随机、结束。
创建,uvm_create(req)宏:
2、sequence先是创建一个数据包,接着等待他的父组件sequencer授予许可,去开启一个数据传输。
开始,start_item(req):
3、sequencer的许可来自driver调用get_next_item(req),sequencer和driver之间通过seq_item_port这个TLM进行连接。
4、sequencer对来自sequence的数据包进行仲裁和授权。
5、sequence接着对启动完成的数据包进行标记。
随机,req.randomize():
6、sequence对数据包进行随机。
结束,finish_item(req):
7、sequence调用finish_item(req),让sequencer将数据包通过TLM接口传递给driver,driver接收到数据包后,对数据包进行处理,然后通过TLM端口发出完成确认。
8、sequence通过调用end_tr,将数据包标记为结束,再继续开启下一个数据包的发送。
注意:
自动记录数据包的功能可以通过如下的编译开关进行关闭,但是请谨慎使用,因为他是一个全局开关。
+define+UVM_DISABLE_AUTO_ITEM_RECORDING
在UVM-1.2和IEEE UVM中,可以通过调用driver中的接口方法seq_item_port.disable_auto_item_recording(),单独关闭自动记录数据包的功能。
class driver extends uvm_driver#(packet); // other code not shown
packet pkt_q[$];
virtual task run_phase(uvm_phase phase);
`ifndef UVM_VERSION_1_1
seq_item_port.disable_auto_item_recording(); // UVM-1.2 & IEEE
`endif
// All versions can use +UVM_DISABLE_AUTO_ITEM_RECORDING option
fork
get_item();
execute_item();
join
endtask
endclass
总结
本文主要记录一下uvm_do这个宏的具体实现,以及与底层driver之间的交互过程。