第一种时利用uvm_do系列宏
在一个sequence的body中,除了可以使用uvm_do宏产生transaction外,还可以启动其它sequence,这就是嵌套sequence。
uvm_do系列宏有uvm_do/uvm_do_pri/uvm_do_with/uvm_do_pri_with/uvm_do_on/uvm_do_on_pri/uvm_do_on_with/uvm_do_on_pri_with
uvm_do系列宏中,当第一参数是transaction时,调用的是start_item和finish_item;
当第一个参数是sequence时,调用的是此sequence的start的任务,也就是启动sequence。
除了uvm_do系列宏,uvm_create、uvm_send、uvm_rand_send的第一个参数都可以说是sequence的指针。
唯一不能是sequence指针的是start_item和finish_item,这两个参数必须是transacion的指针。
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();
crc_seq cseq; //指定sequence的指针
long_seq lseq; //指定sequence的指针
if(starting_phase != null)
starting_phase.raise_objection(this);
repeat (10) begin
`uvm_do(cseq) //启动sequence
`uvm_do(lseq) //启动sequence
end
#100;
if(starting_phase != null)
starting_phase.drop_objection(this);
endtask
`uvm_object_utils(case0_sequence)
endclass
第二种方式时手动启动:
class case0_sequence extends uvm_sequence #(my_transaction);
function new(string name= "case0_sequence");
super.new(name);
endfunction
virtual task body();
crc_seq cseq;
long_seq lseq;
if(starting_phase != null)
starting_phase.raise_objection(this);
repeat (10) begin
cseq = new("cseq"); //
cseq.start(m_sequencer); //
lseq = new("lseq"); //
lseq.start(m_sequencer); //
end
#100;
if(starting_phase != null)
starting_phase.drop_objection(this);
endtask
`uvm_object_utils(case0_sequence)
endclass