1. 關于省略get
假設在環境env的build_phase中進行了config_db::set,目标是agent中driver包含的一個變量num,那麼要想在driver的build_phase中省略config_db::get需要滿足三點:
(1)這個driver必須用 uvm_component_utils注冊;
(2)變量num必須在driver中用uvm_field_int宏進行了域的自動化聲明;
(3)set的第三個參數和get的第三個參數以及第四個參數保持一緻,即set裡第三個參數為num,get裡第三第四個參數也為num;
class driver1 extends uvm_driver;
int num;//聲明變量
`uvm_component_utils_begin(driver1)//注冊和域的自動化
`uvm_field_int(num,UVM_ALL_ON)
`uvm_component_utils_end
function new(string name="driver1",uvm_component parent=null);
super.new(name,parent);
num=5;//賦新值
endfunction
function void build_phase(uvm_phase phase);
`uvm_info("driver1","before super.build_phase, num is %0d",num)
super.build_phase(phase);//滿足上述三個條件,則在super.build_phase()時會自動執行config_db::get()
`uvm_info("driver1","after super.build_phase, num is %0d",num)
if(!uvm_config_db#(virtual intereface1)::get(this,"","vif",vif))
`uvm_fatal("driver1","can not get vif handle")
endfunction
endclass
2. 關于跨層次
假如對一個層次中的某一變量進行多次set,那麼根據不同情況,該變量get的結果不同,有如下兩種情況:
(1)後set的決定最後的get結果,先set的忽略;
(2)權威性高的set決定最後的get結果。權威性低的set忽略;
在uvm世界中,采用的是第二種情況,即根據set的權威性來決定最後get的結果。
以如下代碼為例:
//在test1中對driver中的變量num進行了設定
class test1 extends uvm_test;
...
function void build_phase(uvm_phase phase);
super.build_phase(phase);
uvm_config_db#(int)::set(this,"env.agt.drv","num",100);
`uvm_info("test1","env.agt.drv.num is set to 100",UVM_LOW)
endfunction
endclass
//在env中也對driver中的變量num進行了設定
class env extends uvm_env;
..
function void build_phase(uvm_phase phase);
super.build_phase(phase);
uvm_config#(int)::set(this,"agt.drv","num",99);
`uvm_info("env","env.agt.drv.num is set to 99",UVM_low)
endfunction
endclass
最終的結果,num的值get到100。因為test1的層次高于env,在uvm樹中,test1更接近于uvm_top。上述代碼的set,可以認為起點就不同,test1的起點是uvm_test_top(test1的執行個體名),而env就是env(執行個體化的名字)。
而當變成如下情況:
class test1 extends uvm_test;
...
function void build_phase(uvm_phase phase);
super.build_phase(phase);
uvm_config_db#(int)::set(uvm_root::get(),"uvm_test_top.env.agt.drv","num",100);
`uvm_info("test1","env.agt.drv.num is set to 100",UVM_LOW)
endfunction
endclass
class env extends uvm_env;
..
function void build_phase(uvm_phase phase);
super.build_phase(phase);
uvm_config#(int)::set(uvm_root::get(),"uvm_test_top.env.agt.drv","num",99);
`uvm_info("env","env.agt.drv.num is set to 99",UVM_low)
endfunction
endclass
這種情況下最後get的值是99,因set起點都是uvm_top,而build_phase是自頂向下建構,env的set會後發生,會覆寫掉之前test1的set,是以最後值get到99。
是以,在實際使用中,set的第一個參數應盡量使用this,給與不同的set起點(也可以說是權威性)。而在無法得到this指針的情況下(比如top_tb中),使用null(變相設定成uvm_root::get())或者uvm_root::get()。