在 UVM 中,set
和 get
函数通常成对出现,但在某些特定情况下,可以省略 get
函数。我们在实际代码中,可以知道这一点,不至于漏出笑话。
以下是允许省略 get
函数的条件:
1. 满足特定条件
省略 get
函数的条件包括:
类必须注册到 UVM Factory:使用
uvm_component_utils
宏注册类。变量必须使用
uvm_field_*
宏注册:例如uvm_field_int
。
set
的第三个参数必须与变量名一致:set
的第三个参数(字段名)必须与目标变量名一致。调用
super.build_phase()
:在build_phase
中调用super.build_phase()
,UVM 会自动处理配置值的设置。
2. 举例
以下是一个示例,展示了如何在满足条件的情况下省略 get
函数:
class my_driver extends uvm_driver #(my_transaction);
int pre_num; // 目标变量
`uvm_component_utils_begin(my_driver)
`uvm_field_int(pre_num, UVM_ALL_ON) // 使用 uvm_field_int 宏注册变量
`uvm_component_utils_end
function void build_phase(uvm_phase phase);
super.build_phase(phase); // 调用 super.build_phase()
// 不需要显式调用 uvm_config_db#(int)::get
endfunction
endclass
在测试中设置配置值:
class my_test extends uvm_test;
function void build_phase(uvm_phase phase);
super.build_phase(phase);
uvm_config_db#(int)::set(this, "my_driver", "pre_num", 42); // config_db::set 语句
endfunction
endclass
在这种情况下,my_driver
的 pre_num
变量会自动从配置数据库中获取值,而无需显式调用 get
函数。
3. 总结
省略 get
函数的条件是:
类必须使用
uvm_component_utils
宏注册。变量必须通过
uvm_field_*
宏注册。
set
的第三个参数字段名必须与get 第三个参数 目标变量名一致。在
build_phase
中调用super.build_phase()
。
这些条件确保 UVM 的自动配置机制能够正确处理配置值的设置。