
UVM中的configure机制用来将一些对象(objects)和数据(data)传递到验证平台中的各种组件。
本文主要分为:
1、什么是uvm_config_db? ------What
2、什么时候使用uvm_config_db? ------When
3、怎么使用和调试uvm_config_db?------How
What:什么是uvm_config_db?
一个可配置的验证环境会提高重用性,一般可以通过外部参数传递。
UVM的configure机制更加方便地提供了配置功能的实现,就是建立一个数据库或者说键值对,即通过键(key)写入(set)或者读取(get)相应的值(value)。
在了解uvm_config_db之前我们先了解下uvm_config_db的父类uvm_resource_db。
class uvm_resource_db#(type T=uvm_object)可以看出,uvm_resource_db是一个参数化的类,默认的参数是uvm_object。
class uvm_config_db#(type T=int) extendsuvm_resource_db#(T)uvm_config_db继承自uvm_resource_db,其也是一个参数化的类,默认的参数是int。
相比uvm_resource_db,uvm_config_db增加了层次化的信息,即uvm_resource_db建立的是一个全局的配置数据库,uvm_config_db建立的是一个局部的配置数据库,需要指定具体配置数据库的层次信息。
When:什么时候使用uvm_config_db?
一个使用uvm_config_db的经典场景是传递virtual interface。interface在顶层例化,连接testbench和DUT,要想在driver和monitor中驱动和监测DUT就需要将physical interface传递给driver和monitor中的virtual interface。
How:怎么使用和调试uvm_config_db?
uvm_config_db使用set()和get()分别完成interface的设置和获取。
static function void set(uvm_component cntxt,
string inst_name,
string field_name,
T value)set()是静态方法,在使用时需要加上范围解析运算符“::”,下表是set()静态方法四个参数的作用描述。
参数 | 描述 |
|---|---|
uvm_component cntxt | 所指定层次路径的起点,层次越高,优先级越大 |
string inst_name | 和cntxt一起形成层次路径 |
string field_name | 用于索引的标签,相当于键“key” |
T value | 用于索引的数据值,相当于值“value” |
static function bit get(uvm_component cntxt,
string inst_name,
string field_name,
inout T value)get()和set()类似。
virtual interface的配置流程如下:
1、在顶层实例化physical interface。并连接到DUT
my_if input_if(clk, rst_n);
my_if output_if(clk, rst_n);
dut my_dut(.clk(clk),
.rst_n(rst_n),
.rxd(input_if.data),
.rx_dv(input_if.valid),
.txd(output_if.data),
.tx_en(output_if.valid));2、配置physical interface到各个组件的virtual interface
initial begin
uvm_config_db#(virtualmy_if)::set(null, "uvm_test_top.env.i_agt.drv", "vif",input_if);
uvm_config_db#(virtualmy_if)::set(null, "uvm_test_top.env.i_agt.mon", "vif",input_if);
uvm_config_db#(virtualmy_if)::set(null, "uvm_test_top.env.o_agt.mon", "vif",output_if);
end3、在组件内获取physical interface。
if(!uvm_config_db#(virtual my_if)::get(this, "", "vif",vif))
`uvm_fatal("my_driver", "virtual interface must be setfor vif!!!")除了上面的get()显式调用,还可以factory机制完成get()的隐式调用。
STEP1:通过field automation macro注册
STEP2:在build_phase调用super. build_phase()
创建对象/数据后,UVM factory机制将查看该对象/数据是否使用uvm_config_db配置值。如果使用set()一个新的配置值,则自动隐式执行对象/数据配置。可查看super. build_phase()中的apply_config_settings()
通常在testcase中配置验证case相关(Test-specific)的对象/数据(例如),在env中配置验证平台相关(structure-related)的对象/数据。
在实际项目中可能会由于字符串书写错误而编译无法检查出来导致大量时间的浪费,我们可以使用条件判断+`uvm_fatal、check_config_usage和仿真选项+UVM_CONFIG_DB_TRACE来进行configure机制的调试。