06. UVMの設定の仕組み

目次

I. 概要


I. 概要

検証環境作成プロセスの build_phase では、コンポーネントのインスタンス化に加えて、構成も不可欠です。

環境の再利用性を検証するために、外部パラメータ設定を通じて、作成するコンポーネントのタイプ、コンポーネント インスタンスの数、コンポーネント間の接続、および動作モードを選択するためのさまざまなパラメータに従って環境を作成できます。コンポーネント。) つまり、コンポーネントを作成する前に、最初にコンポーネントを構成します)

for ループのしきい値、文字列名、確率変数の生成比率など、より詳細な環境調整で設定する必要がある変数は他にもあります。

変数を調整するための再コンパイルと比較して、シミュレーション内の変数設定を通じて環境を変更できればより柔軟であり、UVM の構成メカニズムはそのような利便性を提供します。

UVM は、シミュレーション中に環境制御を実現するために、uvm_config_db 構成クラスといくつかの便利な変数設定メソッドを提供します。uvm_config_db クラスの一般的な使用方法は次のとおりです。

  • 仮想インターフェースを環境に渡す  (SVは設定したインターフェースを経由する)
  • int、string、enum などの単一の変数値を設定します。
  • 設定オブジェクト (config オブジェクト) を環境に渡します

納品形態:

uvm_config_db #(T)::set(uvm_component cntxt, string inst_name, string field_name, T value);
uvm_config_db #(T)::get(cntxt, string inst_name, string field_name, in out T value);

//#(T) 参数类 ,第7章  T是参数类型,可能是上面三种类型的任意一种
// set  从顶层环境中做set
// get  从底层环境中做get
//(uvm_component cntxt 实例, string inst_name 实例名称, string field_name 实例的某一变量, T value 值);

//in out T value  :  get 时要拿出值,所以用in out 

2、インターフェース伝送

インターフェイスの受け渡しは、ハードウェアの世界とソフトウェアの世界を接続するための優れたソリューションとなり得ます。以前の SV 検証モジュールでは、階層インターフェイス インデックス(セット インターフェイス)を介して SV を転送できますが、これはソフトウェア環境のカプセル化と再利用には役立ちません。UVM の uvm_comfig_db は、インターフェイスの転送と取得を完全に分離します。

UVM は、最初に test-"env-" drv を接続するのではなく、インターフェースを drv に直接接続します。 

インターフェイス転送を実装するプロセスでは、次の点に注意する必要があります。

  • インターフェイスの受け渡しは run_test() の前に行う必要があります。build_phase に入る前に、仮想インターフェイスが uvm_config_db に渡されることが保証されます。
  • インターフェースの宣言と仮想インターフェースを区別し、転送処理における型は仮想インターフェース、つまり実際のインターフェースのハンドルである必要があります。
interface intf1;
	logic enable = 0;
endinterface

class comp1 extends uvm_component;
	`uvm_component_utils(comp1)
	virtual intf1 vif;
	...
	function void build_phase(uvm_phase phase);
		if(!uvm_config_db #(virtual intf1)::get(this, "", "vif", vif)) begin		//this指代当前组件comp1,“vif”指的是comp1的一个变量

			`uvm_error("GETVIF", "no virtual interface is assigned")
		end
		`uvm_info("SETVIF", $sformatf("vif.enable is %b before set", vif.enable), UVM_LOW)
		vif.enable = 1;
		`uvm_info("SETVIF", $sformatf("vif.enable is %b after set", vif.enable), UVM_LOW)
	endfunction
endclass

class test1 extends uvm_test;
	`uvm_component_utils(test1)
	comp1 c1;
	...
endclass

intf1 intf();

initial begin
	//第一个参数时传递一个句柄,第二个参数时路径,第三个参数时c1.vif这个变量,第四个参数是那个例化的需要传递的intf
	uvm_config_db #(virtual intf1)::set(uvm_root::get(), "uvm_test_top.c1", "vif", intf);
	run_test("test1");
end

uvm_config_db #(virtual intf1)::get(this, "", "vif", vif) の意味を次の図に示します。


uvm_config_db #(virtual intf1)::set(uvm_root::get(), "uvm_test_top.c1", "vif", intf) の意味を次の図に示します。

250

 set と get のパスと関数の型は一貫している必要があります。

3. 変数の設定

各テストでは、基礎となるコンポーネントの変数を build_phase で構成でき、環境がインスタンス化される前に構成が完了するため、環境は期待どおりに実行できます。

class comp1 extends uvm_component;
	`uvm_component_utils(comp1)
	int vall = 1;           //变量1
	string str1 = "null";   //变量2
	...
	function void build_phase(uvm_phase phase);
		`uvm_info("SETVIF", $sformatf("vall is %d before set", vall), UVM_LOW)
		`uvm_info("SETVIF", $sformatf("str1 is %s before set", str1), UVM_LOW)
		uvm_config_db#(int)::get(this, "", "vall", vall);  
		uvm_config_db#(string)::get(this, "", "str1", str1);  ///
		`uvm_info("SETVIF", $sformatf("vall is %d after set", vall), UVM_LOW)
		`uvm_info("SETVIF", $sformatf("str1 is %s after set", str1), UVM_LOW)
	endfunction
endclass

