【UVM源码学习】uvm_registry
日期: 2020-12-14 分类: 跨站数据 601次阅读
如果对每个factory注册的component/object都创建其实例,内存、仿真/编译的开销会很大。为了减小这种开销,可以采用uvm_registry
对factory注册的componnet/object类创建一个轻量级的代理
(仅含有get/get_type/get_type_name等方法),只有使用到该component/object时才手动创建其实例
(type_name::type_id::create(name,parent),只有使用uvm_component_utils这类宏注册的才能使用type_name:;type_id::create,type_def直接定义的没有type_id)。
uvm_registry.svh 中主要实现了两个类,uvm_component_registry及uvm_object_registry,分别为component及object的代理类。两个类均直接派生自uvm_object_wrapper。类中实现的主要方法有:
序号 | 方法 | 描述 |
---|---|---|
1 | create_component | 创建component |
2 | create_object | 创建object |
3 | get_type_name | 返回type_name |
4 | get | 调用uvm_object的get,若get()为null,factory.register()并返回 |
5 | create | 调用factory的create_component_by_type来实例化类。只有使用uvm factory机制注册的类才能使用type_name::type_id::create的方式进行实例化 |
6 | set_type_override | 调用了factory的set_type_override_by_type |
7 | set_inst_override | 调用了factory的set_inst_override_by_type |
可以采用以下方法来注册component代理:
type_def uvm_component_registry #(mycomp, “mycomp”) type_id;
不同仿真器实现方法或存在不同,常用方法是采用以下宏:
`uvm_component_utils(mycomp) //非参数化的类
`uvm_component_param_utils(mycomp, #(T)) // 参数化的类:
对于参数化的类,由于传进来的type_name不固定,因而采用uvm_component_param_utils及uvm_object_param_utils宏注册参数化类的时候,没有实现get_type_name的方法,即采用以上两个宏注册的参数化的类不能使用get_type_name
。参数化的类本意是通过传入参数消除多个type_name相同的类之间的干扰,因而不建议通过type_name在uvm_factory中查找相关类。
除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog
标签:UVM
精华推荐