uvm中在不同组件中提起objection和撤销objection的方式
当不在sequence组件中时,提起和撤销objection的方式:
当不在sequence中可以使用phase来控制验证平台的开启和关闭。
在driver中:
task my_driver::main_phase(uvm_phase phase);
my_transaction tr;
phase.raise_objection(this); //提起objection
vif.data <= 8'b0;
vif.valid <= 1'b0;
while(!vif.rst_n)
@(posedge vif.clk);
for(int i = 0; i < 2; i++) begin
tr = new("tr");
assert(tr.randomize() with {pload.size == 200;});
drive_one_pkt(tr);
end
repeat(5) @(posedge vif.clk);
phase.drop_objection(this); //撤销objection
endtask
在base_test中
class my_cass0 extends base_test;
virtual function build_phase(uvm_phase phase);
super.build_phase(phase);
endfunction
phase.raise_objection();
fork
case0_cfg_vseq.start(vsqr.cpu_sqr);
case_vseq.start(vsqr.apb_sqr);
join
phase.drop_objection();
endclass
在sequence组件中,提起和撤销objection的方式:
在sequence中可以使用starting_phase来控制验证平台的开启和关闭。
class case0_sequence extends uvm_sequence #(my_transaction);
my_transaction m_trans;
function new(string name= "case0_sequence");
super.new(name);
endfunction
virtual task body();
if(starting_phase != null)
starting_phase.raise_objection(this); //提起objection
#100;
`uvm_info("sequence0", "body is called!!!", UVM_LOW)
if(starting_phase != null)
starting_phase.drop_objection(this); //撤销objection
endtask
`uvm_object_utils(case0_sequence)
endclass
class my_case0 extends base_test;
virtual function void build_phase(uvm_phase phase);
super.build_phase(phase);
uvm_config_db#(uvm_object_wrapper)::set(this, "v_sqr.configure_phase", "default_sequence", case0_cfg_vseq::type_id::get());
uvm_config_db#(uvm_object_wrapper)::set(this, "v_sqr.main_phase", "default_sequence", case0_vseq::type_id::get());
endfunction
endclass
浙公网安备 33010602011771号