UVM: callback机制 uvm_callback和uvm_callbacks

article/2025/9/16 15:39:31

callback机制

callback机制提高代码的可重用性,还用于构建异常的测试用例。
广义的callback机制有post_randomize(),pre_body(),post_body(), pre_do(), mid_do()等,它们提供了额外的接口给用户。

原理

以在driver中提供callback函数接口为例,在发送transaction之前或之后需要对transaction进行处理,于是建立preSend()和postSend()任务,而不同的测试用例希望preSend或postSend进行不同的处理,所以这两个任务不能是Driver类的方法,这样毫无重用性可言,每搭建一个测试用例就需要新的Driver。
解决办法是建立一个新的专门服务callback机制的类,将preSend()和postSend()放在该类中,之后在Driver中实例化该类,通过层次化引用的方法调用preSend和postSend,这样就将两个任务和Driver分离开,不同的测试用例只需要重新定义不同的callback类,不需重新定义Driver。
这样还有一个问题,每一个测试用例需要不同的preSend()和postSend()也就是不同的callback类,如果将这些类都放在Driver中实例化的话,也丧失了可重复性,而且Driver也不知道运行测试用例时需要调用哪个callback类的任务。
解决思想时将callback类放在对应的测试用例中实例化,然后让Driver调用所有实例化了的对象的preSend()和postSend()任务,这样callback类只会在需要时被实例化,之后Driver只会使用实例化了的callback。方法是先定义一个基类,里面定义两个空的虚拟方法preSend()和postSend(),再创建一个以这个基类为元素的数组(该数组需要时全局的),之后所有的callback类都是这个基类的扩展。在测试用例中,每实例化一个callback类,就将该对象的句柄放入数组中(是一个子类赋给父类的过程),之后在Driver中,会遍历该数组的所有元素(每个元素其实都是一个句柄而已),通过层次化引用方式调用每个元素的preSend()和postSend()方法。

callback机制使用方式

  1. 先定义一个基类
class Driver_callback extends uvm_callback;endclass : Driver_callback 

然后在基类中定义所需要的callback方法,方法必须是虚拟的(将在子类中重载)在基类中定义所需要的callback方法,方法必须是虚拟的(将在子类中重载)

virtual task pre_send(); endtask
virtual task post_send(); endtask
  1. 在Driver中使用uvm_register_cb宏来注册上面定义的基类
class Driver extends uvm_component;`uvm_component_utils(Driver)`uvm_register_cb(Driver,Driver_callback)function new (string name, uvm_component parent=null);
super.new(name,parent);
endfunctionendclass

之后在Driver中调用定义好的callback方法,preSend()和postSend()分别在发送前后调用。使用uvm_do_callbacks宏。这个宏函数有三个参数,第一个参数必须是Driver类名字,这个类会调用callback方法,第二个必须是使用的callback基类的名字,表示这个基类含有callback方法,第三个是所要调用的callback方法名字(如果有参数需要带上参数)

virtual task run();repeat(2) begin
`uvm_do_callbacks(Driver,Driver_callback,pre_send())
$display(" Driver: Started Driving the packet ...... %d",$time);
// Logic to drive the packet goes hear
// let's consider that it takes 40 time units to drive a packet.
#40;
$display(" Driver: Finished Driving the packet ...... %d",$time);
`uvm_do_callbacks(Driver,Driver_callback,post_send())
end
endtask
  1. 使用callback机制构建测试用例:
    首先扩展基类,重载callback方法
class Custom_Driver_callbacks_1 extends Driver_callback;function new (string name = "Driver_callback");
super.new(name);
endfunctionvirtual task pre_send();
$display("CB_1:pre_send: Delaying the packet driving by 20 time units. %d",$time);
#20;
endtaskvirtual task post_send();
$display("CB_1:post_send: Just a message from post send callback method \n");
endtaskendclass
  1. 添加callback实例到uvm_callback_pool中
    然后再testcase中实例化该类,并使用uvm_callbacks类的静态方法add将该类添加到“池子”里。注意uvm_callbacks使用时也有两个参数,第一个是Driver的类名字,第二个是callback基类名字。add方法也有两个参数,第一个是Driver在验证环境中的实例路径,指定是哪个Driver使用的,第二个就是扩展callback类实例的名字。也就是说前面的参数都是使用类的名字,只有在add方法这里使用的是实例名
module test;initial begin
Driver drvr;
Custom_Driver_callbacks_1 cb_1;
drvr = new("drvr");
cb_1 = new("cb_1");
uvm_callbacks #(Driver,Driver_callback)::add(drvr,cb_1);
uvm_callbacks #(Driver,Driver_callback)::display();
run_test();
endendmodule

