設計検証マシンを実行するには多くのコードを記述する必要があり、そのほとんどはタスクと関数で使用されます。Systemverilogはこの点に関して多くの改善を加え、C言語に近づけているため、特にパラメーター転送の処理において、コードの記述がより簡単になります。
- Systemverilogでは、プロセスブロックとそのメソッドはドメインごとに分けられ、ハードウェアとソフトウェアの部分に分けられます。
関数パラメータタイプのテスト問題は次のとおりです。
typedef struct{
bit [1:0] cmd;
bit [7:0] addr;
bit [31:0] data;
} trans;
function automatic void op_copy(trans t,trans s);
t = s;
endfunction
initial begin
trans s;
trans t;
s.cmd = 'h1;
s.addr = 'h10;
s.data = 'h100;
op_copy(t,s);
t.cmd = 'h2;
end
質問:tの3つのメンバー変数{cmd、addr、data}の最終的な値は何ですか?
{'h2、' h0、 'h0}
関数パラメーターにより、デフォルトの方向が入力されます。ここでは、trans変数は入力変数と見なされます。したがって、代入関数はop_copy関数を呼び出すことで実現され、出力値の方向が決まらないため、結果は0になります。
- systemverilogでは、ライフサイクルを自動と静的に分けます。
-
静的変数と動的変数のスコープ設計の問題は次のとおりです。
-
function automatic int auto_cnt(input a); int cnt = 0; cnt +=a; return cnt; endfunction function static int auto_cnt(input a); static int cnt = 0; cnt +=a; return cnt; endfunction function int auto_cnt(input a); static int cnt = 0; cnt +=a; return cnt; endfunction initial begin $display("@1 auto_cnt = %0d",auto_cnt(1)); $display("@2 auto_cnt = %0d",auto_cnt(1)); $display("@1 auto_cnt = %0d",static_cnt(1)); $display("@2 auto_cnt = %0d",static_cnt(1)); $display("@1 def_cnt = %0d",def_cnt (1)); $display("@2 def_cnt = %0d",def_cnt (1)); end
解決策:最初の関数で、自動として定義されている場合、その内容はすべて動的変数です。したがって、各呼び出しの後、元の値は0に復元されます。
-
2番目の関数では、静的として定義されている場合、その内容はすべて静的変数です。したがって、呼び出しのたびに増加します。
-
3番目の関数の場合、モジュール内のすべての関数はデフォルトで静的関数であり、関数内の変数は静的変数です。ただし、ほとんどの場合、モジュールの関数が動的な関数であることを望みます。これは、ソフトウェア要件により一致しています。
-