(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
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
最終更新:2012年02月27日 15:08