class test1 extends uvm_test;
	`uvm_component_utils(test1)
	comp1 c1;
	...
	function void build_phase(uvm_phase phase);
		uvm_config_db#(int)::set(this, "c1", "vall", 100);    /
		uvm_config_db#(string)::set(this, "c1", "str1", "comp1");  /
		c1 = comp1::type_id::create("c1", this);
	endfunction
endclass

4、オブジェクトの転送

テスト構成では、構成する必要があるパラメーターが多数あるだけでなく、それらが異なるコンポーネントに属している場合もあります。したがって、非常に多くのレベルの変数に対して上記と同様の変数設定を行うと、より多くのコードが必要となり、エラーが発生しやすく、再利用が容易ではありません。基礎となるコンポーネントの変数が削除された後でも、それらは uvm_config_db を渡すことができません。 ::set( ) を使用して、構成が成功したかどうかを確認します。ただし、各コンポーネントの変数が統合され、最初に uvm_object に配置され、次に集中設定オブジェクトに転送される場合は、環境全体を変更するのが有益です。

class comp1 extends uvm_component;
	`uvm_component_utils(comp1)
	config1 cfg;
	...
	function void build_phase(uvm_phase phase);
		uvm_object tmp;
		uvm_config_db#(uvm_object)::get(this, "", "cfg", tmp);
		void'($cast(cfg, tmp));
		`uvm_info("SETVIF", $sformatf("cfg.vall is %d after get", cfg.vall), UVM_LOW)
		`uvm_info("SETVIF", $sformatf("cfg.str1 is %s after get", cfg.str1), UVM_LOW)
	endfunction
endclass

class test1 extends uvm_test;
	`uvm_component_utils(test1)
	comp1 c1, c2;
	config1 cfg1, cfg2;
	...
	function void build_phase(uvm_phase phase);
		cfg1 = config1::type_id::create("cfg1");
		cfg2 = config1::type_id::create("cfg2");
		cfg1.vall = 30;
		cfg1.str1 = "c1";
		cfg2.vall = 50;
		cfg2.str1 = "c2";
		uvm_config_db#(uvm_object)::set(this, "c1", "cfg", cfg1);
		uvm_config_db#(uvm_object)::set(this, "c2", "cfg", cfg2);
		c1 = comp1::type_id::create("c1", this);
		c2 = comp1::type_id::create("c2", this);
	endfunction
endclass

V. まとめ

  • uvm_config_db::set() を使用する場合は、階層と変数名を使用して、この情報を uvm_pkg の唯一のグローバル変数 uvm_pkg::uvm_resources に入力します。
  • グローバル変数 uvm_resources は、構成リソース情報の格納と解放に使用されます。uvm_resources は、uvm_resource_pool クラスのグローバルに一意なインスタンスです。このインスタンスには、構成情報を格納するための 2 つのリソース配列があります。2 つの配列のうちの 1 つは階層によって名前が付けられ、もう 1 つは型によってインデックス付けされており、これら 2 つの連想配列を通じて、階層を通じて構成された情報を格納できます。
  • 同時に、低レベルのコンポーネントは、レベルまたはタイプを通じて高レベルのコンポーネントから構成情報を取得することもできます。
  • uvm_config_db::get() メソッドを使用する場合、渡されたパラメーターはインデックス レベルを構成し、uvm_resources の既存の構成情報プール内の構成にインデックスを作成します。インデックスに達すると 1 が返され、そうでない場合は 0 が返されます
  • set() メソッドと get() メソッドを使用する場合、渡されるパラメータの型は上から下まで一貫している必要があります。uvm_objectなどのインスタンスの転送では、型が一貫していない場合は、最初に$cast( による型変換を完了する必要があります) )を実行し、型変換されたオブジェクトを変換して動作します。
  • set() および get() メソッドによって渡されるパラメータでは、ワイルドカード * を使用して任意のレベルを表すことができます。
  • モジュール環境で uvm_config_db::set() を使用する場合、渡される最初のパラメータである uvm_component cntxt パラメータは通常、現在のレベルを示すために使用されます。現在のレベルが最高レベルの場合は、null に設定するか、uvm_root::get() に設定して uvm_root のグローバル最上位インスタンスを表すことができます。
  • 設定変数を使用する場合は、必ず最初に uvm_config_db::get() を実行し、正しい設定値を取得してから使用してください。
  • 関連する構成コンポーネントが作成される前に、uvm_config_db::set() メソッドが呼び出されることを確認する必要があります。最初に構成が完了した場合にのみ、関連コンポーネントは構成値を取得し、インスタンス化前に正しくインスタンス化できます。 。
  • uvm_config_db::set() メソッドの最初のパラメータは現在のレベルを使用することを前提として、同じコンポーネントの同じ変数に対して、変数を設定する上位コンポーネントが複数ある場合、上位コンポーネントの設定がコンポーネントは下位レベルのレイヤ設定をオーバーライドしますが、同じレイヤ コンポーネントが変数を複数回設定すると、後の設定が前の設定をオーバーライドします。
  • uvm_config_db::get() メソッドを使用する場合は、uvm_config_db::get() メソッドの構成変数が UVM レポート情報を通じて uvm_config_db から取得されるかどうかを知るなど、デバッグに便利なステートメントを追加します。

おすすめ

転載: blog.csdn.net/Arvin_ing/article/details/127611644