禾雨

导航

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之后执行的。

posted on 2019-12-12 17:14  禾雨  阅读(866)  评论(0编辑  收藏  举报