以上就是使用callback机制构建测试用例的基本方法,运行测试用例时,`uvm_do_callbacks宏会检测到添加到uvm_callbacks中的扩展callback类实例,然后调用其preSend()或者postSend()方法。

如果添加了多个扩展类

其它部分不变,只是增加一个callback扩展类,并使用add方法添加到池子里

module test;initial begin
Driver drvr;
Custom_Driver_callbacks_1 cb_1;
Custom_Driver_callbacks_2 cb_2;
drvr = new("drvr");
cb_1 = new("cb_1");
cb_2 = new("cb_2");
uvm_callbacks #(Driver,Driver_callback)::add(drvr,cb_1);
uvm_callbacks #(Driver,Driver_callback)::add(drvr,cb_2);
uvm_callbacks #(Driver,Driver_callback)::display();
run_test();
endendmodule

如上所示,那么在运行这个testcase时,这个两个扩展callback类的preSend()和postSend()方法都会被调用,那么是哪个先被执行哪个后执行呢?答案是cb_1的先执行,cb_2的后执行,原因是调用add方法添加cb_1的代码在前,添加cb_2在后,Driver中按照这个顺序执行
因此改变多个callback方法的执行顺序就是需要改变调用add方法的顺序。

uvm_callback和uvm_callbacks

上面提到callback基类的定义是从uvm_callback类扩展而来的,而注册callback实例的add静态方法则是uvm_callbacks类的方法。它们的用处决定了它们区别,uvm_callbacks是更为复杂些。

`uvm_callbacks
uvm_callback

https://verificationacademy.com/verification-methodology-reference/uvm/docs_1.2/html/files/base/uvm_callback-svh.html
http://testbench.in/UT_15_UVM_CALLBACK.html


http://chatgpt.dhexx.cn/article/GBCimgl1.shtml

相关文章

SV和UVM的Callback例程

文章目录 前言一、SystemVerilog Callback例程二、UVM Callback例程总结 前言 记录SV和UVM的两个callback的例程,方便以后用的时候进行查阅。 一、SystemVerilog Callback例程 二、UVM Callback例程 总结 记录SV和UVM的callback例程。

ajax中的callback,ajax callback是什么

ajax的callback是什么? callback是ajax中的回调函数,是在服务器对一个请求对象作出响应时调用的函数。浏览器会在某个时刻”回调”这个函数,根据5种返回状态的情况处理ajax请求结果。 callback回调函数怎么理解? 想弄明白回调函数,首先的清楚地明白函数的规则。在javascri…

通俗易懂的讲解回调函数,保证让你看懂callback

什么是回调函数?相信很多人都似懂非懂,半懂不懂,今天就通俗易懂的讲解回调函数,让你能理解回调函数的大部分作用及意义。 目录 定义 形象的例子 代码解释 用处及完整代码例子 定义 先上常规的定义: 回调函数也是…

callback(回调函数)

先讲点题外话。 编程分为两类:系统编程(system programming)和应用编程(application programming)。所谓系统编程,简单来说,就是编写库;而应用编程就是利用写好的各种库来编写具某种…

Callback回调函数介绍(C语言)

目录 1. 回调函数的定义 2. 为什么要用回调函数 3. 怎么用回调函数 3.1 怎么使用没有参数的回调函数 3.2 怎么使用带参数的回调函数 1. 回调函数的定义 最近在工作中经常用到回调函数callback,总结一下。 先来看看维基百科对callback的解释:In co…

Callback函数详解

http://shiwawa.blog.hexun.com/9925417_d.html 一,回调函数 我们经常在C++设计时通过使用回调函数可以使有些应用(如定时器事件回调处理、用回调函数记录某操作进度等)变得非常方便和符合逻辑,那么它的内在机制如何呢,怎么定义呢?它和其它函数(比如钩子函数)有何不同呢…

《软件质量保证与测试》学习笔记【第一章 软件测试基本概念】

目录 前言为什么要进行软件测试什么是软件缺陷1.1 什么是软件测试1.2 软件测试与CMMI软件质量保证SQA与软件测试的关系 1.3测试用例1.3.1什么是测试用例测试用例的五大要素测试用例1.3.2测试用例的评价标准1.3.3测试用例设计的基本原则1.3.4测试用例模板 1.4测试环境1.4.1什么是…

群晖NAS教程(十)、利用Docker安装蚂蚁笔记(leanote)

