UVM的config機制(五)

2021-07-27 21:01:58 字數 3302 閱讀 8489

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上。這種模組化...