在UVM中为了避免进行层次化操作信号,引入virtual interface,提高代码的复用性。
为了配置virtual interface,UVM引入了config_db机制。
可以理解为virtual interface是实际interface的一个指针,通过config_db机制使virtual interface指向不同的具体interface,这样就可以通过操作virtual interface来操作具体interface。
UVM普遍采用这种方式存(set)、取(get)信息。对于config_db机制,首先使用set()方法存储信息,把其他组件需要的资源放进全局可见的数据库,然后在组件内部通过get()方法获取信息。
initial begin uvm_config_db#(virtual my_if)::set(null, “uvm_test_top”, "vif", input_if);end
参考《UVM 实战》代码,在顶层通过set()方法存储input_if变量值,并标志名称“vif”。
virtual function void build_phase(uvm_phase phase); super.build_phase(phase); if(!uvm_config_db#(virtual my_if)::get(this, "","vif", vif)) `uvm_fatal("my_driver","virtual interface must be set for vif!!!") endfunction
在my_driver组件的build_phase中通过get()方法获取标志为“vif”的信息到virtual interface vif中
uvm_config_db #(type T )::set/get(uvm_component cntxt , string inst_name , string field_name ,T value)
上述set()或者get()方法的参数#(type T)定义了存储和读取的配置变量类型,可见config_db机制不仅仅可以操作virtual interface 。
cntxt 和inst_name指定了方法作用范围(scope)。
field_name是用于存储和获取该特定对象的句柄标志。在set()和和get()期间,field_name必须相同,不然就无法找到对应的变量。
value是被配置的具体变量值