phase机制
1.
task_phase
消耗仿真时间,而function_phase
则不消耗仿真时间。上图中的phase自上而下运行,其中灰色的部分为task_phase
。
最常用的是是build_phase、connect_phase和main_phase
2.
run_phase
中的reset
、configure
、main
、shutdown
四个phase
是核心,分别完成对DUT的复位、配置、运行和关闭等操作。
function_phase
基本都是自下而上执行的,当然这不包括build_phase
,因为这是自上而下执行的,而task_phase
是并行执行的。
注意对于同一层次的component的build_phase
是按照字符串名称的字典序进行执行的。
run_phase
中自上而下启动并执行,即顺序同时启动,并行运行。
UVM中采用深度UVM树的遍历,同时按照字典序排序。
如上图如果i_agt实例化时是bbb
,而scb为aaa
,则会先执行scb的build_phase
,再执行i_agt的build_phase
,接下来是driver、monitor及sequencer的build_phase
。如果要求scoreboard的build_phase
晚于driver的build_phase
执行,或者要求两者的顺序反过来,需要修改实例化名。
3.
virtual function void build_phase(uvm_phase phase);
super.build_phase(phase);
if(!uvm_config_db#(virtual my_if)::get(this, "", "vif", vif))
`uvm_fatal("my_driver", "virtual interface must be set for vif!!!")
`uvm_error("my_driver", "UVM_ERROR test")
endfunction
有时候用uvm_errror
会更好,因为一样会像uvm_fatal
那样退出,并且会一次爆出所有的错误,并停止仿真。这样可以提高debug的效率。
4.
一般情况下phase是顺序执行的,但UVM可以实现phase之间的跳转,比如在验证平台中监测到reset_n
信号为低电平,则马上从main_phase
跳转到reset_phase
。driver的代码如下: