精华内容
参与话题
问答
  • Callback

    2019-06-13 21:02:28
    SV中的回调(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()
    				}

     

    展开全文
  • * 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:48
    callback例子 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:48
    callback接口 public interface CallBack { public String testCallBack(String a); } 处理类 public class TestCallBack { /** * * @param callBack * @param data * * @return
  • 开启 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...
  • 公众号:汽车ECU开发在讨论AUTOSAR时,经常会提到callback、callout函数,通常我们对其概念是比较迷糊的,下面对两个的区别进行区分一下。Callback函数首先说一下callback函数,该函数是AUTOSAR规范里定义好的接口,...
  • callback && callback()理解 1、回调函数 let fn = new Function('arg1', 'arg2', 'return arg1 * arg2') console.log(fn(2, 3)) // 6 由此可见,函数亦可以这样创建。代码上来看,就只是对象。这样做的一个...
  • Aidl CallBack

    2016-10-19 18:12:38
    2.aidl 传递interface 实现callback。 aidl传递interface.java类时编译是会出错的。解决办法是通过aidl实现callback 首先创建aidl文件IService.aidl interface IService { void init(IDemoResul
  • 同义转换 :if(callback) { callback() } 解释: && 属于布尔值逻辑判断, False and True ,判断为Faslse。这里面有一个特性,当第一个值为False的时候,就不会去判断第二个值了,而是直接返回...
  • JavaScript callback

    2013-07-31 15:10:04
    callback 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:56
    uvm_callback机制一、Callback机制的作用二、回调函数callback的使用步骤:2.1 在UVM组件中内嵌callback函数或任务2.2声明一个UVM callback空壳类2.3从UVM callback空壳类中扩展UVM callback类2.4在验证环境中创建并...
  • each(callback)与each(object[, callback])作用: each(callback):每个匹配的元素都会执行该函数,注意:参数实参所指函数中的this 指代的是 DOM 对象而非 jQuery 对象 each(object[, callback]):用于遍历对象...
  • 如果存在回调函数就执行! 这是利用了 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(data);相当于 if callback {callback()}; 如果回调函数存在,则执行该回调函数。 例子: 1.带有函数返回值和不带函数返回值的调用方式 this.getGoodsList(()=>{ uni....
  • Unity Android Callback

    千次阅读 2014-09-25 08:59:45
    Unity Android Callback 在 Unity 建立一個 Callback 讓 Android plugin 做完某事之後呼叫. 一、Eclipse 1. 建立一個 interface 例:
  • 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
  • CALLBACK总结

    2012-03-30 13:27:39
    CALLBACK函数在微软的官方手册中是这样定义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:32
    Callback自定义测试 在浏览器中存在着同源策略,所谓同源是指域名、协议、端口相同。当使用Ajax异步传输数据时,非同源域名之间会存在限制。其中有一种解决方法是JSONP(JSON with Padding),基本原理是利用了HTML...
  • query:callback

    2017-11-01 10:55:00
    function 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:12
    LRESULT CALLBACK 它们其实是宏,表示函数的返回类型,你可以在VC里面对它们点右键然后Go To Definition看到它的宏定义。  其实,这就表示了WinProg函数是一个回调函数。在MFC中,得到Message消息以后...
  • java实现callback

    千次阅读 2019-04-01 14:09:43
    http://www.wuwenliang.net/2017/01/26/java%E5%AE%9E%E7%8E%B0callback/ 回调是一种双向调用模式,什么意思呢,就是说,被调用方在被调用时也会调用对方,这就叫回调。“If you call me, i will call back”。 ...

空空如也

1 2 3 4 5 ... 20
收藏数 105,676
精华内容 42,270
关键字:

callback