5

次のようなifステートメントがある場合:

if(risingEdge && cnt == 3'b111)
begin
  ...
end

立ち上がりエッジが真でない場合、cntをチェックしますか?

これはHDLの内部でも問題になりますか?

4

2 に答える 2

6

シミュレーションでは、短絡した式が評価されるかどうかは定義されていません。上記の例では違いはありませんが、右側に関数呼び出しがある場合、未定義の副作用の問題が発生する可能性があります。

StuartSutherlandとDonMillsによる「VerilogとSystemVerilogのGotchas:101の一般的なコーディングエラーとそれらを回避する方法」のGotcha#52を参照してください。

于 2010-07-11T21:27:15.017 に答える
3

HDLで重要かどうかという点では、合成時に重要かどうかをお伺いしていると思います。簡単な答えはそうなるということです。たとえば、次のコードは合成可能なSystemVerilogです。

if(risingEdge && cnt++ == 3'b111)
begin
  ...
end

Verilog(SVではない)では、ポストインクリメントを、同じことを示すためにモジュール変数に他の割り当てを持つVerilog関数に置き換えることができます。そうです、それは関連する質問です。

Paul Rは一般的に正しいです、そしてSutherlandリファレンスは素晴らしいものです(それらのGotchasで説明されているようなたくさんの良いもの)。ただし、参考までに、少なくとも仕様に関する限り、これはSystemVerilogで変更されています。Verilogは、短絡演算が実行される場合と実行されない場合があることを指定していますが、SVは、実装が短絡オペランド(C ++、Javaなどと同様)を評価しないことを示すことにより、これを明確にします。興味がある場合は、IEEE-1800-2009セクション11.3.5を参照してください。これは素晴らしいことですが、SV仕様を順守した実績は、すべてのツールプロバイダーで優れているわけではないため、SVで信頼する場合は注意が必要です。

于 2010-10-03T14:41:14.483 に答える