シミュレータを用い、ブロッキング代入とノン・ブロッキング代入の動作の違いについて調査。2つの代入の使い分けのポイントとは?
前回の宿題【問題8】は、“「=」と「=>」の2種類の代入による動作の違いを調べる”という問題でした。皆さん解けましたでしょうか?
解けた方も解けなかった方も答え合わせをして、次項の解説までぜひ読んでみてください。毎週コツコツ問題を解いて、ハードウェア記述言語によるデジタル回路設計の基礎知識を身に付けましょう。
それでは、解答を発表します!
Verilog HDLには「ブロッキング代入(“=”)」と「ノン・ブロッキング代入(“=>”)」の2種類の代入があります。【問題8】はこの2つの代入の動作の違いを調べる問題です。なお、動作の違いを調べるに当たり今回もシミュレータを使用します。
2つの代入の評価を図1に示します。
図1(a)のように、ブロッキング代入は“記述の順番に基づき”代入を行います。その動作は、
のように、順次代入式を評価します。
これに対し、ノン・ブロッキング代入は“並列に”代入を行います。その動作は、
の3つの代入が同時に行われるので、変数Yには信号Dを代入する以前の変数Xの値が、変数Zには変数Xを代入する以前の変数Yの値が代入されます。
それでは、以下のテスト・ベンチ(dff_test.v)で実際にシミュレートし、結果を確認してみましょう。
module dff_test; reg CLK, D; wire X, Y, Z; dff i0(CLK, D, X, Y, Z); always #5 CLK = ~CLK; initial begin CLK = 0; D = 0; #30 D = 1; #50 D = 0; #30 D = 1; #50 D = 0; #30 $finish; end initial begin $monitor("CLK=%d, D=%d, X=%d, Y=%d, Z=%d", CLK, D, X, Y, Z); $dumpfile("dump.vcd"); $dumpvars(0, dff_test); end endmodule
ブロッキング代入のシミュレーション結果は図2のとおりです。ご覧のとおり、クロックCLKの立ち上がりで変数X、Y、Zに信号Dの値が同時に保持されます。
一方、ノン・ブロッキング代入のシミュレーション結果は図3のとおりです。今度は1クロックずつ遅れて変数X、Y、Zに値が保持されます。まるでシフト・レジスタのようですね。
では、この2つの代入をどのように使い分けたらよいのでしょうか?
コンピュータのプログラム言語は記述された順番に従って文を評価しますが、「電子回路はクロックに同期して並行動作する」ものです。assign文では“=”しか使えませんが、「always文ではノン・ブロッキング代入(“=>”)が望ましい」といえます。
Copyright © ITmedia, Inc. All Rights Reserved.