uvm_config_db 在UVM时经常被用到的,但最近在调试同事环境的时候,有一点跟我之前的认知是不一样,所以在这记录一下。
场景如下:
class env extends uvm_env;
...
function void build_phase(uvm_phase phase);
super.build_phase(phase);
agt = agent::type_id::create("agt",this);
uvm_config_db#(sequencer)::set(this,"agt","sqr",agt.seqr);
endfunction
...
endclass
class vseq extends uvm_sequence;
...
task body();
uvm_config_db#(sequencer)::get(null,"uvm_test_top.env.agt","sqr",seqr);
endtask
endclass
就是说,在seqr没有create之前把seqr的handle set 给agent,原本认为等vseq 启动后,seqr已经create,所以seq 可以获取到seqr的handle,但结果是seq中的seqr是null。
可以理解为:利用uvm_config_db set时的handle,和seqr create后的handle不是同一个。
tips:
如果利用uvm_config_db传的是handle,则要保证在set时handle有指向具体空间。
在sequence中获取变量
uvm_config_db # (int) :: set (this, “env.i_agt.seqr.*”, “count”, count); // test_base class
uvm_config_db # (int) :: get (null, get_full_name(), “count”, count); // my_sequence class
其中,get_full_name 返回:“uvm_test_top.env.i_agt.seqr.my_sequence”
另外一种写法:
uvm_config_db # (int) :: set (this, “env.i_agt.seqr”, “count”, count); // test_base class
uvm_config_db # (int) :: get (m_sequencer, “”, “count”, count); // my_sequence class