uvm中嵌套sequence的两种启动方式 您所在的位置:网站首页 uvm中sequence启动方法 uvm中嵌套sequence的两种启动方式

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

2023-10-19 10:09| 来源: 网络整理| 查看: 265

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

在上面代码中,m_sequencer是case0_sequence在启动后所使用的sequencer的指针。但通常来说并不用这么麻烦,可以使用uvm_do宏来完成这些事。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有