system-verilog - uvm_component 是如何在 uvm_factory 中注册的?
问题描述
我最近开始研究 UVM,并且在理解工厂的组件/对象注册过程时遇到了一些困难。具体来说,我找不到实际注册的代码行。
这是我的思考/搜索过程:
我发现
uvm_factory
该类有一个register
注册给定类型的代理对象的方法此代理对象属于
uvm_component_registry
使用最初所需组件/对象的类型参数化的类类内部
uvm_component_registry
有一个get
方法,它创建代理对象并通过调用me
将其注册到工厂factory.register(me)
在 UVM Cookbook 中,它说每个 uvm_component 都应该使用
uvm_component_utils
宏向工厂注册,该宏扩展为以下代码片段:typedef uvm_component_registry #(T,`"S`") type_id; static function type_id get_type(); return type_id::get(); endfunction virtual function uvm_object_wrapper get_object_type(); return type_id::get(); endfunction virtual function string get_type_name (); return type_name; endfunction
所以,在这里我找到了问题的根源。在从类扩展的用户类中,uvm_component
我们只有uvm_component_utils
宏,它不get
调用uvm_component_registry
. 在我们使用工厂创建必要的类对象的阶段之前,也没有get
方法调用。build
它确实有效,这意味着我们的班级已经注册。问题是——如何?是否有一些隐式get
方法调用?
解决方案
相反,因为`uvm_component_utils
宏添加
typedef uvm_component_registry #(T,`"S`") type_id;
该参数化类有一个带有声明初始化的静态变量
local static this_type me = get();
这个调用get()
不需要构造uvm_component_registry
类,因为它是类的特化。您可能想阅读我的 DVCon 论文:使用参数化的类和工厂:面向对象验证的阴阳,或观看我的SystemVerilog OOP for UVM 验证短期课程。详细介绍 UVM 如何在system-verilog中实现工厂设计模式
推荐阅读
- c++ - 限定名称的重载解析
- python - os.system() 有效, subprocess.run() 无效
- json - jq simple json object merge/combination
- swagger - 在 Foxx 中使用组合框创建查询参数
- java - Spring 和 RESTfull ConcurrentModel 不支持 null 属性值
- java - 我可以从模型层呼叫演示者吗?
- android - RecyclerView 上的 Espresso 测试滚动行为在模拟器中不起作用
- javascript - 在 Odoo 10 中单击树视图的字段时如何执行某些操作?
- python - 在不加载多个 .npy 文件的情况下获取向量的长度
- javascript - 在不使用 css 网格和不使用 css flex 的情况下创建类似的东西