我遇到过这个声明,我在这个原型中使用了很多测试平台组件。 super.run_phase(),super.build_phase,super.connect_phase。
任何人都可以用一个简单的例子来解释为什么我们每次都需要调用超级函数。我知道我们需要在构建孩子之前构建父母,但为什么我们必须调用父母的connect_phase等?
由于
答案 0 :(得分:3)
从UVM component source code开始,每个阶段都是默认为空虚拟功能/任务:
function void uvm_component::connect_phase(uvm_phase phase);
connect();
return;
endfunction
function void uvm_component::connect();
return;
endfunction
从基本测试或基本驱动程序等调用super.connect_phase
或任何阶段非强制性。
您可能已在基本测试中实例化了环境,因此调用super.build_phase
将创建所需的实例。同样,您可能在基础环境/代理中连接了一些ports-exports,并且对super.connect_phase
的调用将连接它们。
但是,build_phase
是一个例外。高度建议将 build_phase / connect_phase 用于用户定义的代码,而不是使用构造函数中的任何代码。
您可以根据覆盖的要求在扩展类中调用super.build_phase()
/ super.connect_phase()
,或者在基类build_phase()
/ connect_phase()
中添加现有功能。
您无法完全覆盖构造函数,因为SystemVerilog要求扩展类构造函数调用super.new()。
如果使用字段自动化宏,则对基类&#39> build_phase中的{strong>强制调用是必需的。
例如:
super.build_phase()
任何覆盖都应调用super.build_phase(phase)来执行 通过调用自动配置组件中注册的字段 的 apply_config_settings 即可。要关闭a的自动配置 组件,不要调用super.build_phase(阶段)。
class base_test extends uvm_test;
`uvm_component_utils(base_test)
//...
function build_phase(uvm_phase phase);
super.build_phase(phase); // for automatic configuration of fields
endfunction
//...
function connect_phase(uvm_phase phase);
super.connect_phase(phase); // normal practice
endfunction
endclass
class my_test extends base_test;
`uvm_component_utils(my_test)
//...
function build_phase(uvm_phase phase);
super.build_phase(phase); // for environment creation
endfunction
//...
function connect_phase(uvm_phase phase);
// super.connect_phase(phase); // will compile even if not call-ed
endfunction
endclass
用于将配置设置应用于班级的每个字段。
如果不希望为组件调用apply_config_settings
,那么apply_config_settings
方法应该重载,并且apply_config_settings调用build_phase()
。