-
Callback
2019-06-13 21:02:28SV中的回调(callback)明确了定义方法的规则,并且指定了一个方法用来回调已经定义的该方法;简而言之就是,被调用的方法就是回调方法(callback method),调用回调方法的方法称为回调勾(callback hook),回调...SV中的回调(callback)明确了定义方法的规则,并且指定了一个方法用来回调已经定义的该方法;简而言之就是,被调用的方法就是回调方法(callback method),调用回调方法的方法称为回调勾(callback hook),回调方法一般是虚方法(dummy method),一般通过继承来进行覆盖重写.
我们来看回调方法是如何工作的:
在上面的图中,temp()方法就是回调勾,callback_1()和callback_2()方法是回调方法,也就是在用户调用temp()方法的时候,callback_1()和 callback_2()会自动调用;当然,用户也可以通过继承来覆盖回调方法;
在SV中最长用到的回调勾就是randomize()方法,它带有两个回调方法pre_randomize()和post_randomize(),这两个方法分别会在randomize()方法的前后执行.
UVM callback
在UVM中,我们通过uvm_callback来派生出回调方法类,在这个类中可以定义多个回调方法,这些方法都是虚方法.如下:
class driver_callback extends uvm_callback; `uvm_component_utils(driver_callback) function new(string name, uvm_component parent); super.new(name); endfunction virtual task pre_drive; endtask//定义了两个虚方法作为回调方法 virtual task post_drive; endtask endclass
在上面的回调类driver_callback中定义了两个回调方法pre_drive和post_drive.
为了使用定义的回调类中的回调方法,首先要通过宏`uvm_register_cb在相应的组件中注册,然后再使用宏`uvm_do_callbacks 在组件的方法中调用回调方法,如下所示:
class driver extends uvm_component; `uvm_component_utils(driver) `uvm_register_cb(driver,driver_callback)//注册回调类 function new(string name, uvm_component parent); super.new(name,parent); endfunction task run_phase(uvm_phase phase); `uvm_do_callbacks(driver,driver_callback,pre_drive());//调用类中的回调方法 drive_pkt(); `uvm_do_callbacks(driver,driver_callback,post_drive()); endtask task drive_pkt(); `uvm_info("DRIVER","Inside drive_pkt method",UVM_LOW); endtask endclass
所以简单的test如下:
class environment extends uvm_env; driver driv; `uvm_component_utils(environment) function new(string name, uvm_component parent); super.new(name,parent); endfunction function void build_phase(uvm_phase phase); super.build_phase(phase); driv = driver::type_id::create("driv", this); endfunction endclass class basic_test extends uvm_test; environment env; `uvm_component_utils(basic_test) function new(string name = "basic_test", uvm_component parent=null); super.new(name,parent); endfunction function void build_phase(uvm_phase phase); super.build_phase(phase); env = environment::type_id::create("env", this); endfunction endclass //testbench `include "driver_callback.sv" `include "driver.sv" `include "environment.sv" `include "basic_test.sv" program testbench_top; //--------------------------------------- //calling test //--------------------------------------- initial begin//{ run_test(); end //} endprogram
这样我们就将回调方法加入到整个testbench中了,只不过上面的回调方法为空方法,什么操作也没有;
还可以通过继承,覆盖上面定义的回调类中的回调方法,如下:
class user_callback extends driver_callback; `uvm_component_utils(user_callback) function new(string name, uvm_component parent); super.new(name,parent); endfunction task pre_drive; `uvm_info("USER_CALLBACK","Inside pre_drive method",UVM_LOW); endtask task post_drive; `uvm_info("USER_CALLBACK","Inside post_drive method",UVM_LOW); endtask endclass
对于派生的回调类以及其中覆盖的回调方法,只需要通过调用add()方法将回调类添加到test中即可,如下:
class user_callback_test extends basic_test; user_callback callback_1; `uvm_component_utils(user_callback_test) function new(string name = "user_callback_test", uvm_component parent=null); super.new(name,parent); endfunction function void build_phase(uvm_phase phase); super.build_phase(phase); callback_1 = user_callback::type_id::create("callback_1", this); uvm_callbacks#(driver,driver_callback)::add(env.driv,callback_1); endfunction endclass
对于uvm_callbacks#(T, CB)::add(t,cb)方法,其几个参数的含义如下:
T:表示回调类所在的组件名;
CB:表示回调类的类名;
t:表示回调类所在的组件的实例名,也就是组件的对象名;
cb:表示回调类的实例名,也就是对象名;
导入上面的模块,如下:
`include "driver_callback.sv" `include "driver.sv" `include "environment.sv" `include "basic_test.sv" `include "user_callback.sv" `include "user_callback_test.sv" program testbench_top; //--------------------------------------- //calling test //--------------------------------------- initial begin//{ run_test(); end //} endprogram
运行结果为:
总结上面在UVM中使用回调的方法步骤:
(1) 由uvm_callback派生出一个回调类A,这个类中包含若干个回调方法,且这些方法都是空的;
(2)将回调类A在对应的组件中通过宏`uvm_register_cb在相应的组件中注册,然后再使用宏`uvm_do_callbacks 在组件的方法中调用回调方法;
(3)由A派生出回调类的子类B,在该类中对回调方法进行覆盖重写,可以用户自定义回调方法的操作;
(4)在test中将B实例化,并将实例化后的对象通过uvm_callbacks#(T, CB)::add(t,cb)方法添加到组件中,这就实现了回调方法的具体操作;
-
callback && callback()
2020-08-14 15:15:56背景: updateData(callback) { ... callback() 表示如果传入了 callback ,那么就调用callback() 回调函数,否则不调用,类似于如下代码: if(callback){ callback() } ...背景:
updateData(callback) { // 表示如果传入了callback,那么就调用callback(),否则不调用 callback && callback() }
含义:
callback && callback() 表示如果传入了 callback ,那么就调用callback() 回调函数,否则不调用,类似于如下代码:
if(callback){ callback() }
-
java调用kotlin callback 和 kotlin调用kotlin callback,java callback
2020-07-29 15:52:44* kotlin文件中 Java类使用Java的callback */ //第一种写法 JavaManager().setJavaCallback(JavaCallback { println(it) }) //第一种方法取别名 JavaManager().setJavaCallback(JavaCallback { aaa -> .../** * kotlin文件中 Java类使用Java的callback */ //第一种写法 JavaManager().setJavaCallback(JavaCallback { println(it) }) //第一种方法取别名 JavaManager().setJavaCallback(JavaCallback { aaa -> println(aaa) }) //第二种写法 JavaManager().setJavaCallback(object : JavaCallback { override fun show(info: String?) { println(info) } }) //第二种写法的简写 JavaManager().setJavaCallback { info -> println(info) } //第二种写法的再简单写法 JavaManager().setJavaCallback { it -> println(it) } JavaManager().setJavaCallback { println(it) } //第三种写法,第一种写法的,先声明java callback val callback = JavaCallback { println(it) } JavaManager().setJavaCallback(callback) //第四中写法,第二种写法的,先声明kt callback写法 val callback2 = object : JavaCallback { override fun show(info: String?) { println(info) } } JavaManager().setJavaCallback(callback2) /** * kotlin文件中 Java类使用Kt的callback */ JavaManager().setKtCallback(object :KTCallback{ override fun show(name: String) { println(name) } }) val ktCallback1 = object :KTCallback{ override fun show(name: String) { println(name) } } JavaManager().setKtCallback(ktCallback1) /** * kotlin文件中kotlin使用kotlin 的callback */ //写法1,kotlin中只能使用这种方式,先object : XXXCallback KtManager().setKtCallback(object : KTCallback { override fun show(name: String) { } }) //写法1 ,先声明kt的callback val callback1 = object : KTCallback { override fun show(name: String) { println(name) } } KtManager().setKtCallback(callback1) //kotlin不能像Java一样的写法,kotlin的callback一定是object:XXCallback /*KtManager().setCallback(KTCallback { })*/ /** * kotlin使用java 的callback */ KtManager().setJavaCallback(JavaCallback { println(it) }) KtManager().setJavaCallback(object : JavaCallback { override fun show(info: String?) { println(info) } }) KtManager().setJavaCallback(JavaCallback { it -> println(it) }) KtManager().setJavaCallback(JavaCallback { println(it) })
-
callback&&callback()
2018-12-10 11:23:14在写项目的时候,突然之间不是特别理解callback&&callback()这句代码的意思,经过一番查资料,明白了: getList(name,callback){ let params = {cmtName:name} this.$http.get("get-list&...在写项目的时候,突然之间不是特别理解callback&&callback()这句代码的意思,经过一番查资料,明白了:
getList(name,callback){ let params = {cmtName:name} this.$http.get("get-list",params) .then(res =>{ this.list = res.data.items, callback&&calllback(); }) } callback&&callback()相当于: if(callback){ callback(); } js传递的是引用,callback并不是某个具体的东西,而是一个引用,暂时理解为占位符,判断有没有它,有就执行callback()【这是一个回调函数】,没有,就不执行
总结:
看到这行代码没能立即明白的原因还是对回调函数的理解不够彻底和深刻,所以接下来要对回调函数做一个整理。 -
callback例子
2018-03-28 10:46:48callback例子 1.声明callback接口: public interface ICallBack { public void process(String result); } 2.client实现callback接口: public class Client implements ICallBack { private ... -
callBack备忘
2018-01-09 19:46:48callback接口 public interface CallBack { public String testCallBack(String a); } 处理类 public class TestCallBack { /** * * @param callBack * @param data * * @return -
Ansible - 使用CallBack + 如何自定义Callback
2019-06-17 17:22:00开启 callback 功能,在callback_whitelist 中添加 vim ansible.cfg callback_plugins = plugins/callback # by default callbacks are not loaded for /bin/ansible, enable this if you # want, for example... -
callback函数_callback与callout的区别
2020-12-29 03:05:28公众号:汽车ECU开发在讨论AUTOSAR时,经常会提到callback、callout函数,通常我们对其概念是比较迷糊的,下面对两个的区别进行区分一下。Callback函数首先说一下callback函数,该函数是AUTOSAR规范里定义好的接口,... -
callback && callback()简单理解
2020-05-12 10:18:28callback && callback()理解 1、回调函数 let fn = new Function('arg1', 'arg2', 'return arg1 * arg2') console.log(fn(2, 3)) // 6 由此可见,函数亦可以这样创建。代码上来看,就只是对象。这样做的一个... -
Aidl CallBack
2016-10-19 18:12:382.aidl 传递interface 实现callback。 aidl传递interface.java类时编译是会出错的。解决办法是通过aidl实现callback 首先创建aidl文件IService.aidl interface IService { void init(IDemoResul -
callback && callback()的理解
2018-08-31 10:02:18同义转换 :if(callback) { callback() } 解释: && 属于布尔值逻辑判断, False and True ,判断为Faslse。这里面有一个特性,当第一个值为False的时候,就不会去判断第二个值了,而是直接返回... -
JavaScript callback
2013-07-31 15:10:04callback is a function that is passed as an argument to another function and is executed after its parent function has completed. 回调函数(callback) function a(callback) { ale -
uvm_callback机制
2020-07-08 21:08:56uvm_callback机制一、Callback机制的作用二、回调函数callback的使用步骤:2.1 在UVM组件中内嵌callback函数或任务2.2声明一个UVM callback空壳类2.3从UVM callback空壳类中扩展UVM callback类2.4在验证环境中创建并... -
each(callback)与each(object[, callback])区别
2020-07-31 10:47:13each(callback)与each(object[, callback])作用: each(callback):每个匹配的元素都会执行该函数,注意:参数实参所指函数中的this 指代的是 DOM 对象而非 jQuery 对象 each(object[, callback]):用于遍历对象... -
回调函数callback&&callback()
2018-12-01 16:32:51如果存在回调函数就执行! 这是利用了 JS &&符号的一个小技巧 &...if(callback){ callback(); } 来源:https://blog.csdn.net/qq_31301099/article/details/53055126... -
callback函数详解
2018-08-30 10:32:23在项目中经常会看到一些callback函数,callback函数实现了用户自定义处理 主要表现在C语言的面向对象编程、异步处理 C语言中的callback函数的实现,主要是利用了函数指针 废话不多说,直接贴代码 #include&... -
在初始化请求中callback&&callback()的使用
2020-04-01 14:34:10这里的callback && callback(data);相当于 if callback {callback()}; 如果回调函数存在,则执行该回调函数。 例子: 1.带有函数返回值和不带函数返回值的调用方式 this.getGoodsList(()=>{ uni.... -
Unity Android Callback
2014-09-25 08:59:45Unity Android Callback 在 Unity 建立一個 Callback 讓 Android plugin 做完某事之後呼叫. 一、Eclipse 1. 建立一個 interface 例: -
UVM: callback机制 uvm_callback和uvm_callbacks
2018-12-04 10:16:46https://verificationacademy.com/verification-methodology-reference/uvm/docs_1.2/html/files/base/uvm_callback-svh.html http://testbench.in/UT_15_UVM_CALLBACK.html -
CALLBACK总结
2012-03-30 13:27:39CALLBACK函数在微软的官方手册中是这样定义CALLBACK函数的:“CALLBACK函数是由应用程序 定义而由操作系统调用的函数”。 凡是由用户设计而却由Windows系统调用的函数,统称为Callback函数,这些函数都有... -
callback函数
2012-05-24 13:29:34原文地址:http://en.wikipedia.org/wiki/Callback_(computer_programming) ...Callback (computer programming) From Wikipedia, the free encyclopedia For a discussion of callback with computer -
Callback自定义测试
2019-05-28 18:06:32Callback自定义测试 在浏览器中存在着同源策略,所谓同源是指域名、协议、端口相同。当使用Ajax异步传输数据时,非同源域名之间会存在限制。其中有一种解决方法是JSONP(JSON with Padding),基本原理是利用了HTML... -
query:callback
2017-11-01 10:55:00function getName(callback) { setTimeout(function() { callback('Aaron') }, 1000) } //等待callback回调 getName(function(name) { // alert(name) }) 转载于:... -
matlab callback function
2016-11-08 14:08:33'Callback', {@setPointNum,TMsubsub} 'Callback', @setPointNum -
scrapy callback无效
2019-06-06 21:59:19在写scrapy的爬虫文件的时候发现明明设置了callback但无法执行 后来通过网上找到原因 是因为allowed_domains的域和要爬去的域不同所导致 解决办法: 1.把allowed_domains的域填写正确 2删除allowed_domains OK .... -
LRESULT CALLBACK
2013-10-29 23:36:12LRESULT CALLBACK 它们其实是宏,表示函数的返回类型,你可以在VC里面对它们点右键然后Go To Definition看到它的宏定义。 其实,这就表示了WinProg函数是一个回调函数。在MFC中,得到Message消息以后... -
java实现callback
2019-04-01 14:09:43http://www.wuwenliang.net/2017/01/26/java%E5%AE%9E%E7%8E%B0callback/ 回调是一种双向调用模式,什么意思呢,就是说,被调用方在被调用时也会调用对方,这就叫回调。“If you call me, i will call back”。 ...
-
前端架构师-速成
-
maven-3.6.0已配好国内镜像地址
-
转行做IT-第1章 计算机基础
-
stm32f103模拟SPI读写W25Q16亲测可用
-
记一次crontab中date命令错用导致的问题
-
华工数字通信原理大作业
-
关于remix-IDE资源
-
flash actionscript3游戏开发教程 as3系列教程.zip
-
软件工程与项目案例.pptx
-
linux 内存池三方库 用了他你就不需要自己编写内存池了.zip
-
FFmpeg4.3黄金系列课程:c++版
-
归并排序算法(介绍+图解+源码+性能)
-
(新)备战2021软考系统集成学习套餐
-
(新)备战2021软考网络工程师培训学习套餐
-
install_flash_player_ax_cn_34_0_0_92离线安装包
-
FFmpeg4.3系列之26:视频监控之H265多路摄像头播控项目实战
-
23种设计模式(适配器模式)
-
(新)备战2021软考软件设计师顺利通关套餐
-
Cocos Creator游戏开发-连连看 (接入腾讯优量汇广告)
-
RegEx (31) 练习题 (一)