ハードウェア記述言語と検証

Verilogのノンブロッキング代入(<=)の動作として正しいものはどれか。

  1. A代入した瞬間に左辺が更新され、次の行ではその新しい値が使われる
  2. B同じタイミングのすべての右辺を先に評価し、その後でまとめて左辺を更新する
  3. C代入の結果を捨てて、何も変更しない
答えと解説を見る

正解:B. 同じタイミングのすべての右辺を先に評価し、その後でまとめて左辺を更新する

ノンブロッキング代入では、クロックのエッジで、すべての<=の右辺をまず古い値のまま評価し、そのあとで一斉に左辺を書き換えます。これは、同じクロックで動く多数のフリップフロップが、エッジの直前の値を同時に取り込む実際の回路と同じ動きです。そのため、クロックで動く順序回路の記述にはノンブロッキング代入を使うのが原則です。

  • A. それはブロッキング代入(=)の動作です。
  • B. 正しい。フリップフロップが一斉に値を取り込む動作と一致します。
  • C. 値は更新されます。
この分野を解く 分野ページへ

ハードウェア記述言語と検証のほかの問題

  1. 上の記述で、クロックの立ち上がりの直前にa=0、b=1だった。立ち上がりの後のaとbの値はどうなるか。
  2. 2段のシフトレジスタのつもりで、上のようにブロッキング代入(=)で書いた。起こる問題として正しいものはどれか。
  3. Verilogで代入の種類を使い分けるときの一般的なガイドラインとして正しいものはどれか。
  4. Verilogで「always @(*)」と書く意味として正しいものはどれか。
  5. 組み合わせ回路のつもりで上のように書いた。起こりうる問題として正しいものはどれか。