1. main_phase 是什么?
main_phase是与run_phase并行的12个小的phase中的一个phase,也是一个可以耗时的phase。在UVM验证平台中,只要一个类使用了uvm_component_utils注册且此类被实例化了,那么这个类的main_phase就会自动被调用。
2. 通过 start()函数进行挂载
以下代码为UVM实战第44页代码
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
startrt任务的参数是一个sequencer的指针,如果不指明此指针,则sequence不知道将产生的transaction交给哪一个sequencer。
3. 使用default_sequence的方式进行启动sequence。
将不同的sequence设置为sequencer的main_phase的default_sequence。当sequencer执行到main_phase中时,发现有default_sequence,那么它就启动sequence。
当一个sequence启动后会自动执行sequence的body任务。 以下代码为UVM实战49页代码
module top_tb;
initial begin
uvm_config_db#(uvm_object_wrapper)::set(null,"uvm_test_top.i_agt.sqr.main_phase","sefault_sequence", my_sequence::type_id::get());
end
endmodule
在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
因此,可以在sequence中使用starting_phase进行提起和撤销objection。
UVM实战50页代码如下:
class my_sequence extends uvm_sequence #(my_transaction);
my_transaction m_trans;
virtual task body();
if(starting_phase != null)
staring_phase.raise_objection(this);
repeat(10) begin
`uvm_do(m_trans)
end
#1000;
if(starting_phase != null)
staring_phase.drop_objection(this);
endtask
`uvm_object_utils(my_sequence)
endclass
4. 一个例子
sequence1包含在virtual sequence里面,则sequence1中可以通过以下方式给staring_phase赋值。
uvm_sequence_base parent;
parent = get_parent_sequence();
if(parent != null) begin
starting_phase = parent.starting_phase;
end
5. m_sequencer与p_sequencer
m_sequencer是每一个sequence的成员变量,它存储是是该sequence所挂载的sequencer的指针,m_sequencer是uvm_sequencer_base(uvm_sequencer的基类)类型的,而不是uvm_sequencer类型。m_sequencer的原型为
procted uvm_sequencer_base m_sequencer;
如果要使用uvm_sequencer的成员变量,需要动态转换将m_sequencer转换为uvm_sequencer类型。UVM考虑到这种情况,内建了一个宏,uvm_declare_p_sequencer(SEQUENCER),这个宏的本质是声明了一个SEQUENCER类型的成员变量。
uvm_declare_p_sequencer(my_sequencer)
相当于
my_sequencer p_sequencer;
6. 使用UVM宏定义来产生sequence
`uvm_do()
`uvm_do_with()
`uvm_do()