為了增強uvm環境的可復用性,通過外部的引數配置,在環境在建立元件之前就已經實現資源的配置。這些都是通過uvm機制中的uvm_config_db配置類實現的。
可以實現:
傳遞virtual inte***ce到驗證環境中
傳遞變數值,如int型變數,string,enum型變數
可傳遞控制代碼(object),內含多種變數型別,多個元件變數,打包傳遞
//宣告if
inte***ce uvm_config_if;
logic [31:0] addr;
logic [31:0] data;
logic [ 1:0] op;
endinte***ce
package uvm_config_pkg;
import uvm_pkg::*;
`include "uvm_macros.svh"
//子類控制代碼
class config_obj extends uvm_object;
int comp1_var;
int comp2_var;//定義cog_obj內容,兩個變數var1,var2
`uvm_object_utils(config_obj)
function new(string name = "config_obj");//初始化
super.new(name);
endfunction
endclass
class comp2 extends uvm_component;
int var2;
virtual uvm_config_if vif;
config_obj cfg;
`uvm_component_utils(comp2)
function new(string name = "comp2", uvm_component parent = null);
super.new(name, parent);
var2 = 200;//initial var
endfunction
function void build_phase(uvm_phase phase);
super.build_phase(phase);
if(!uvm_config_db#(virtual uvm_config_if)::get(this, "", "vif", vif))
//如果config_db非空,傳遞config_if型別的指標,從test中get vif到路徑this.vif.
uvm_config_db#(int)::get(this, "", "var2", var2);//變數的傳遞,get var2到this.var2中
uvm_config_db#(config_obj)::get(this, "", "cfg", cfg); //obj的傳遞,封裝兩個變數
endfunction
endclass
class uvm_config_test extends uvm_test;
comp2 c2;//宣告c2
config_obj cfg;//宣告 cfg
`uvm_component_utils(uvm_config_test)
function new(string name = "uvm_config_test", uvm_component parent = null);
super.new(name, parent);
endfunction
function void build_phase(uvm_phase phase);
super.build_phase(phase);
cfg = config_obj::type_id::create("cfg");
cfg.comp2_var = 100;//cfg初始配置為var2=100
uvm_config_db#(config_obj)::set(this, "*", "cfg", cfg);//通過obj傳遞將cfg值更新:100
uvm_config_db#(int)::set(this, "c2", "var2", 10);//通過變數傳遞將var2賦值為10
c2 = comp2::type_id::create("c2", this);//必須先配置再建立例項
endfunction
task run_phase(uvm_phase phase);
super.run_phase(phase);
phase.raise_objection(this);
#1us;
phase.drop_objection(this);
endtask
endclass
endpackage
module uvm_config;
import uvm_pkg::*;
`include "uvm_macros.svh"
import uvm_config_pkg::*;
uvm_config_if if0();
initial begin
uvm_config_db#(virtual uvm_config_if)::set(uvm_root::get(), "uvm_test_top.*", "vif", if0);//介面的傳遞set只在top中可見
run_test(""); // empty test name
endendmodule
config_db內部是通過查詢表方式索引變數值的,在test或top中set入變數值/控制代碼/obj,和當前路徑,在底層元件中通過get(路徑,變數名)的方式成功獲取value。
但是要注意以下幾點
1.傳遞型別必須一致:若定義型別均為父類控制代碼,傳遞的卻是子類控制代碼cfg時,子類控制代碼按照父類控制代碼傳遞了,在元件內get到父類控制代碼型別,卻指向子類物件,此時必須要做型別轉化,將父類控制代碼$cast轉化為子類控制代碼,才能傳遞成功
2.先set,後get,後create
3.*表示通配,如「*comp1」表示當前及以下層次遍歷,「*.comp1」表示當前以下層次。
UVM的config機制(五)
config機制 本質是半個全域性變數 config機制是用來傳遞資料的 比如在case 派生自uvm test 中build phase中可如下配置 uvm config db int set this,env.agent.driver pre num max 100 在driver中的build...
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上。這種模組化...