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

組み合わせ回路のつもりで上のように書いた。起こりうる問題として正しいものはどれか。

always @(a)
    y = a & b;
  1. Abは回路から取り除かれ、yはaと同じになる
  2. B合成でエラーになり、回路が作られない
  3. Cbだけが変わってもシミュレーションではyが更新されず、合成した回路(bが変わればyも変わる)と動きが食い違う
答えと解説を見る

正解:C. bだけが変わってもシミュレーションではyが更新されず、合成した回路(bが変わればyも変わる)と動きが食い違う

シミュレータはセンシティビティリストに書かれた信号の変化でだけブロックを実行するので、bだけが変わったときはyが古いまま残ります。一方、論理合成はリストを見ずにブロックの中身からANDゲートを作るので、実際の回路ではbの変化もyに表れます。シミュレーションで正しく見えても回路が違う動きをする危険な状態です。「@(*)」と書けば防げます。

  • A. 合成はANDゲートを作ります。
  • B. 多くの合成ツールは警告を出しつつ回路を作ります。
  • C. 正しい。センシティビティリストの書き漏れの典型的な問題です。
この分野を解く 分野ページへ

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

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