1、在某個component(例如my_sequencer、my_env)的main_phase中手工啟動sequence:
task my_sequencer::main_phase(uvm_phase phase);
my_sequence seq;
phase.raise_objection(this);
seq=my_sequence::type_id::create("seq");
seq.start(this);
phase.drop_objection(this);
endtask
task my_env::main_phase(uvm_phase phase);
my_sequence seq;
phase.raise_objection(this);
seq=my_sequence::type_id::create("seq");
seq.start(i_agt.sqr);
phase.drop_objection(this);
endtask
2、在某個component的build_phase中設置如下代碼即可:
例如my_env中:
virtual function void build_phase(uvm_phase phase);
super.build_phase(phase);
……
uvm_config_db#(uvm_object_wrapper)::set(this,"i_agt.sqr.main_phase","default_sequence",my_sequence::type_id::get());
endfunction
例如top_tb中:
module top_tb;
……
initial begin
uvm_config_db#(uvm_object_wrapper)::set(null,"uvm_test_top.i_agt.sqr.main_phase","default_sequence",my_sequence::type_id::get());
end
endmodule
例如my_agent中:
function void my_agent::build_phase(uvm_phase phase);
super.build_phase(phase);
……
uvm_config_db#(uvm_object_wrapper)::set(this,"sqr.main_phase","default_sequence",my_sequence::type_id::get());
endfunction
以上兩種方式原理相同:
在uvm_sequence這個基類中,有一個變量名為starting_phase,它的類型是uvm_phase。
sequencer在啟動default_sequence時,會自動做如下相關操作:
task my_sequencer::main_phase(uvm_phase phase);
.......
seq.starting_phase=phase;
seq.start(this);
......
endtask