精华内容
参与话题
问答
  • 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)方法添加到组件中,这就实现了回调方法的具体操作;

    展开全文
  • Enable 属性值为 on; 文本内容经过编辑; 单击当前窗口内任意其他 GUI 对象; 对于单行可编辑文本,按 ENTER 键; 对于多行可编辑文本,按 CTRL+ENTER 键; 以上5个条件只要满足前两个条件加上后三条中任意一条...
    1. Enable 属性值为 on;
    2. 文本内容经过编辑;
    3. 单击当前窗口内任意其他 GUI 对象;
    4. 对于单行可编辑文本,按 ENTER 键;
    5. 对于多行可编辑文本,按 CTRL+ENTER 键;

    以上5个条件只要满足前两个条件加上后三条中任意一条,就是执行回调函数。

    (当然,也可以在不满足后三个条件的情况下执行回调函数,这里要用到 uicontrol`pause 的知识)

    展开全文
  • 这个python监控cpu的小程序中 应用 了回调函数callback add_callback 什么意思 为什么之后又要清空回调信息 ``` import matplotlib.pyplot as plt import matplotlib.font_manager as font_manager import ...
  • 现在报错是 reference error can t find variable callback 我感觉跟 底下这段代码有关系 但是我不会用 //执行connectWebViewJavascriptBridge函数,并注入需要回调的方法 connectWebViewJavascriptBridge(function ...
  • Unity Android Callback

    千次阅读 2014-09-25 08:59:45
    Unity Android Callback 在 Unity 建立一個 Callback 讓 Android plugin 做完某事之後呼叫. 一、Eclipse 1. 建立一個 interface 例:
    Unity Android Callback

    在 Unity 建立一個 Callback 讓 Android plugin 做完某事之後呼叫.


    一、Eclipse
    1. 建立一個 interface

    例:

    public interface CAdLocusListenerCallBack {
     void onReceiveAd();
     void onFailedToReceiveAd(int errorcode);
    }
    2. 把它加入至某 class 裡
    例:
    public class CAdLocus
    {
        //callback.
        CAdLocusListenerCallBack listenerCB = null;
    
        public void SetListenerCB(CAdLocusListenerCallBack cb)
        {
         listenerCB = cb;
        }
    }
    3.做完事後呼叫 Callback
    例:
           public void onReceiveAd(Ad adView )
           {
            //AdLocusLayout llayout = (AdLocusLayout)adView;
            if (listenerCB != null)
            {
             listenerCB.onReceiveAd();
            }
           }
    
    
           public void onFailedToReceiveAd(Ad adView , com.adlocus.AdLocusLayout$ErrorCode errorCode)
           {
             if (listenerCB != null)
             {
              listenerCB.onFailedToReceiveAd(1);
             }
           }
    二、Unity
    1.建立 Callback 腳本
    例:
    public class AdLocusListenerCallBack : AndroidJavaProxy
    {
     public AdLocusListenerCallBack():base("com.ad.adlocus.CAdLocusListenerCallBack")
     {
     }
     void onReceiveAd()
     {
     }
     void onFailedToReceiveAd(int errorcode)
     {
     }
    }
    2.對 Plugin 註冊 Callback
    例:
    AndroidJavaClass player = new AndroidJavaClass( "com.unity3d.player.UnityPlayer" );
    AndroidJavaObject activity = player.GetStatic<AndroidJavaObject>("currentActivity");
    AdLocusJo = new AndroidJavaObject("com.ad.adlocus.CAdLocus", activity);
    AdLocusListenerCallBack AdListenerCB = new AdLocusListenerCallBack();
    AdLocusJo.Call("SetListenerCB", AdListenerCB);
    四、最後
    也有人是直 sendmessage 的方式接調用 Unity 物件的函式,
    例:

    //unity
    void gameobjectFunction(string parm)
    {
    }
    //Java
    UnityPlayer.UnitySendMessage("gameobjectName", "gameobjectFunction", "parms");
    







    展开全文
  • 我按照官网的例子自己写了一个callback函数,设定为初始的renderer背景颜色为黑色,点击鼠标右键后renderer的背景颜色设置为(1.0,0.0,0.0) 但是这段代码跑起来 renderer的背景颜色就是红色(1.0,0.0,0.0)。 代码...
  • private Handler handler = new Handler(new Callback() { @Override public boolean handleMessage(Message msg) { // TODO Auto-generated method stub Toast.makeText(getApplicationContext...
  • callback: function (response) { this.param //这里似乎this发生改变,this.param值为undefined ... } getData: function() { //通过ajax获得数据,然后回调 callback doGetAjax(url,data,this....
  • LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { static int N; static HWND hEdit,hButton; char szBuffer[10]; HDC hdc; PAINTSTRUCT ps; switch (message) { case...
  • Callback 函数

    2009-02-28 23:23:00
    在前面加上 Callback 参数的函数是“由程序员编写,由操作系统调用”的函数。它与普通函数不同之处在于:其含有一个隐藏的 this 指针参数,位于参数列表的最后。Callback 函数如果是类的成员函数,应该声明为 static...

    在前面加上 Callback 参数的函数是“由程序员编写,由操作系统调用”的函数。

    它与普通函数不同之处在于:其含有一个隐藏的 this 指针参数,位于参数列表的最后。

    Callback 函数如果是类的成员函数,应该声明为 static 类型。

    展开全文
  • jQuery的callback参数

    千次阅读 2017-08-21 15:56:33
    对于jQuery封装好的函数有可选的callback参数,需要注意以下几点: 1.$(selector)选中的元素的个数为n个,则callback函数会执行n次; 2.callback函数名后加括号,会立刻执行函数体,而不是等到显示/隐藏完成后才执行...
  • callback&&callback()

    千次阅读 2016-11-06 16:50:14
    如果存在回调函数就执行! 这是利用了 JS &&符号的一个小技巧 && 符号在前面为假时就不会执行后面的语句了 所以这个就相当于 if(callback){ callback(); }
  • java callback

    千次阅读 2007-08-22 14:24:00
    CALLBACKCALLBACK首先是基于多线程的,没有线程的调用就不要谈回调.子类调用父类的构造方法叫回调用,那TMD的任何构造对象都叫回调了,因为任何对象至少继承了Object,构造时至少要调用Object的构造方法. CALLBACK...
  • CALLBACK函数

    2007-02-21 13:49:00
    看了下sqlite3的官方说明,exec方法中调用了callback函数,嫌麻烦,自己企图用其他的方法和数组来得到类似于recordset的功能,浪费了一整天后回头看看,发现其实官方的提供callback 的借口就是一个recordset。...
  • callback function

    千次阅读 2009-10-20 11:15:00
    0. 引言使用过SDK的朋友应该知道“回调函数”(callback function)这个概念,但本文并不是介绍如何使用回调函数,而是站在SDK开发者的角度,讲述如何实现回调机制。1. 何为回调(callback) 所谓回调,就是客户程序C...
  • JavaScript Callback

    2014-04-14 12:28:59
    如果你对Jquery没有足够的经验,但是你又用过JQuery,这么来说没你已经用过了毁掉函数了。但是你可能不知道它是如何工作和实现的。 这篇文章主要基于我所了解的回调函数,我试图启发大家基于最常规的JavaScript...
  • matlab callback

    千次阅读 2011-05-30 16:34:00
    ' Callback ' 属性值是一个MATLAB字符串,MATLAB将它传给函数eval并在命令窗口工作 空空间行。它对于函数M文件有重要的隐含意义。 因为 ' Callback ' 属性必须是字符串,所以在字符号内多重MATLAB命令、后续行以及...
  • callback机制

    千次阅读 2006-05-25 11:31:00
    来源: http://soacn.blogchina.com/1229663.html一个主线程管理其它线程时,不用轮询方法检查各个线程的状态,而是在子线程中出现某种状态时通知主线程,啊,有人要按下我了,啊,我的值到达100了,(术语叫触发了某种事件...
  • 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 ...
  • 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
  • callBack备忘

    2018-01-09 19:46:48
    callback接口 public interface CallBack { public String testCallBack(String a); } 处理类 public class TestCallBack { /** * * @param callBack * @param data * * @return
  • LRESULT CALLBACK

    千次阅读 2013-08-05 20:35:15
    LRESULT CALLBACK 它们其实是宏,表示函数的返回类型,你可以在VC里面对它们点右键然后Go To Definition看到它的宏定义。 其实,这就表示了WinProg函数是一个回调函数。在MFC中,得到Message消息以后系统会...
  • CALLBACK HELL

    2013-11-25 20:37:55
    1.http://callbackhell.com/

空空如也

1 2 3 4 5 ... 20
收藏数 62,968
精华内容 25,187
关键字:

callback