uvm的config機制舉例

2021-10-05 23:29:16 字數 3038 閱讀 3514

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