スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

staticとautomaticを明確に。

前回の「automaticを意識する。」の続きです。
今回はSystemVerilogにて明示的に追加された「static」を含めてみました。

試したソースコードがこちらです。
static task内には明示的にautomatic宣言した変数を。
逆にautomatic task内には明示的にstatic宣言した変数を定義しています。
 1|module tb;
 2|
 3|  reg[31:0] a;
 4|  reg[31:0] seq1_data;
 5|  reg[31:0] seq2_data;
 6| 
 7|  initial begin
 8|    #10;
 9|    task_static(2, seq1_data);
10|    $display("--- Static   ::time:%3t, task output value = %d, a value = %d", $time, seq1_data ,a);
11|    #30;
12|    task_automatic(2, seq1_data);
13|    $display("--- Automatic::time:%3t, task output value = %d, a value = %d", $time, seq1_data ,a);
14|    #10;
15|  end
16| 
17|  initial begin
18|    #10;
19|    task_static(100, seq2_data);
20|    $display("--- Static   ::time:%3t, task output value = %d, a value = %d", $time, seq2_data ,a);
21|    #30;
22|    task_automatic(100, seq2_data);
23|    $display("--- Automatic::time:%3t, task output value = %d, a value = %d", $time, seq2_data ,a);
24|    #100;
25|    $finish(2);
26|  end
27| 
28|  task task_static;
29|    input[31:0]  indata;
30|    output[31:0] outdata;
31|    automatic reg [31:0] tmp;
32|    begin
33|      tmp     = indata*10;
34|      outdata = indata*10;
35|      $display("--- Static   ::time:%3t, Call Static Task:tmp value = %d", $time, tmp);
36|      #10;
37|      a = tmp;
38|    end
39|  endtask
40|
41|  task automatic task_automatic;
42|    input[31:0]  indata;
43|    output[31:0] outdata;
44|    static reg [31:0] tmp;
45|    begin
46|      tmp     = indata*10;
47|      outdata = indata*10;
48|      $display("--- Automatic::time:%3t, Call Static Task:tmp value = %d", $time, tmp);
49|      #10;
50|      a = tmp;
51|    end
52|  endtask
53|
54|endmodule
実行結果がこちらになります。
sv_static_automatic.png

前回の結果との差分は、赤枠で囲った部分になります。
この様に変数に対しても明示的に宣言出来るようになりました。
関連記事

コメントの投稿

非公開コメント

Re: No title

> 興味深い試みで、とても参考になりました。
>
> これはtaskを実行後も、staticな変数は保持されるということですね。
>
> SystemVerilogはガベージコレクションが実装されていますが、
> staticな変数は、initial begin~end後に消滅するということなんでしょうか?
勉強中なので、明確な答えというより個人的解釈ですが、
task実行後も保持されるという意見に対して、
「C/C++とのstatic宣言とは異なると思ってます。」

Q. staticな変数は、initial begin~end後に消滅するか?
「task/function動作なので、VerilogHDLの動作準拠になるのではないかと思います。(私はよくわかりません)
 new/deleteを明確的に使ってないのでなんとも。。。」

一応、ブログ内容の補足を。
 VerilogHDL-2001より以前は、task/function内の内部変数(output変数も含む)は
 複数呼び出しを行うと、最後の呼び出し処理した値になる。
 これが「static」な動作という印象です。
 C/C++でいうと同じメモリ領域を操作しているイメージ。

 VerilogHDL-2001より「automatic」が追加されて、task/function内の内部変数(output変数も含む)が
 すべて「automatic」宣言されたことを意味する。
 つまり、C/C++でいうと個別のメモリ領域を操作しているイメージ。
 そのため、各呼び出し処理に応じた値となる。

 そして、SystemVerilogでは各変数ごとに
 (VerilogHDL-2001ではtask/function単位でしか指定できなかった)
 「static」「automatic」を指定出来るようになってます。
 これが、シミュレーション時のメモリ領域にどう影響するかは
 現段階ではわかりません。すいません。

以上です。
プロフィール

Kocha

Author:Kocha
なんでもチャレンジ!(^o^)/
E-mail
github:Kocha
イベントカレンダー

カレンダー
09 | 2017/10 | 11
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -
カテゴリ
OVP (4)
最新記事
最新コメント
アーカイブ
リンク
Twitter
アクセス人数
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。