zoukankan      html  css  js  c++  java
  • callback源码分析——callbacks

    uvm的callback必须是提供者有预见性的留一些方法在function前后,这样在使用的时候,进行遍历调度即可    

      设计者,需要从uvm_callback定义一个基类,只定义function原型定义一个uvm_callbacks,即pool类型;

          在对象类中使用register_cb宏来注册callbacks;  

      使用者,需要从指定的uvm_callback扩展出一个实现类,并将该类的一个对象add到对应的pool中;

    callbacks中有两个参数,一个表示object,一个表示具体的callback,因为一个object可能有多个callback;

    typed_callback,中只有一个参数,表示object;

    callbacks_base,则通用的定义了一个uvm_pool,m_pool,以object为索引,返回uvm_queue类型的队列;

    callbacks_base,从uvm_object继承而来,单实例化设计,其中定义了两个static变量,由于并不是一个参数化的类;

        所以m_b_inst和m_pool在系统中,只有一份;

        

    uvm_typed_callbacks从uvm_callbacks_base继承而来,参数化的类,以callback对应的object为参数;

        其中定义了两个参数化的变量;变量m_t_inst,队列m_tw_cb_q;

        所以两个static变量根据paramter的不同会有很多份;

        

    uvm_callbacks从uvm_typed_callbacks,继承而来,有两个参数,object和callback,

        其中定义了两个主要的static变量,m_inst,m_base_inst,m_base_inst只与object类型有关;

        所以不同的object和callback,m_inst都还有多份;

        

    uvm_register_cb(T,CB)的define;

        

    调用了一个uvm_callbacks的function, m_register_pair,并且新定义了一个变量来接收返回值;

    1)首先必须在uvm_callback扩展的时候,定义一个uvm_callbacks的class;

      m_register_pair一个static的函数,调用get函数,之后递归调用initial function,实现所有static变量的定义;

          

          

          

    2)uvm_typeid得到static的实例化typeid_base的class;

          

    3)注册m_typeid和m_cb_typeid的值到uvm_typeid_base的static变量中;一个object的参数化类,一个callback的参数化类;

          m_base_inst中push back所有的m_inst,即callbacks的种类;

          

    add function,static类型,将object和相应的callback加到对应的callbacks中;

          首先调用get函数,此时各个inst都不是null,不会执行代码;如果callback为null,报错;

          

          从m_pool中拿到指定object的callback queue;如果为null,新建一个;

          

            如果对应的callback已经加到对应的object的queue中,报warning;否则根据order的类型,进行push操作;

            不同的order顺序,决定了定义同一object的callback的执行顺序;

          

    如果add的时候,object的值为null,则将callback加到自己类型的queue中;

          

    add_by_name,static function只是在uvm_root中进行find函数调用,查找指定name的comp,在调用add函数;

        找到的comp队列都加入callback;

          

    delete函数,static类型,拿到m_pool中的队列,删除相应的callback,找不到相应的callback,报warning;

          

    如果delete的时候,传入的object的值为null,则删除该类型中的queue中的callback;

    delete_by_name类似。

    提供给其他class的static函数 实现;

    get_first;先拿到该comp类型的对象(null),或者某个对象的callback队列;

          如果没有add进m_pool中,则也进行add操作;

          

          

    get_last,get_prev,get_next,类似,但是需要显示指定itr的值;

    使用时也可以调用宏ucm_do_obj_callbacks进行遍历调用;

          

  • 相关阅读:
    如何在一个控件上同时实现单触和多触事件
    看看iOS 5.0 beta 6都有哪些变化吧
    转,net实现下载
    转检测到潜在危险
    如何分析已有项目如何能够得到最快最大的提升???
    转Unity 入门
    近段总结
    转,net几个热点问题
    dll动态链接库
    转使用NUnit在.Net编程中进行单元测试
  • 原文地址:https://www.cnblogs.com/-9-8/p/7614687.html
Copyright © 2011-2022 走看看