为了更好的浏览体验,欢迎光顾勤奋的凯尔森同学个人博客 群晖NAS教程(十)、利用Docker安装蚂蚁笔记(leanote) 蚂蚁笔记是一款特别棒的笔记软件,支持Markdown语法,是程序员必备的软件之一。下面我们就在群晖DS918+的机器上docker出来一个耍耍。 一、下载蚂蚁笔记(leanote)镜…

基于 Qt 框架的开源笔记软件 VNote

关注、星标公众号,直达精彩内容 来源:OSC开源社区 作者:tamlok VNote是一个受Vim启发开发的专门为Markdown而优化、设计的笔记软件。 授权协议:MIT 开发语言:C/C JavaScript HTML/CSS SHELL 操作系统:跨平台…

VisionPro软件笔记

VisionPro笔记 1、CogPMAlignTool的操作方法: 抓取图像-设置训练区域及参数-训练模板-设置运行参数与区域-运行-查看结果 2、CogPMAlignTool的基本原理: 图案位置搜索工具(识别定位)基于边缘特征的模板而不是基于像素的模板匹配…

一款开源的支持离线的支持MarkDown的优秀笔记软件----思源笔记

日常工作中,大家可能会用笔记软件记录自己积累的一些知识,组建自己的知识管理系统,常用的工具可能有云笔记,如有道云笔记,印象笔记等,但是有时候在工作中,信息比较敏感,不能够将信息…

一文了解常用效率记笔记软件(超过20款含有图片和双向链笔记)

前言 Mac 软件推荐下载网址 麦软网:https://www.macfz.com腾讯柠檬:https://lemon.qq.com/lab 更新时间 第七次更新 6 月 28 号 ,对于有道和印象的理解,有时间把这篇文章拆分下第六次更新 5 月 27 号,更新了如何看待…

知识管理软件,有道云笔记的优缺点和C笔记

前言 软件有道云笔记C笔记发布时间2011年6月28日还在内测所属公司网易公司北京创新乐知网络技术有限公司 1.笔记的重要性: 大家有没有一种种感受,我们成日钻研书籍,天天认真听讲,发奋学习,收到的反馈却并不理想&…

OneNote-做笔记的软件-强烈推荐

一、认识电子笔记本 普通笔记本转化为电子笔记本 笔记可以将我们的想法和从外部获取的信息进行归纳和整理,而电子笔记本就是将传统的笔记进行了电子化电子笔记本的优势 可搜索统一管理高效编辑可修改性多端同步主流电子笔记本 OneNoteEver note(印象笔记)Notability…

推荐几款好用的云笔记软件

一直钟爱印象笔记,程序员的电脑上必装的软件,但最近期限到了,再也不能像以前无限制的上传文件,续费也比去年的只要九块九一年高出了很多倍,因此,注册试用了其他的笔记,发现云笔记众多&#xff0…

php个人笔记系统 开源,Github精选!一款开源免费的轻量级笔记软件

更多精彩内容,请关注公众号【平凡而诗意】 ​ 笔记软件是工作和学习过程中经常会用到的软件,会议纪要、工作事项、待办,都需要用到笔记软件,这样能够明确做事的先后顺序,能够提高做事的效率。 笔记软件数不胜数&#x…

软件工程复习笔记 类图

类图 前言1 类图的概念1、类图2、类图的作用3、类图的组成元素 2 UML中的类(1)类的定义(2)类的表示(3)类的命名(4)类的属性&#xff0…

想找一款读书笔记软件?快来试试BookxNote

去年看到网上介绍 BookxNote 是一款做读书笔记的好工具,被誉为“ Windows 端的 MarginNote” 。当时试用了一下感觉挺好,但是在笔记和书籍的存储上还有一些困惑,因此有点顾虑。最近看教程和自己尝试,解决了困惑,在此分…

做笔记软件

做笔记软件 找最好的笔记软件:三强篇(EverNote、Mybase、Surfulater) [转载请保留] 版本1.0 编译xbeta/善用佳软 出自 http://blog.sina.com.cn/u/46dac66f01000b57 寻找最好的笔记软件:三强篇(EverNote、Mybase、Surfulater) v1.0 作者: SuperboyAC 编译: xbe…

【笔记软件obsidian】从入门到精通

目录 一.前言 二.下载及安装,基本使用方法 三.完成第一篇笔记(重点) 四.【选修】ios用户如何通过iCloud进行三平台同步 五.基本Markdown语法(一定要看完!) 六.结语 一、前言: 最近被很多同学问到&#xff…