config
所有的config一般直接从uvm_object派生。config的主要功能就是规范验证平台的行为方式。
如规定driver在读取总线时地址信号要持续几个时钟,片选信号从什么时候开始有效等。
config_db机制功能非常强大,能在不同层次对同一参数实现配置。但它的一个致命弱点是,其set函数的第二个参数是字符串,如果字符串写错,那么根本就不能正确的设置参数值。
例如,要对driver的pre_num进行设置,但是在写第二个参数时,错把i_agt写成了i_atg:
uvm_config_db#(int)::set(this,"env.i_atg.drv","pre_num",1);
这种情况,UVM不会提供任何错误提示。SystemVerilog仿真器也不会出任何参数错误提示。
针对这种情况,UVM提供了一个check_config_usage,它可以显示出截止到此函数调用时,有哪些参数时被设置过但是却没有获取过。
由于config_db的set及get语句一般都用于build_phase阶段,所以此函数一般在connect_phase被调用()当然也可以在connect_phase后的任一phase被调用:
virtual function void connect_phase(uvm_phase phase);
super.connect_phase(phase);
check_config_usage();
endfunction
举例:
function void my_case0::build_phase(uvm_phase phase);
uvm_config_db#(uvm_object_wrapper)::set(this,"env.i_agt.sqr.main_phase","default_sequence",case0_sequence::type_id::get());
uvm_config_db#(int)::set(this,"env.i_atg.drv","pre_num",999);
uvm_config_db#(int)::set(this,"env.mdl","rm_value",10);
endfunction
运行结果显示,pre_num和default_sequence的设置没有被读取。pre_num未被读取是因为错把i_agt写成了i_atg.default_sequence没被读取是因为main_phase在connect_phase之后执行的。