当前位置: 首页 > news >正文

UVM的callback机制

文章目录

    • 1.作用
    • 2.callback机制的实现
      • (1)首先定义类A:
      • (2)声明一个A_pool类
      • (3)my_driver中的uvm_register_cb宏
      • (4)my_driver中的uvm_do_callbacks宏
      • (5)从A派生的一个类:
      • (6)在测试用例中将my_callback实例化,并将其假如A_pool中:
    • 3.总结一下步骤
    • 4.debug

1.作用

callback机制最大的用处就是提高验证平台的可重用性,还可以构建异常用例。
广义的callback机制一般有pre_body和post_body,pre_do,mid_do,post_do。

2.callback机制的实现

(1)首先定义类A:

class A extends uvm_callback;virtual task pre_tran(my_driver drv,ref my_transaction tr);endtask
endclass

A类一定要从uvm_callback派生,另外还需要定义一个pre_tran任务,此任务的类型一定要是virtual的,因为从A派生的类需要重载这个任务。

(2)声明一个A_pool类

typedef uvm_callbacks#(my_driver, A) A_pool;
A_pool的声明相当简单,只需要一个typedef语句即可。另外,在这个声明中除了要指明这个A类型的池子外,还要指明这是一个A类型的池子外,还要指明这个池子将会被那个类使用。在本例中,my_driver将会使用这个池子,所以要将此池子声明为my_driver专用的。

(3)my_driver中的uvm_register_cb宏

typedef class A;class my_driver extends uvm_driver#(my_transaction);
...`uvm_component_utils(my_driver)`uvm_register_cb(my_driver,A)
...
endclass

(4)my_driver中的uvm_do_callbacks宏

这个声明与A_pool的类似,要指明my_driver和A。在my_driver的main_phase中调用pre_tran时并不如上节所以的那么简单,而是调用了一个宏来实现:

task my_driver::main_phase(uvm_phase phase);
...while(1)beginseq_item_port.get_next_item(req);`uvm_do_callbacks(my_driver,A,pre_tran(this,req))driver_one_pkt(req);seq_item_port.item_done();    end
entask

uvm_do_callback宏的第一个参数是调用pre_tran的类的名字,这里自然是my_driver,第二个参数是那个类具有pre_tran,这里是A,第三个参数是调用的是函数/任务,这里是pre_tran,在指明的是pre_tran时,要顺便给出pre_tran的参数。
到目前为止是VIP的开发者应该做的事情,作为使用VIP的用户来说,需要做如下的事情:

(5)从A派生的一个类:

class my_callback extends A;vitual task pre_tran(my_driver drv,ref my_transaction tr);`uvm_info("my_callback","this is pre_tran task",UVM_MEDIUM)endtask`uvm_object_utils(my_callback)endclass

(6)在测试用例中将my_callback实例化,并将其假如A_pool中:

function void my_case0::connect_phase(uvm_phase phase);my_callback my_cb;super.connect_phase(phase);my_cb = my_callback::type_id::create("my_cb");A_pool::add(env.i_agt.drv,my_cb);
endfunction

my_callback的实例化是在connect_phase中完成的,实例化完成后需要将my_cb加入A_pool中。同时,在加入时需要指定是那个 my_driver使用的。因为很可能整个base_test中实例化了多个my_env,从而有多个my_driver的实例,所以要将my_driver的路径作为add函数的第一个参数。

3.总结一下步骤

(1)定义一个A类
(2)声明一个A_pool类
(3)在要预留callback函数/任务接口的类中调用uvm_register_cb宏
(4)在要调用callback函数/任务接口的函数/任务重,使用uvm_do_callbacks宏
(5)在A类派生一个类,在这个类中定义好pre_tran
(6)在测试用例的connect_phase(或者其他phase,但是一定要在步骤(4)之前)中奖A派生的类实例化,并将其加入A_pool中

4.debug

发现根据上述代码会移植到其他框架中会出现错误
报错内容为:too many arguments to function/task call
the above function/task call is done with more aarguments than needed
解决方法:在步骤(1)和步骤(5)中都需要定义一下new

function new(string name = "A");super.new(name);
endfunction

http://www.mrgr.cn/news/67835.html

相关文章:

  • Browserslist 配置
  • 学习正则表达式,如何校验手机号与电子邮箱
  • 力扣1658.将x减到0的最小操作数
  • Postman 变量了解一下
  • 实习冲刺Day15
  • 宠物领养救助管理软件有哪些功能 佳易王宠物领养救助管理系统使用操作教程
  • 网络规划设计师-(11)网络层
  • 上下文保护
  • 技术总结(二十二)
  • MySQL之事务
  • hive面试题,超详细解析。各类型专利top 10申请人,以及对应的专利申请数
  • python入门到精通知乎万赞推荐书籍《流畅的Python》,《流畅的Python》PDF免费下载
  • Hive中各种Join的实现
  • 【系统架构设计师】高分论文:论企业应用系统的分层架构风格
  • 数据结构之单链表(C语言)
  • linux基础知识
  • day-81 打家劫舍 II
  • 焊接覆层耐磨板行业全面且深入的分析
  • 【零基础学习CAPL】——XML工程创建与使用详解
  • uni-app 封装刘海状态栏(适用小程序, h5, 头条小程序)
  • Java题目笔记(十四)Date +综合练习
  • ruoyi-vue集成tianai-captcha验证码
  • 如何将现有VUE项目所有包更新到最新稳定版
  • C++之queue容器
  • 前端-计算机网络
  • 信息流不同行业账户流量池有区别吗?