SystemVerilog検証テストプラットフォーム作成ガイド第3章プロセスステートメントとサブルーチン

SystemVerilog在タスクと機能特にパラメータの受け渡しの処理において、コードの記述がより簡単になるように、C言語に近づけるために多くの改善が行われました。

3.1手続き型ステートメント
SystemVerilogは、CおよびC ++の多くの演算子とステートメントを参照します。ここにいくつかの簡単な紹介があります。
1)forループでは、forループでループ変数を定義します。そのアクションのスコープはループの内側に限定されるため、コードの抜け穴を回避するのに役立ちます。
for(int i = 0; i <10; i ++)
2)自動インクリメント/自動デクリメント、++ / –は、プレフィックスまたはサフィックスとして使用できます。
3)識別子。識別子をbeginまたはforkステートメントで使用し、同じラベルを対応するendまたはjoinステートメントに挿入できます。同様に、endmodule、endtask、endfunctionなどのステートメントに識別子を配置することもできます。

initial
	begin:example
		......
	end:example

4)ループ関数は、Verilogと比較して、ループの残りのステートメントをスキップして次のラウンドに直接進むために使用されるcontinueを追加します;ブレークを追加して終了し、ループからジャンプします。

3.2タスク、関数、およびvoid関数
Verilogでは、タスクタスクと関数関数の間に明確な違いがあります。タスクは時間を消費し、関数は時間を消費できませんSystemVerilogは関数呼び出しタスクを許可しますが、fork ... join_noneステートメントによって生成されたスレッドでのみ呼び出すことができます。
ある場合時間はかかりませんSystemVerilogタスクの場合は、戻り値のないvoid関数として定義する必要があります。

function void print_state(........);
	......
endfunction

3.3サブプログラムのbegin ... endの削除
SystemVerilogでは、キーワードtask ... endtaskおよびfunction ... endfunctionでこれらのサブプログラムの境界を定義できるため、begin ... endはオプションになります。

3.4サブルーチンパラメータ
SystemVerilogのサブルーチンに対する多くの改善により、パラメータの宣言がより便利になり、パラメータの受け渡し方法も拡張されました。
3.4.1
VerilogのCスタイルのサブルーチンパラメータ、一部のパラメータ方向宣言用と型宣言用の2つの宣言を作成します

task my_task;
	output [31:0] x;
	reg   [31:0] x;
	input    y;
	......
endtask

SystemVerilogでは、簡潔なC言語スタイルを採用し、型と方向をマージし、最初に宣言することができます。共通のデータ型ロジックを使用する必要があることに注意してください

task my_task(output logic[31:0] x,
					input logic y);
			......
endtask

3.4.2
サブプログラムパラメータのパラメータ指示デフォルト値のタイプと方向は1ビット幅のロジック入力です。

task T3;
	input a,b;
	......
endtask

パラメーターaおよびbは、1ビット幅のロジック入力です。
3.4.3高度なパラメータータイプ
Verilogはパラメーターを非常に簡単に処理します。サブプログラムの先頭でローカル変数にinput / inoutの値をコピーし、サブプログラムの終了時にoutput / inoutの値をコピーします。
SystemVerilogでは、パラメーターを渡す方法を、コピーではなく参照として指定できます。採用するrefパラメータ型は配列をサブルーチンに渡すことができます

function void print_check(const ref bit[31:0] a[]);
	bit [31:0] checksum=0;
	for(int i=0; i<a.size();i++)
	check^=a[i];
endfunction

refパラメータは、自動ストレージを備えたサブプログラムでのみ使用できます。プログラムまたはモジュールの自動属性を指定すると、サブプログラム全体が自動的に保管されます。
const修飾子は、サブルーチンが配列の値を変更できないことを決定します。
タスクで変数を変更でき、変更の結果は常に呼び出し元の関数に表示されます
。3.4.4パラメータのデフォルト値
SystemVerilogでは、パラメータのデフォルト値を指定できます。呼び出し中にパラメータを指定しない場合、デフォルト値が使用されます。

function void print_check(ref bit[31:0] a[],
										input bit[31:0] low=0,
										input int high =-1);
	bit[31:0] check=0;
	if (high=-1||high>a.size())
	high=a.size()-1;
	for(int i=0;i<=high;i++)
		checksum+=a[i];
endfunction

関数を呼び出す場合、いくつかの方法があります。

print_check(a);//a[0:size()-1]中所有元素的校验和——缺省情况
print_check(a,2,4);//a[2:4]中所有元素的校验和
print_check(a,,1);//a[0:1]中所有元素的校验和
print_check(a,2);//a[2:size()-1]从2开始
print_check( );//编译错误:a没有缺省值

