UVM中通过objection 机制来控制phase的执行,通过raise or drop objection来决定phase中事件的开始和停止。在进入到某一phase时,UVM会收集此phase提出的所有objection,并且实时监测所有objection是否已经被撤销了,当发现所有都已经撤销后,那么就会关闭此phase,开始进入下一个phase。当所有的phase都执行完毕后,就会调用$finish来将整个的验证平
台关掉。
注意点:
- Objection机制应该用在耗时语句之前
- 若phase中没有任何objection被提起,则会直接跳转到下一个phase中。
- run_phase与动态运行的12个phase是并行的,即如果动态运行的pahse中有Objection被提起,run_phase会自动执行,而不会等待其drop_objection以后再执行。
task driver::main_phase(uvm_phase phase);
phase.raise_objection(this);
#100;
phase.drop_objection(this);
endtask
task monitor::main_phase(uvm_phase phase);
while(1) begin
…
end
endtask
如上所示,当进入main_phase以后,发现有objection被提起,那么monitor中的代码会被执行,而当100个时间单位以后,objection被撤销,那么uvm则会立即跳入到下一个phase中,即post_main_phase,当然,monitor中的进程也被”杀死“
如果,去掉driver的main_phase中的objection, 那么程序执行到main_phase时会立刻跳到post_main_phase。
同样,通过如下代码可以证明,run_phase与动态运行的12个phase是并行的,只要动态phase中有Objection被提起,run_phase就会被执行
task my_case0::main_phase(uvm_phase phase);
phase.raise_objection(this);
#100;
phase.drop_objection(this);
endtask
task my_case0::run_phase(uvm_phase phase);
for(int i = 0; i < 9; i++) begin
#10;
`uvm_info("case0", "run_phase is executed", UVM_LOW)
end
endtask
上述代码运行结果可以看到“run_phase is executed”被输出了9次
一般来说,基于UVM的设计哲学,激励的生成应该全部由sequence来控制,因此一般情况下在sequence中控制objection。