【問題9】 「クロック同期回路」の設計は難しい?:完全マスター! 電子回路ドリル III(9)
シミュレータを用い、ブロッキング代入とノン・ブロッキング代入の動作の違いについて調査。2つの代入の使い分けのポイントとは?
【問題8】の解答
前回の宿題【問題8】は、“「=」と「=>」の2種類の代入による動作の違いを調べる”という問題でした。皆さん解けましたでしょうか?
解けた方も解けなかった方も答え合わせをして、次項の解説までぜひ読んでみてください。毎週コツコツ問題を解いて、ハードウェア記述言語によるデジタル回路設計の基礎知識を身に付けましょう。
それでは、解答を発表します!
問題8
- “=”の動作は?
答え.ブロッキング代入という……記述の順番に基づき代入を行う - “=>”の動作は?
答え.ノン・ブロッキング代入という……並列に代入を行う
【問題8】の解説
Verilog HDLには「ブロッキング代入(“=”)」と「ノン・ブロッキング代入(“=>”)」の2種類の代入があります。【問題8】はこの2つの代入の動作の違いを調べる問題です。なお、動作の違いを調べるに当たり今回もシミュレータを使用します。
2つの代入の評価を図1に示します。
図1(a)のように、ブロッキング代入は“記述の順番に基づき”代入を行います。その動作は、
- 変数Xに信号Dを代入する。
- 次に変数Yに変数X(すなわち信号Dの値)を代入する。
- 次に変数Zに変数Y(すなわち信号Dの値)を代入する。
のように、順次代入式を評価します。
これに対し、ノン・ブロッキング代入は“並列に”代入を行います。その動作は、
- 変数Xに信号Dを代入する。
- 変数Yに変数Xを代入する。
- 変数Zに変数Yを代入する。
の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文ではノン・ブロッキング代入(“=>”)が望ましい」といえます。
次回までの宿題 ― 【問題9】
Copyright © ITmedia, Inc. All Rights Reserved.