目录如下:
正文在下面
上一节在看打印信息的时候,我们发现main_phase在执行过程中好像被杀死了,已经输出了’main_phase is called’,但后面就没有了。的确是这样的,UVM通过objection机制来控制验证平台的关闭:在每个phase中,UVM会检查是否有objection被提起(raise_objection),如果有,那么等待这个objection被撤销(drop_objection)后停止仿真;如果没有,则马上结束当前phase【为何2.2.1节my_driver.sv中没有raise_objection也没有马上结束当前phase呢?】。更改之后my_driver的代码如下:
`ifndef MY_DRIVER__SV
`define MY_DRIVER__SV
class my_driver extends uvm_driver;
`uvm_component_utils(my_driver)
function new(string name = "my_driver", uvm_component parent = null);
super.new(name, parent);
`uvm_info("my_driver", "new is called", UVM_LOW);
endfunction
extern virtual task main_phase(uvm_phase phase);
endclass
task my_driver::main_phase(uvm_phase phase);
phase.raise_objection(this);
`uvm_info("my_driver", "main_phase is called", UVM_LOW);
top_tb.rxd <= 8'b0;
top_tb.rx_dv <= 1'b0;
while(!top_tb.rst_n)
@(posedge top_tb.clk);
for(int i = 0; i < 256; i++)begin
@(posedge top_tb.clk);
top_tb.rxd <= $urandom_range(0, 255);
top_tb.rx_dv <= 1'b1;
`uvm_info("my_driver", "data is drived", UVM_LOW);
end
@(posedge top_tb.clk);
top_tb.rx_dv <= 1'b0;
phase.drop_objection(this);
endtask
`endif
和之前的my_driver.sv相比有什么区别呢?我们可以看到,在task下面加了’phase.raise_objection(this)‘,在endtask前面加了’phase.drop_objection(this)’。
在刚开始学习时,可以认为drop_objection是finish的替代,只是它必须和raise_objection成对使用,且后者在前面。
要注意raise_objection必须放在消耗仿真时间的语句之前。