问题描述
我最近开始研究 UVM,但在理解工厂的组件/对象注册过程时遇到了一些困难。具体来说,我找不到实际注册的代码行。
这是我的想法/搜索过程:
-
此代理对象属于
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 论文:Using Parameterized Classes and Factories: The Yin and Yang of Object-Oriented Verification,或观看我关于 SystemVerilog OOP for UVM Verification 的短期课程。在 system-verilog