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

Verilogで「always @(*)」と書く意味として正しいものはどれか。

  1. Aクロックの立ち上がりのたびに実行されるフリップフロップを表す
  2. Bシミュレーションの最初に一度だけ実行される
  3. Cブロックの中で読んでいる信号のどれかが変わるたびに実行される、組み合わせ回路を表す
答えと解説を見る

正解:C. ブロックの中で読んでいる信号のどれかが変わるたびに実行される、組み合わせ回路を表す

alwaysの後の@( )の中はセンシティビティリストと呼ばれ、どの信号が変わったときにブロックを実行するかを指定します。「*」と書くと、ブロックの中で読んでいるすべての信号が自動で並んだことになり、組み合わせ回路を正しく表せます。手で並べると書き漏れが起きやすいので、組み合わせ回路には「@(*)」やSystemVerilogのalways_combを使うのが安全です。

  • A. クロックのエッジを指定するのはposedgeなどです。
  • B. 一度だけ実行されるのはinitialです。
  • C. 正しい。読んでいる信号をすべて自動で並べたのと同じです。
この分野を解く 分野ページへ

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

  1. 組み合わせ回路のつもりで上のように書いた。起こりうる問題として正しいものはどれか。
  2. 組み合わせ回路のつもりで上のように書くと、論理合成で何ができるか。
  3. 上の記述でラッチができてしまう理由と、対策の組み合わせとして正しいものはどれか。
  4. 組み合わせ回路のalwaysブロックで、意図しないラッチを防ぐためによく使われる書き方はどれか。
  5. 次のVerilogの記述のうち、論理合成で回路にならず無視されるもの(シミュレーション用の記述)はどれか。