04. UVMコア基本クラス

目次

1 つ目は、uvm_object クラスです。

 2. ドメインの自動化

3、コピーコピー

4番目、比較する

5、プリントプリント

6. 梱包と開梱pack&unpack


1.uvm_objectクラス

  • UVM のクラスは最初は uvm_void ルート クラス (ルート クラス) から継承されますが、実際にはこのクラスにはメンバー変数とメソッドがありません。
  • uvm_void は単なる仮想クラスであり、将来そのサブクラスが開発されるのを待っています。uvm_void から継承されたサブクラスには 2 つのクラスがあり、1 つは uvm_object クラス、もう 1 つは uvm_port_base クラスです。
  • UVM のクラス ライブラリ マップでは、uvm_port_base から継承されたトランザクション インターフェイス クラスを除き、他のすべてのクラスが uvm_object クラスから段階的に継承されます。
  • uvm_object のコア メソッドは、主に、コピー、クローン、比較、印刷、パック/アンパックなどのデータ操作に関連するサービスを提供します。

 2. ドメインの自動化  

         ドメイン: クラスのメンバー変数

  • UVM では、ドメイン オートメーションを通じて、ユーザーが UVM クラスの登録中にオブジェクトのコピー、クローン、印刷などの操作に参加するメンバー変数を宣言できるようになります。
  • ドメイン自動化により、カスタム メソッドを実装せずに、uvm_object によって提供されるいくつかの事前定義メソッドを使用することが非常に便利になります。
  • ドメイン オートメーションで一般的に使用されるマクロを理解した後、UVM クラス (`uvm_{component,object}_utils) を登録するときに、どのメンバー変数も対応するドメイン リストに配置され、後で使用できるようにするかを考慮する必要があります。ドメイン メソッドは、自動実装の基礎を提供します。
class box extends uvm_object;
	int volume = 120;        //int类型
	color_t color = WHITE;   //枚举类型
	string name = "box";     //string类型

	`uvm_object_utils_begin(box)
		//*****域的自动化的声明*****
		`uvm_field_int(volume, UVM_ALL_ON)
		`uvm_field_enum(color_t, color, UVM_ALL_ON)
		`uvm_field_string(name, UVM_ALL_ON)
	`uvm_object_utils_end
	...
endclass

box b1, b2;

initial begin
	b1 = new("box1");
	b1.volume = 80;
	b1.color = BLACK;
	b2 = new();
	b2.copy(b1);		//copy会把b1的成员变量也拷贝给b2,copy方法是UVM自动实现的,前提是做域的自动化声明       SV中copy方法是自己实现的,而UVM中是自动实现的
	b1.name = "box2";
end

3、コピーコピー

UVM のデータ操作では、copy はデフォルトでオブジェクトがすでに作成されているため、データをコピーするだけで済みます。一方、cloneは自動的にオブジェクトを作成してソース オブジェクトのデータをコピーし、ターゲット オブジェクト ハンドルを返します。コピーとクローンの両方でデータをコピーする必要があります。コピーする場合、デフォルトはディープコピーです。つまり、copy() と do_copy() が実行されます。

class ball extends uvm_object;
	int diameter = 10;
	color_t color = RED;
	`uvm_object_utils_begin(ball)
		`uvm_field_int(diameter, UVM_DEFAULT)
		`uvm_field_enum(color_t, color, UVM_NOCOPY)
	`uvm_object_utils_end
	...
	function void do_copy(uvm_object rhs);
		ball b;
		$cast(b, rhs);
		$display("ball::do_copy entered...");
		if(b.diameter <= 20) begin
			diameter = 20;
		end
	endfunction
endclass

class box extends uvm_object;
	int volume = 120;
	color_t color = WHITE;
	string name = "box";
	ball b;
	`uvm_object_utils_begin(box)
		`uvm_field_int(volume, UVM_ALL_ON)
		`uvm_field_enum(color_t, color, UVM_ALL_ON)
		`uvm_field_string(name, UVM_ALL_ON)
		`uvm_field_object(b, UVM_ALL_ON)		//深拷贝
	`uvm_object_utils_end
	...
endclass

box b1, b2;

initial begin
	b1 = new("box1");
	b1.volume = 80;
	b1.color = BLACK;
	b2 = new();
	b2.copy(b1);
	b1.name = "box2";
	$display("%s", b1.sprint());
	$display("%s", b2.sprint());
end

4番目、比較する

function bit compare(uvm_object rhs, uvm_comparer comparer=null);

デフォルトでは、比較用の追加構成を行わない場合は、compare() メソッドを呼び出すときに 2 番目のパラメーターを省略できます。つまり、デフォルトの比較構成を使用します。比較方法は、多くの場合、カスタム データに加えて、ジェネレーターから生成されたトランザクション (データ クラス) とデザイン出力でキャプチャされたトランザクション (データ クラス) など、同じタイプであれば 2 つのデータ クラスで実行されます。比較 さらに、uvm_object::compare() 関数を直接使用して、データ比較とメッセージ出力を実現することもできます。
 

class box extends uvm_object;
	int volume = 120;
	color_t color = WHITE;
	string name = "box";
	ball b;
	`uvm_object_utils_begin(box)
		`uvm_field_int(volume, UVM_ALL_ON)
		`uvm_field_enum(color_t, color, UVM_ALL_ON)
		`uvm_field_string(name, UVM_ALL_ON)
	`uvm_object_utils_end
	...
endclass

box b1, b2;

initial begin
	b1 = new("box1");
	b1.volume = 80;
	b1.color = BLACK;
	b2 = new("box2");
	b2.volume = 90;
	if(!b2.compare(b1)) begin
		`uvm_info("COMPARE", "b2 compared with b1 failure", UVM_LOW)
	end
	else begin
		`uvm_info("COMPARE", "b2 compared with b1 success", UVM_LOW)
	end
end

上記の 2 つのオブジェクト比較では、各自動フィールドが比較されるため、compare() 関数が実行されると、組み込みの比較メソッドも比較エラーを出力します。デフォルトのコンパレータ、つまり uvm_package::UVM_default_comparer の最大出力エラー比較情報は 1 です。これは、比較エラーが発生した場合、それ以降の比較は実行されないことを意味します。実際、データ操作構成オブジェクトがパラメーターとして指定されていない場合、uvm_object によって使用されるメソッド Compare()、print()、および Pack() は、uvm_pkg でインスタンス化されたグローバル データ操作構成メンバーを使用します。
 

5、プリントプリント

印刷メソッドは、開発とデバッグを容易にするためにコア基本クラスによって提供される関数です。フィールドの自動化により、uvm_object::print() 関数が呼び出されたときに、宣言後の各フィールドが自動的に印刷されます。シミュレーションにブレークポイントを設定してステップバイステップでデバッグする場合と比較して、印刷はシミュレーションを継続できるという利点があり、最終レビュー時に実行の軌跡とロジックを全体的な観点から理解できるという利点があります。実行プロセス。
 

class box extends uvm_object;
	int volume = 120;
	color_t color = WHITE;
	string name = "box";
	ball b;
	`uvm_object_utils_begin(box)
		`uvm_field_int(volume, UVM_ALL_ON)
		`uvm_field_enum(color_t, color, UVM_ALL_ON)
		`uvm_field_string(name, UVM_ALL_ON)
	`uvm_object_utils_end
	...
endclass

box b1;
uvm_table_printer local_printer;
initial begin 
	b1 = new("box1");
	local_printer = new();
	$display("default table printer format");
	b1.print();
	$display("default line printer format");
	uvm_default_printer = uvm_default_line_printer;
	b1.print();
	$display("default tree printer format");
	uvm_default_printer = uvm_default_tree_printer;
	b1.print();
	$display("customized printer format");
	local_printer.knobs.full_name = 1;
	b1.print(local_printer);
end

6. 梱包と開梱pack&unpack

function int pack(ref bit bitstream[], input uvm_packer packer=null);

function int unpack(ref bit bitstream[], input uvm_packer packer=null);

パックは、自動的に宣言されたフィールド (スカラー) をビット ストリームにパックすることです。つまり、分散したデータをビット データ文字列に編成します。これは、構造体パックの方法に似ていますが、データ スペースとデータ スペースを最大限に活用できます。データ転送やハードウェア間の比較などの通信が容易になります。
アンパックとは、シリアルデータを元のドメインに解凍することであり、ハードウェア側からシリアルデータを受け取り検証後、ソフトウェア側のオブジェクト内の対応するメンバ変数に戻す場合に適した操作です。
 

box b1, b2;
bit packed_bits[];
initial begin 
	b1 = new("box1");
	b2 = new("box2");
	b1.volume = 100;
	b1.height = 40;
	b1.color = RED;
	b1.print();
	b1.pack(packed_bits);
	$display("packed bits stream size is %d\n", packed_bits.size());
	b2.unpack(packed_bits);
	b2.print();
end

おすすめ

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