(join_any,join_noneの注意点)

概要

join_any、join_noneは検証シナリオを記述する場合に大変便利です。
ですが、実はメモリリークにつながる可能性があるため、注意が必要です。
メモリリークは小規模であれば問題になりませんが、長時間や大規模になってくるとシミュレータがメモリ不足で落ちる形になります。
これは、発生してからの追跡が難しくなりがちなので、事前に意識して押さえておくことが重要だと思います。

動作確認

ツール バージョン 結果
NC-Verilog 未確認
VCS-MX 未確認
ModelSim 6.6d(ModelSimAE 11.0sp1) OK
Cver 未確認

テストコード

A,Bいずれかの立ち上がりを検出したら次のステップに進むというコードです。

パタン1

join_anyを抜けた後、doneフラグを1にすることで他方のブロックも抜けれるようにします。
doneフラグを使用しなかった場合、@(posedge ~)の他方のブロックは条件を満たすまでメモリ内に残り続けてしまいます。

module tp;
  bit A=0,B=0;
 
  initial begin
    #100;
    A = 1;
    #100;
    B = 1;
    #100;
    $display($time,"end sim");
    $finish;
  end
 
  initial begin
    bit done = 0;
    fork
      begin
        @(posedge A or done);
        if(done)
          $display($time," A done");
        else
          $display($time," posedge A");
      end
      begin
        @(posedge B or done);
        if(done)
          $display($time," B done");
        else
          $display($time," posedge B");
      end
    join_any
    $display($time," join_any");
    done = 1;
  end
endmodule
 

実行結果を以下に示します。

>vlog -sv test.sv
Model Technology ModelSim ALTERA vlog 6.6d Compiler 2010.11 Nov 2 2010
    • Compiling module tp

Top level modules:
       tp

>vsim tp
Reading C:/altera/11.0sp1/modelsim_ase/tcl/vsim/pref.tcl

# 6.6d

# vsim tp
# Loading sv_std.std
# Loading work.tp
run -all
# 100 posedge A
# 100 join_any
# 100 B done
# 300end sim
# ** Note: $finish : test.sv(11)
# Time: 300 ps Iteration: 0 Instance: /tp




Top > 言語 > verilog > Tips > join_any,join_noneの注意点
link_pdfプラグインはご利用いただけなくなりました。























-

最終更新:2012年02月27日 15:08