在uvm环境中,可以非常方便的利用uvm_config_db,在不同的组件之间传递参数。本文主要统计一下,利用uvm_config_db可以传递的参数类型,以及演示一下每种参数类型的传递方法。
uvm_config_db用于实例化的对象之间传递参数;uvm_resource_db用于全局配置。
uvm_config_db的set和get函数的参数介绍如下所示,如果get函数匹配到了set,则返回1,否则返回0。
uvm_resource_db的参数介绍如下图所示,设置的时候使用set函数,获取的时候使用read_by_name或者read_by_type函数。
图中演示了如何利用uvm_config_db传递整数类型的数据。值得注意的是,如果组件中的变量被用uvm_field_*的方式注册了,那么该组件中,则会隐藏的自动执行uvm_config_db::get,去获取变量的值。
可以通过仿真命令+uvm_set_config_int传递参数,但是在uvm_config_db::get的时候数据类型必须用uvm_bitstream_t。
<sim command> +uvm_set_config_int ="uvm_test_top.env.drv,port_id,10"
在base_test中,通过uvm_config_db #(string)::set进行设置。
class test_base extends uvm_test;
`uvm_component_utils(test_base)
virtual function void build_phase(uvm_phase phase);
super.build_phase(phase);
uvm_config_db #(string)::set(this, "env", "hdl_path", "router_test_top.dut");
endfunction: build_phase
endclass: test_base
在env中,通过uvm_config_db #(string)::get进行获取。
class router_env extends uvm_env;
`uvm_component_utils(router_env)
virtual function void build_phase(uvm_phase phase);
super.build_phase(phase);
`uvm_info("TRACE", $sformatf("%m"), UVM_HIGH);
string hdl_path;
`uvm_info("HOST_CFG", "Self constructing regmodel", UVM_MEDIUM);
if (!uvm_config_db #(string)::get(this, "", "hdl_path", hdl_path)) begin
`uvm_warning("HOST_CFG", "HDL path for DPI backdoor not set!");
end
endfunction: build_phase
endclass: router_env
在testbench层,利用uvm_resource_db来全局传递interface,相比较uvm_config_db,可以有效避免因为层次结构发生改变造成的问题。
在base_test中,通过uvm_resource_db::read_by_type获取到interface,再通过uvm_config_db::set传递下去。
在driver底层的组件中,通过uvm_config_db::get获取interface,同时要判断获取到的句柄是否为空。
在agent中间层的组件中,通过uvm_config_db::get获取interface,再通过uvm_config_db::set设置下去。
另外也可以通过直接赋值的方式将interface传递下去。
使用方法参考如下链接。
UVM config_db如何传递数组和枚举类型
基于例化的sequence配置,在利用uvm_config_db的set函数发送sequence时,传递的是sequence的例化名路径,用get函数获取sequence时,则用this.get_full_name函数去获取sequence的路径。
基于类的sequence配置,这是一种比较推荐的做法,在利用uvm_config_db的set函数传递sequence时,路径选用sequence的类名,在利用get函数获取sequence时,则利用get_sequencer函数获取sequence的sequencer路径,再利用this.get_type_name获取sequence类名。
基于sequencer的sequence配置,在利用uvm_config_db的set函数传递sequence时,路径只设置到sequencer的例化名sqr,在利用get函数获取sequence时,则利用get_sequencer函数获取sequence的sequencer路径。
基于agent的sequence配置,在利用uvm_config_db的set函数传递sequence时,路径只设置到agent的例化名agt,在利用get函数获取sequence时,则利用get_sequencer函数获取sequence的sequencer路径my_sqr,再通过my_sqr.get_parent函数获取到agent的路径。
本文主要记录了,如何利用uvm_config_db和uvm_resource_db在uvm中间传递不同数据类型的变量,包括整形int、字符串string、接口interface、枚举enum、数组array。