3.4.5名前によるパラメーターの受け渡し
モジュールのポートと同様に、ポートのような構文を使用してサブプログラムのパラメーター名を指定することにより、サブセットを指定できます。

task many(input int a=1,b=2,c=3,d=4);
	.......
endtask

関数呼び出しの形式:

many(6,7,8,9); //6 7 8 9指定所有值
many();//采用1,2,3,4使用缺省值
many(.c(5));//1,2,5,4只指定c
many(,6,.d(8));//1,6,3,8混合方式

3.4.6一般的なコードエラー
デフォルトでは、パラメーターのタイプは前のパラメーターと同じであり、最初のパラメーターのデフォルトのタイプは単一ビット入力です。

task sticky(int a,b);//a、b为两个整型的输入。
task sticky(ref int array[50],int a,b);//默认a、b的方向为ref 错误的方向类型
task sticky(ref int array[50],input int a, b);//a、b为整型输入

3.5サブルーチンの
リターン3.5.1リターンステートメント
SystemVerilogは、サブルーチンのフロー制御をより便利にするリターンステートメントを追加します。リターンを実行すると、以下のコードを実行せずに直接リターンできます。
3.5.2関数から配列を返す
SystemVerilogでは、関数はさまざまな方法で配列を返すことができます。
1)配列型を定義し、関数宣言でその型を使用します。

typedef  int fixed_array5[5];
fixed_array5  f5;

function fixed_array5 init(int start);
	foreach(init[i])
		init[i]=i+start;
endfunction

initial 
begin
	f5=init(5);
	foreach(f5[i])
end

2)配列パラメーターを参照で渡します。最も簡単な方法は、refパラメーターの形式で配列を関数に渡すことです。明らかに、この方法は理解の最良の形です。

function void init(ref int f[5], input int start);
	foreach(f[i])
		f[i]=i+start;
endfunction
int fa[5];
initial
begin
	init(fa,5);
	foreach(fa[i])
end

3.6ローカルデータストレージ
ハードウェアエンジニアへの注入の場合、特にサブプログラムパラメータの場合、Verilog言語で記述されたすべてのオブジェクトは静的であり、ローカル変数は他のプログラミング言語ではなく固定された場所に格納されます。スタック領域内。再帰的サブプログラムなどの動的コードに対応するチップ実装はありませんが、検証プロセスでは、これらの動的中間結果が重要な影響を与えるため、それらをどのようにモデル化できますか?
3.6.1
Verilogでの自動ストレージ複数の場所で同じタスクを呼び出すタスク内のローカル変数は共有静的ストレージ領域を使用するため、これらのローカル変数は異なるスレッド間で使用されます。このとき、タスク、関数、モジュールを指定して自動ストレージを使用することで、スタック領域にローカル変数を強制的に保存できます。
SystemVerilogでは、モジュールおよびプログラムブロックのサブルーチンは、デフォルトで静的ストレージを使用しますが、自動ストレージを使用する場合は、自動キーワードをプログラムステートメントに追加する必要があります。この場合、各呼び出しは異なるストレージスペースを使用します

program automatic test;

3.6.2変数の初期化
一定期間のシミュレーションの後で、次の操作を実行したいと考えています。2つの例を挙げて、全員に変数の初期化を体験させてください。

logic[7:0] local_addr=addr<<2;

静的変数の場合、シミュレーションの開始時に初期値が含まれます。自動的に保存するように変更できます。

logic[7:0] local_addr;
local_addr=addr<<2;

問題の要件を満たすことができるように、宣言と初期化を分離します。

3.7時間の値
3.7.1時間の単位と精度の説明
(1)メソッド1、 'timescale
(2)メソッド2、timeunit、timeprecision
3.7.2時間パラメーター
a。$ Timeformat(Time scale(-9はnsを表し、-12はps)、小数点の後のデータ精度、時間値の後の接尾文字、表示される値の最小幅)
$ timeformat(-9,3、 "ns"、8); //1.000ns
b。
モジュールの時間精度に応じた$時間丸めが必要な整数。
c。$ realtime
は、小数部を含む完全な実数です。

`timescale 1ps/1ps
module ps;
	initial 
	begin
		real rdelay=800fs;    //   0.8ps 以0.800存储
		time tdelay=800fs;   // 1ps舍入后得到1
		$timeformat(-15,0,“fs”,5);
		#rdelay                    //1ps,在作延时时,去时间精度1ps
		$display("%t",rdelay);  // "800fs"
		#tdelay                     //1ps 再次延时1ps
		$display("%t",tdelay);  // "1000fs"
	end
endmodule
元の記事を38件公開 29のような 10,000以上の訪問

おすすめ

転載: blog.csdn.net/weixin_45270982/article/details/97513763