default_sequence的作用?
1、default_sequence最大的作用就是隐式地启动sequence,然后利用uvm_sequence的成员变量starting_phase(类型为uvm_phase)来挂起与释放objection,从而控制phase的运行,这里的starting_phase实际上是一个指针,指向其挂载的sqr的confidure_phase上,这样就解决了sequence不能使用phase与objection的问题,因为sequence是object类而,phase与objection的概念是对component而言的,因此UVM内置成员变量starting_phase,将其指向有phase概念的component类的sqr,便可将objection与sequence完全联系起来
2、简化了sequence的挂载启动(即指明sequence产生的transaction要发送给哪个sequencer)
具体而言
1)就是在某个component的build phase阶段使用config_db与default sequence替代了在某个component的main phase阶段利用seq.start(i_agt.sqr)启动sequence。
//component的build phase阶段使用default_sequence启动sequence
//default_sequence要使用config_db,而build_phase一般用于config_db配置信息及变量的实例化
virtual function void build_phase(uvm_phase phase);
super.build_phase(phase);
uvm_config_db# uvm_objection_wrapper) ::set(this,
"i_agt.sqr.main_phase",
"default_sequence",
my_sequence::type_id::get());
endfunction
//component的main phase阶段用seq.start(i_agt.sqr)启动sequence
task my_env::main_phase(uvm_phase phase)
my_sequence seq;
phase.raise_objection(this);
seq = my_sequence::type_id::creat("seq");
seq.start(i_agt.sqr);
phase.drop_objection(this)
endtask
2)使用config_db与default sequence指定sequencer启动sequence时,会将uvm_sequence的类型为uvm_phase的成员变量starting_phase赋以当前的phase。
task
my_sequencer::main_phase(uvm_phase phase)
...
seq.starting_phase = phase;
seq.start(this);
...
endtask
从上可知使用default_sequence其实还是需要执行seq.start(**)(指明sequence产生的transaction要发送给哪个sequencer)但不需要用户手工定义与调用,使用default_sequence时UVM会自动调用。并且为了bjection与sequence完全联系起来,还用到了seq.starting_phase。
class my_sequence extends uvm_sequnce #(my_transcation);
my_transaction m_trans;
...
virtual task body();
if(starting_phase != null)
starting_phase.raise_objection(this);//uvm_sequence的成员变量starting_phase,在sequencer的main_phase已经被赋值为main_phase
repeat (10) begin
`uvm_do(m_trans)//产生且随机化并发送transation
end
#1000;
if(starting_phase != null)
starting_phase.drop_objection(this);
endtask
`uvm_objection_utils(my_sequence)
endclass
这样就将在定义sequence类时就囊括了objection将objection与sequence完全联系