在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 111|回复: 0

[原创] UVM学习-virtual sequence使用示例

[复制链接]
发表于 3 天前 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
virtual sequence介绍
使用示例:
1. 定义一个virtual sequencer:
class my_vsqr extends uvm_sequencer;
  my_sequencer0 p_sqr0;
  my_sequencer1 p_sqr1;

endclass

2. 在base_test中,实例化vsqr,并将相应的sequencer赋值给vsqr中的sequencer的指针:

class base_test extends uvm_test;
   my_env env0;
   my_env env1;
   my_vsqr v_sqr;
  …
endclass


function void base_test::build_phase(uvm_phase phase);
   super.build_phase(phase);
   env0 = my_env::type_id::create("env0", this);
   env1 = my_env::type_id::create("env1", this);
   v_sqr = my_vsqr::type_id::create("v_sqr", this);
endfunction

function void base_test::connect_phase(uvm_phase phase);
   v_sqr.p_sqr0 = env0.i_agt0.sqr0;
   v_sqr.p_sqr1 = env1.i_agt1.sqr1;
endfunction

3. 在virtual sequene中则可以使用uvm_do_on系列宏来发送transaction:
实现效果:1.先发送一个drv0_seq类型的长包;2.然后开始并行发两种类型的包 ;

class case0_vseq extends uvm_sequence;
   `uvm_object_utils(case0_vseq)
   `uvm_declare_p_sequencer(my_vsqr)
  …
   virtual task body();
     my_transaction tr;
     drv0_seq seq0;
     drv1_seq seq1;
    …
    `uvm_do_on_with(tr, p_sequencer.p_sqr0, {tr.pload.size == 1500;})
    `uvm_info("vseq", "send one longest packet on p_sequencer.p_sqr0", UVM_MEDIUM)
    fork
      `uvm_do_on(seq0, p_sequencer.p_sqr0);
      `uvm_do_on(seq1, p_sequencer.p_sqr1);
    join

   endtask
endclass



小扩展(`uvm_declare_p_sequencer(SEQUENCER)宏):
相当于在sequence里声明了一个SEQUENCER类型的成员变量,然后就可以在sequence里使用p_sequencer里的成员了;(示例中就可以使用my_vsqr里的p_sqr0了)

4. 上述过程也可以采用手动启动sequence:

class case0_vseq extends uvm_sequence;
  …
   virtual task body();
     my_transaction tr;
     drv0_seq seq0;
     drv1_seq seq1;
    …
     `uvm_do_on_with(tr, p_sequencer.p_sqr0, {tr.pload.size == 1500;})
     `uvm_info("vseq", "send one longest packet on p_sequencer.p_sqr0", UVM_MEDIUM)
     seq0 = new("seq0");
     seq1 = new("seq1");

     fork
         seq0.start(p_sequencer.p_sqr0);
         seq1.start(p_sequencer.p_sqr1);
     join

   endtask
endclass


您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条

小黑屋| 手机版| 关于我们| 联系我们| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2025-3-29 20:51 , Processed in 0.014985 second(s), 6 queries , Gzip On, MemCached On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表