场景:在test case中有uvm_config_db set. 一个config:uvm_config_db#()::set( pointer,path, "cfg",cfg);
1.继承component的部件,有uvm_driver,uvm_sequencer,uvm_monitor等。
在build_phase中先用get_type的方式例化一个cfg。然后uvm_config_db#()::get(pointer,path,"cfg",cfg);此path与test case中的path相同。
2.继承object的部件,有uvm_sequence. uvm_config.
首先声明cfg。不需要new config,然后在body或者pre_body中进行uvm_config_db 的get。
uvm_config_db#()get(pointer,get_full_name(),"cfg",cfg); 第二个参数换成get_full_name()来获得有效路径。
3. 关于uvm_config_db需要注意的几点。
3.1 set和get最好一一对应,可以set 多次,get一次,获得的是最后set的值。
3.2 关于set的path。set的默认指向路径是uvm_test_top(test那一层)。get最不易出错的是写全路径。举例:
1.test 中uvm_config_db#(cfg_t):: set(null,"*","lzlz_cfg",lzlz_cfg); "*"意思是set下面的层次都可以看得到。
scoreboard中 uvm_config_db#(cfg_t)::get(null,"uvm_test_top.env.lz_scoreboard","lzlz_cfg",lzlz_cfg);
重要的是第三个参数必须要保持一致,是set和get共用的名字。前两个参数是指的全部路径,对于get来说指向具体的get位置。
3.3 遇到过的uvm_config_db的奇怪的用法。
在model中set, uvm_config_db#(virtual if)::set(null,"",$sformatf("TX_NAME_%d",INST),tx);
在monitor中set, uvm_config_db#(virtual vif)::get(this,"",$sformatf("TX_NAME_%d",lane_num),tx_vif);
关于两边的path问题,都没有设定却能够正常使用。
关于uvm_config_db可以这样理解,uvm_config_db#(uvm_object)::set(comp,string0,string1,obj),set 操作可以认为做了一个联合数组aa[{comp.get_full_name(),string0,string1}] = obj,而get操作就是得到 aa[{comp.get_full_name(),string0,string1}],那么关于你的问题,在transaction中get某个obj,就可以这样,在test中uvm_config_db#(uvm_object)::set(null,string0,string1,obj),而get时也是uvm_config_db#(uvm_object)::get(null,string0,string1,obj),这样即可