ハードウェア記述言語と検証
上の記述で、selがX(不定)のとき、Verilogのシミュレーションではyにbが選ばれる。この性質が検証で問題になる理由として正しいものはどれか。
always @(*)
if (sel) y = a;
else y = b;
- Ayが必ずXになり、シミュレーションが止まるから
- BselがXのときは、実際のチップでも必ずbが選ばれるから
- CXが「偽」として扱われてbという確定した値が出るので、selが不定という誤りがシミュレーションで見えなくなる
答えと解説を見る
正解:C. Xが「偽」として扱われてbという確定した値が出るので、selが不定という誤りがシミュレーションで見えなくなる
Verilogのif文は、条件がXのときに偽として扱い、else側を実行します。そのためyにはbという確定した値が出て、selが不定だという誤りがシミュレーションで隠れてしまいます。実際の回路ではselは0か1のどちらかで、aが選ばれることもあります。これをX楽観主義と呼び、Xを伝えるような書き方をする、Xを検出するアサーションを入れる、などで対策します。
- A. yはXにならず、bになってしまいます。
- B. 実際のチップではaとbのどちらになるか分かりません。
- C. 正しい。X楽観主義(Xオプティミズム)と呼ばれる問題です。