1、objection机制
objection字面的意思就是反对、异议,主要面向于task phase。在验证平台中,可以通过drop_objection来通知系统可以关闭验证平台。例如:
task driver::main_phase(uvm_phase phase);
phase.raise_objection(this);//检测到有objection被提起,该phase中的代码被执行
#100;
phase.drop_objection(this);//撤销objection
endtask
task monitor::main_phase(uvm_phase phase);//检测到driver中有objection被提起,该phase中的代码被执行
while(1) begin
…
end
endtask
UVM系统监测到所有的objection已被撤销,就直接停止monitor中的无限循环,并跳入到下一个phase。
task driver::main_phase(uvm_phase phase);
#100;
endtask
task monitor::main_phase(uvm_phase phase);
while(1) begin
…
end
endtask
当driver和minitor中都没有提起objection时,driver和monitor中的代码将不会被执行,而是直接跳入到下一个phase。
因此,如果想执行一些耗时的代码,就需要在此phase下的任意一个component中至少提起一次objection。
特别说明:以上只适用于12个run_time 的phase,对run_phase并不适用。如果12个run_time phase中有objection被提起,那么run_phase中不需要提起objection代码就可以自动执行。
2、控制objection的最佳选择
常用的有两种选择:一是在scoreboard中提起;二是在sequence中提起。
3、set_drain_time使用
通过set_drain_time可以为uvm所有的objection设置drain_time属性。
task base_test::main_phase(uvm_phase phase);
phase.phase_done.set_drain_time(this, 200);
endtask