ハードウェア記述言語と検証
組み合わせ回路のつもりで上のように書いた。起こりうる問題として正しいものはどれか。
always @(a)
y = a & b;
- Abは回路から取り除かれ、yはaと同じになる
- B合成でエラーになり、回路が作られない
- Cbだけが変わってもシミュレーションではyが更新されず、合成した回路(bが変わればyも変わる)と動きが食い違う
答えと解説を見る
正解:C. bだけが変わってもシミュレーションではyが更新されず、合成した回路(bが変わればyも変わる)と動きが食い違う
シミュレータはセンシティビティリストに書かれた信号の変化でだけブロックを実行するので、bだけが変わったときはyが古いまま残ります。一方、論理合成はリストを見ずにブロックの中身からANDゲートを作るので、実際の回路ではbの変化もyに表れます。シミュレーションで正しく見えても回路が違う動きをする危険な状態です。「@(*)」と書けば防げます。
- A. 合成はANDゲートを作ります。
- B. 多くの合成ツールは警告を出しつつ回路を作ります。
- C. 正しい。センシティビティリストの書き漏れの典型的な問題です。