UVM Objection
作用
1、控制taskphase的运行和终止
2、同步各个component同名的task phase
代码示例
示例一
在上一篇博客的基础上对driver的代码进行修改,之后运行仿真。
class my_driver extends uvm_driver #(my_transaction);
`uvm_component_utils(my_driver)
function new(string name = "my_driver", uvm_component parent);
super.new(name, parent);
endfunction
virtual task reset_phase(uvm_phase phase);
phase.raise_objection(this);
#100;
`uvm_info("DRV_RESET_PHASE", "Now driver reset the DUT...", UVM_MEDIUM);
phase.drop_objection(this);
endtask
virtual task configure_phase(uvm_phase phase);
phase.raise_objection(this);
#100;
`uvm_info("DRV_CONFIGURE_PHASE", "Now driver config the DUT...", UVM_MEDIUM);
phase.drop_objection(this);
endtask
virtual task run_phase(uvm_phase phase);
# 3000;
forever begin
seq_item_port.get_next_item(req);
`uvm_info("DRV_RUN_PHASE", req.sprint(), UVM_MEDIUM)
#100;
seq_item_port.item_done();
end
endtask
endclass
reset_phase中不加raise和drop objection,运行仿真,从打印信息中可以看出,reset_phase中的语句并未执行。
在reset_phase中加上raise和drop objection之后,reset phase的语句正常执行。
无消耗仿真时间的时间语句的phase可正常执行,上述代码注释一部分如下,也可正常执行。
virtual task reset_phase(uvm_phase phase);
// phase.raise_objection(this);
// #100;
`uvm_info("DRV_RESET_PHASE", "Now driver reset the DUT...", UVM_MEDIUM);
// phase.drop_objection(this);
endtask
注意
1、Objection对于task phase才有意义,控制task phase的运行和终止。
2、必须在执行消耗仿真时间的语句之前raise objection
3、在task phase结束时drop objection。
4、在一个component中的某个task phase中raise和drop objection会影响其他component中同名的task phase。
5、建议在每个task phase中都raise和drop objection一次。
使用原则
1、raise和drop objection成对使用。
2、尽量在每个task phase使用raise objection和drop objection。
3、不要在无限循环中使用raise objection和drop objection。
4、每个phase中尽量只使用一次。
5、raise objection需要在消耗仿真时间的时间语句之前。