automaticを意識する。

今回の記事は、Verilog-2001から追加されている task/functionに対しての
automatic」についてです。

試したソースコードがこちら。
 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:%t, task output value = %d, a value = %d", $time, seq1_data ,a);
11|    #30;
12|    task_automatic(2, seq1_data);
13|    $display("--- Automatic::time:%t, 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:%t, task output value = %d, a value = %d", $time, seq2_data ,a);
21|    #30;
22|    task_automatic(100, seq2_data);
23|    $display("--- Automatic::time:%t, 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|    reg [31:0]   tmp;
32|    begin
33|      tmp     = indata*10;
34|      outdata = indata*10;
35|      $display("--- Static   ::time:%t, 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|    reg [31:0]   tmp;
45|    begin
46|      tmp     = indata*10;
47|      outdata = indata*10;
48|      $display("--- Automatic::time:%t, Call Static Task:tmp value = %d", $time, tmp);
49|      #10;
50|      a = tmp;
51|    end
52|  endtask
53|
54|endmodule

実行結果がこちらになります。
verilog_automatic.png

「automatic」のtaskは、同じ時間にコールされてもtmp, outputの値が異なりますが、
「static」の場合には後からコールされた値に上書きされているのがわかると思います。

ということで、「automatic」を意識して使うことで色々出来ますよ。
っというお話でした。
関連記事

コメントの投稿

非公開コメント

プロフィール

Kocha

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

カレンダー
05 | 2017/06 | 07
- - - - 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 -
カテゴリ
OVP (4)
最新記事
最新コメント
アーカイブ
リンク
Twitter
アクセス人数