config機制
本質是半個全域性變數
config機制是用來傳遞資料的
比如在case(派生自uvm_test)中build_phase中可如下配置:
uvm_config_db#(int)::set(this,」env.agent.driver」,」pre_num_max」,100);
在driver中的build_phase中設定為:
uvm_config_db#(int)::get(this,」」,」pre_num_max」,pre_num_max);
set中的第乙個引數:說明哪個component對pre_num_max進行了設定,一般是this
第二個引數:從呼叫uvm_config_db::set的地方看下去,要設定的變數所在的路徑
第三個引數:表示乙個記號,說明這個值給driver的哪個變數
第四個引數:要設定的值
get中的乙個引數一般也是this
第二個引數填寫空的字串
第三個引數:和set中的第三個引數匹配起來
第四個引數:要設定的變數
只要保證第三個引數一致即可
省略get的config
當要傳遞多個變數時可以使用field_automation機制將get的變數註冊。
class mac_driver extends uvm_driver#(mac_transaction);
int pre_num_max;
…….
uvm_component_utils_begin(mac_driver)
uvm_field_int(pre_num_max,uvm_all_on)
…….
`uvm_component_utils_end
…… endclass
跨層次的多重set(set幾次,get一次):層次越高,set的優先順序越高
同一層次的多重set:處於同一層次時,時間優先
聚合config變數::
當涉及到要配置的引數成百上千,則可以考慮將所有變數放在專門的類中實現:
class iconfig extends uvm_object;
rand int var1;
…….
rand int var10000;
constraint default_cons
uvm_object_utils_begin(iconfig)
uvm_field_int(var1,uvm_all_on)
……….
`uvm_object_utils_end
endclass
在base_test中則這樣寫:
class base_test extends uvm_test;
iconfig cfg;
function void build_phase(uvm_phase phase);
super.build_phase(phase);
cfg = iconfig::type_id::create(「cfg」);
uvm_config_db#(iconfig)::set(this,:env_agent.driver」,」cfg」,cfg);
……..
endfunction
endclass
這樣省略了大多數set語句,但在相應的driver中則需要這樣寫:
class mac_driver extens uvm_driver#(mac_transaction);
iconfig cfg;
uvm_component_utils_begin(mac_driver)
uvm_field_object(cfg,uvm_all_on | uvm_reference)
`uvm_component_utils_end
extern task main_phase(uvm_phase phase);
endclass
task mac_driver::main_phase(uvm_phase phase);
super.main_phase(phase);
while(1) begin
seq_item_port.get_next_item(req);
pre_num = $urand_range(cfg.pre_num_min,cfg.pre_num_max);
…. end
endtask
如果需要在某個case中改變某個變數值,則可以:
class case100 extends base_test;
function void build_phase(uvm_phase phase);
super.build_phase(phase);
cfg.pre_num_max = 100;
cfg.pre_num_min = 8;
…. endfunction
enclass
實時的改變config值
有時候,當執行到dut的某一時刻,需要改變驗證平台的某些配置引數。這種情況可以通過virtual sequence的方式實現
class vsequencer extends uvm_sequencer;
iconfig;
…….
endclass
class base_test extends uvm_test;
iconfig cfg;
vsequencer vsqr;
function void build_phase(uvm_phase phase);
super.build_phase(phase);
cfg = iconfig::type_id::create(「cfg」);
vsqr = vsequencer::type_id::create(「vsqr」,this);
vsqr.cfg = this.cfg;
…. endfunction
endclass
class vseq_extends uvm_sequence;
uvm_object_utils(vseq)
uvm_declare_p_sequencer(vsequencer)
task body();
…… p_sequencer.cfg.pre_num_max=99;
…..
endtask
endclass
uvm的config機制舉例
為了增強uvm環境的可復用性,通過外部的引數配置,在環境在建立元件之前就已經實現資源的配置。這些都是通過uvm機制中的uvm config db配置類實現的。可以實現 傳遞virtual inte ce到驗證環境中 傳遞變數值,如int型變數,string,enum型變數 可傳遞控制代碼 objec...
UVM的factory機制(二)
factory機制 1 uvm強烈推薦使用uvm component utils或者uvm object utils巨集來註冊。用法 class a extends uvm component uvm component utils a endclass 建立乙個a的例項如下 a a a a typ...
factory 實用的UVM機制
本文 uvm鼓勵工程師建立模組化 可復用的測試平台。uvm通過tlm介面,把乙個元件及其他與之相連的元件隔離開來,以此實現模組化。只要transaction型別相同,模組化的功能允許sequence 連線到任何適配的driver上。也允許多種覆蓋率收集器通過分析介面連線到monitor上。這種模組化...