Verilog 関数ではノンブロッキング代入の使用が許可されていないことを読みました。誰もこれについてもっともらしい説明を提案できますか?
2 に答える
IEEE Std for Verilog (1364-2001) のセクション「10.3.4 Function rules」には、次のように記載されています。
関数には、ノンブロッキング代入があってはなりません。
1800-2009 IEEE Std では、これについて詳しく説明しています。
関数は遅延なく実行されます。したがって、関数を呼び出すプロセスはすぐに戻ります。ブロックしないステートメントは、関数内で許可されます。具体的には、ノンブロッキング割り当て、イベント トリガー、クロッキング ドライブ、および fork-join_none コンストラクトを関数内で許可する必要があります。
Verilog イベント キューで関数を簡単に評価できるようにすることが目的でした。時間を進める必要がある場合は、 のtask
代わりに を使用しfunction
ます。
Cの関数のようにVerilogの関数について考えないようにしてください。
Verilogの関数は、開発者が使いやすい方法で、同じ組み合わせロジックを一度に複数の場所でインスタンス化するように設計されています。もう一度書き直したり、モジュールを作成したりする必要はありません。Verilogの多くの「初心者」は、C関数のように関数を合理化しようとします。関数は値を「返す」一方で、最終的には組み合わせゲートのブロックとして概念化する方が簡単です(より正確です)。
これは、「順番に」物事を実行するために一般的に使用される「タスク」とは異なることに注意してください。これは、関数よりもテストベンチの状況でおそらくより有用です。
Verilogを学習するときは、「コード」として記述したHDLを合理化しないようにしてください。これは、考え方が異なるためです。
編集:私の側でいくつかの悪い説明を取りました