ハードウェア記述言語と検証
テストベンチで、回路への入力をクロックの立ち上がりと同じ時刻にブロッキング代入で変えると、問題が起きることがある。主な理由と対策の組み合わせとして正しいものはどれか。
- A回路が変わる前と後のどちらの値を取り込むかが実行の順番で変わる(競合)ため。入力はクロックのエッジから少しずらすか、ノンブロッキング代入で変える
- Bクロックの周波数が自動で下がるため。クロックを速くする
- Cブロッキング代入は、テストベンチでは使えないため。すべてassign文にする
答えと解説を見る
正解:A. 回路が変わる前と後のどちらの値を取り込むかが実行の順番で変わる(競合)ため。入力はクロックのエッジから少しずらすか、ノンブロッキング代入で変える
同じ時刻に、テストベンチが入力を書き換える処理と、回路のフリップフロップが入力を取り込む処理が起こると、シミュレータがどちらを先に実行するかで、取り込まれる値が古い値にも新しい値にもなります。これはシミュレーションの競合(レース)で、シミュレータによって結果が変わることもあります。入力を立ち下がりで変える、少し遅らせる、ノンブロッキング代入やSystemVerilogのクロッキングブロックを使う、などで防ぎます。
- A. 正しい。シミュレーションの競合(レース)を避ける工夫です。
- B. 周波数が変わるわけではありません。
- C. テストベンチでもブロッキング代入は使えます。