uvm_callback,设计者在进行class的function设计时,有意留下的一些hook,总是遍历某个pool中的对象;

       使用者在使用时,将实现添加到某个pool中;

callback中,最重要的三个class;

  1)pool类,uvm_callbacks,实现pool的register和add;

  2)调用接口类,uvm_callback_iter,实现对pool中对象的遍历;

  3)uvm_callback,供extend的基础类,只是定义了callback的mode;

uvm_callbacks类:其中定义了两类pool:

  1)不指定uvm_object(null类型)的,m_tw_cb_q;

  2)指定具体的uvm_object的,m_pool;

      

  uvm_callbacks_base,只是实现了add和register的小的function的原型定义;

             定义了m_b_inst的static变量,以及m_pool的以uvm_object为索引的,uvm_queue,

  uvm_typed_callbacks,实现了对uvm_queue中的callback进行add,delete,get,find的function;

             定义了m_t_inst的static变量,以及m_tw_cb_q类型的uvm_queue,其中保存uvm_callback;

  uvm_callbacks,定义了register,add,delete,add_by_name,delete_by_name的function;

             add function,会根据uvm_object是会为null,来判断是写入m_pool还是tw_cb_q中;

             delete function,类似;add_by_name,delete_by_name,首先根据uvm_root找到

              某个child的对象queue,之后再遍历调用相应的函数;

             m_get_q,根据uvm_object是否为null,来拿到tw_cb_q或者m_pool中的queue;

  uvm_derived_callbacks,目前感觉用处不大;

之上定义的很多function都是static类型,

uvm_callback_iter,参数化uvm_object,以及uvm_callback的两个参数,虽然pool或者queue都是static的;

    但是uvm_object以及callback可以作为删选类型,来保证拿到的queue是需要的那一组;

    static函数,first,last,next,prev;

uvm_callback,只定义了enable_mode,其他的function,都供设计者,进行extend设计,

                          然后使用者在进行extend,继而add到相应的pool,

    所以uvm_callback会被继承两层。

callback相关的macros:

1)由于很多参数化类的关系,所以callbacks以及callback_iter都对具体类型进行了typedef;

    如对于uvm_reg,分别对pool和iter进行了typedef;uvm_reg_cbs是设计者已经extend的一级class;

      

2)对register函数的包装:

    macros,uvm_register_cb(T,CB),调用相应callbacks的m_register_pair函数;

3)do callback函数的包装;

    macros,uvm_do_callbacks,遍历iter提供的对象;可以直接在宏中制定function名字;

      

    macros,uvm_do_obj_callbacks_exit_on,在函数的某个返回值,退出;

应用中,环境设计者:

    1)对uvm_callbacks进行typedef;

      

    2)从uvm_callback extend出新的class;

      

    3)在相应的component中留下function接口;

      

使用者:

    1)从uvm_driver_callback extend出新的实现function的class;可以不同的实现都做extend;

      

      

    2)在top上进行new和add 操作;

      

这样cb1和cb2 对象都被加到m_root中以driver为索引的uvm_queue中;

  add函数的调用,可以不同bus_driver_cbs_t,也可以使用其他的pool的def,但是必须保证存在该class;

    add函数,只需要uvm_object对象,以及相应实现正确类型的callback对象;

最新文章

  1. Java多线程基础——对象及变量并发访问
  2. SQL Server 2016 RC0 安装(超多图)
  3. C#程序使用SQLite数据库
  4. 分享10条Visual Studio 2012的开发使用技巧
  5. 为什么是 Cloud Service?
  6. Linux学习笔记——切换并取代用户身份命令——su
  7. (最长公共子序列+推导)Love Calculator (lightOJ 1013)
  8. mybaits3.2.8 别名包扫描通配符
  9. HDU 5637 Transform
  10. Delphi XE5 附破解补丁
  11. 部署github开源软件遇到的问题
  12. python _init_学习
  13. JAVA并发编程学习笔记------FutureTask
  14. React从入门到放弃之前奏(5):ReactRouter4
  15. setTimeout传参 和 运行机制
  16. Linux(CentOS7)压缩和解压缩war包、tar包、tar.gz包命令
  17. Linux 技巧:让进程在后台可靠运行的几种方法【转】
  18. Luogu P1894 [USACO4.2]The Perfect Stall
  19. JavaSE_坚持读源码_ArrayList对象_Java1.7
  20. LeetCode--205--同构字符串

热门文章

  1. oracle优化:避免全表扫描
  2. 转:CSS设置HTML元素的高度与宽度的各种情况总结
  3. day2_Jmeter压测
  4. 图->定义
  5. LeetCode 872 Leaf-Similar Trees 解题报告
  6. Windows7安装两个jdk配置
  7. 【Python爬虫】Requests库的基本使用
  8. CentOS SSH免密登陆
  9. 第一章:深入.NET框架
  10. MySQL 5.7 并行复制