uvm中 重载的几种方法

a. transaction的重载

         基于现有的transaction格式,定义新的transaction,同时约定新的约束,之后,:

         1.  新定义sequence来使用新的transaction;

         2.  旧的sequence来使用新的transaction;

         case中使用新/旧的sequence即可。

         需要新增文件 new_transaction.sv, my_test1.sv,new_sequence.sv/修改sequence。

优化做法:

         基于factory重载机制,新建新的transaction,

         直接在case的,build_phase中:

             factory.set_type_override_by_type(my_transaction::get_type(), new_transaction::get_type());

         其余不变,这样涉及的修改更少;

b.  基于上面transaction的重载,可以对每个transaction定义一个sequence,然后放在sequence_lib中,用一个case直接启动即可;

     需要新增,sequence*.sv, sequence_lib.sv;

c.   重载sequence

      1. 在新的sequence中约束不同的transaction元素,这样就是现在同一个sequence发送不同transaction定向约束的场景;

         之后在class build_phase中,采用factory重载<参考上文>

d.  重载component

     万物可重载;

e.  callback机制

     实现方式:

     定义callback类

     class A extends uvm_callback;

           virtual task pre_tran (my_driver drv, ref my_transaction tr);

           endtask

     endclass

     //my_driver代表这个A_pool会给那个类使用;

     typedef uvm_callbacks #(my_driver, A) A_pool;

     使用类my_driver.cc:

     typedef class A;

     class my_driver extends uvm_driver #(my_transaction);

            ……

          `uvm_register_cb(my_driver, A)

          task main_phase(uvm_phase phase)

                   ….

                `uvm_do_callbacks(my_driver, A, pre_tran(this, req))

                ….

        endtask

endclass

// ------------------------------------------- 使用callback

my_test.sv

…….

class my_callback0 extends A;

virtrual  task pre_tran (my_driver drv, ref my_transaction tr);

    define action

endtask

                      endclass

                      

                      function void my_test::connect_phase(uvm_phase phase)

                my_callback0 my_cb;

                super.connect_phase(phase);

                m_cb = my_callback:;type_id:;create(“my_cb”)

                A_pool::add(env.i_gaent.drv, my_cb);

            endfunction

                      //这种方式

1.       新增callback.sv for callback class;

2.       在driver增加新的注册callback;

3.       testcase中需要不断去定义不同的testcase0,来调用不同的callback;

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值