uvm 中的config_db介绍

UVM环境中的config_db实际上是一个数据库,我们可以设置一些参数, 然后在不同的地方获取这个参数。比如可以在顶层的testcase中设置一个cov_en变量用于控制覆盖率的收集, 这样就不用每次修改testbench。

  • set()
1
2
3
4
static function void set (  uvm_component cntxt,
string inst_name,
string field_name,
T value);

上面所示的例子如果在某个agent的build phase进行设置, 那么coed 如下所示:

1
2
3
4
5
virtual function void build_phase (uvm_phase phase);
...
uvm_config_db #(int) :: set (null, "uvm_test_top.m_env.m_apb_agent", "cov_enable", 1);
...
endfunction

值得注意的是: 如果’cntxt’ 是 ‘null’, 那么第二个参数的路径要写完整,如果是’this’就代表的是当前component的路径,uvm_test_top.m_env.m_apb_agent

  • get()
1
2
3
4
static function bit get (  uvm_component cntxt,
string inst_name,
string field_name,
inout T value);

可以用这个函数获取数据库中某个变量的值:值得注意的是, get函数中的instance name的scope要真的存在才会返回值, 说明如下:

1
2
3
4
5
// Get virtual interface handle under name "apb_vif" into local virtual interface handle at m_env level
uvm_config_db #(virtual apb_if) :: get (this, "*", "apb_vif", apb_if);

// Get int variable fails because no int variable found in given scope
uvm_config_db #(int) :: get (null, "uvm_test_top", "cov_enable", cov_var);
  • exist()
1
2
3
4
static function bit exists (  uvm_component cntxt,
string inst_name,
string field_name,
bit spell_chk);

主要是检查指定路径下的Component中的变量是否存在, 如果存在spell_chk就会置位

1
2
3
// Check if interface handle exists at the given scope
if (! uvm_config_db #(virtual apb_if) :: exists (this, "*", "apb_vif"))
`uvm_error ("VIF", "Could not find an interface handle", UVM_MEDIUM)
  • wait_modified()
1
2
3
static task wait_modified ( uvm_component cntxt,
string inst_name,
string field_name);

主要作用是阻止当前语句的执行:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class my_agent extends uvm_agent;

virtual task run_phase (uvm_phase phase);
...
// Waits until loopCount variable gets a new value
uvm_config_db #(int) :: wait_modified (this, "", "loopCount");
endtask
endclass

class my_env extends uvm_env;

my_agent m_apb_agent;

virtual task main_phase (uvm_phase phase);
...
// Update loopCount variable in database
for (int i = 0; i < N; i++) begin
...
uvm_config_db #(int) :: set (this, "m_apb_agent", "loopCount", i);
end
endtask
endclass