求助:关于UVM中uvm_config_db传递config类
各位:
最近在使用UVM搭建验证环境,在实际使用过程中对使用uvm_config_db来传递一些配置信息有点疑惑。因为照我理解,应该是一头使用uvm_config_db#(my_config)::set()来设置,然后另外一头使用uvm_config_db#(my_config)::get()来取得配置,这样就成功了。
但是,在我使用的时候,发现光这样好像不大够,我还需要再在connect_phase中对目标进行赋值。比如:
- class base_test extends uvm_test;virtual function void build_phase(uvm_phase phase);
- super.build_phase(phase);
- tb0= tb::type_id::create("tb0",this);
- vsqr = vsequencer::type_id::create("vsqr",this);
- uvm_config_db#(vdo_config)::set(this,"*","vdo_cfg",tb0.vdo_cfg);endfunction : build_phase
- class vsequencer extends uvm_sequencer;virtual function void build_phase(uvm_phase phase);
- super.build_phase(phase);
- if(!uvm_config_db#(vdo_config)::get(this,"","vdo_cfg",vdo_cfg))
- `uvm_error("NO_VDO_CFG",{"config of video is not set for this component",get_full_name()})
- endfunctionvirtual task run_phase(uvm_phase phase);super.run_phase(phase);$display("**************************************");vdo_cfg.print();endtask
这样跑的时候并没有报出“NO_VDO_CFG”的error出现,但是在运行“vdo_cfg.print()"的时候,出了error说ncsim: “*E,TRNULLID: NULL pointer dereference.”
然后我在class base_test的connect_phase中添加一行”vseq.vdo_cfg=tb0.vdo_cfg",这样程序才能跑起来。
我想知道是我之前的理解有问题,还是我实际操作中有问题呢?希望各位达人给我解惑。
另外,补充一下,我刚才在verquencer的run_phase中加入“if(vdo_cfg==null) $display("in vsequencer : vdo_cfg is null");"
然后出来的结果显示vdo_cfg确实是null的。不知道这是为什么呀。
你的 vdo_cfg 在vsequencer中声明了没有?
肯定申明了呀,不然会报错的。
- class vsequencer extends uvm_sequencer;
- apb_master_sequencer apb_sqr;
- vdo_master_sequencer vdo_sqr;
- ral_block_apb_basic_block regmodel;
- vdo_config vdo_cfg;
- ...
那个Test_base里面的tb0.vdo_cfg是null吗?
那个不是,它的print可执行,没问题
class base_test extends uvm_test;virtual function void build_phase(uvm_phase phase);super.build_phase(phase);
tb0= tb::type_id::create("tb0",this);
vsqr = vsequencer::type_id::create("vsqr",this);
uvm_config_db#(vdo_config)::set(this,"*","vdo_cfg",tb0.vdo_cfg);endfunction : build_phase
根据你现在的code,你的tb0是指base_test的build_phase里面create的,但它下面的vdo_cfg是在哪里create和赋值的呢?难道是在tb0的new里面?!所以我怀疑它一直是null的。
vdo_cfg是在tb0里面create的。你的意思是否是:因为它是在tb0中create的,因此,在base_test中调用的时候它其实还是null的?
我估计你是在tb0(env)的build_phase里面,create vdo_cfg的,cfg里面内容一般都是要被test case可控,所以还是放到test case的build_phase里面去赋值,当然要等tb0被create以后。如果你是在tb0的build_phase里面create cfg,但没有成功,我分析是因为UVM要执行test的build_phase之后才执行env的build_phase. 所以不知道你把这个create过程放到test的后面的phase,比如connect_phase,是否可以。当然感觉会非常奇怪。
UVM我也正在学习,大家多讨论。
你vsequencer中的vdo_cfg有没有create?是在什么地方create的呢?
build_phase的执行顺序是top_down的,因此会先执行你的base_test里面的config_db::set,此时tb0.vdo_cfg是null。因此你在sequencer里面get到的也是null。
后面会执行tb0的build_phase,此时vdo_cfg才会被new。
if(!config_db::get)这个条件只会判断是否get成功,但是不会判断get到的东西是否为null。
就是开始的时候路径不对,你connect以后就正确了。
留个名,我以后也要用uvm