我最近开始研究UVM,并且很难理解工厂的组件/对象注册过程。具体来说,我找不到实际注册的代码行。
以下是我的想法/搜索过程:
uvm_factory类有一个register方法,它注册给定类型的代理对象uvm_component_registry类,它参数化了最初想要的组件/对象的类型uvm_component_registry类中有一个get方法,它创建代理对象me并通过factory.register(me)调用将其注册到工厂。uvm_component_utils宏向工厂注册,该宏扩展为以下代码片段:
uvm_component_registry #(T,"S") type_id;静态函数type_id get_type();返回type_id::get();端点函数虚拟函数uvm_object_wrapper get_object_type();返回type_id::get();结束函数虚函数字符串get_type_name ();返回type_name;端点函数所以,我来谈谈问题的根源。在从uvm_component类扩展的user类中,我们只有uvm_component_utils宏,它不调用uvm_component_registry的get方法。此外,在使用工厂创建必要的类对象的get阶段之前,不存在build方法调用。当然可以,这意味着我们班已经注册了。问题是-怎么做?是否有一些隐式get方法调用?
发布于 2021-07-15 05:20:08
相反,因为`uvm_component_utils宏添加了
typedef uvm_component_registry #(T,`"S`") type_id;该参数化类具有一个带有声明初始化的静态变量。
local static this_type me = get();这将调用get(),而不必构造uvm_component_registry类,因为它是类的专门化。你可能想读我的DVCon论文:使用参数化类和工厂:面向对象验证的阴阳,或者看我在用于UVM验证的SystemVerilog OOP上的短训班。详细介绍了UVM如何在系统-verilog中实现工厂设计模式
https://stackoverflow.com/questions/68386089
复制相似问题