uvm中嵌套sequence的两种启动方式

第一种时利用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

Guess you like

Origin blog.csdn.net/Michael177/article/details/121054818