2016-11-08 365 views
1

この質問はシステムのVerilogマクロに関するものです。
私はトップモジュール、サブモジュール、サブサブモジュールを持っています。サブモジュールでインスタンス化されたサブサブモジュールは、トップモジュールでインスタンス化されます。`defineマクロの範囲

私はサブモジュールにマクロ`define abcを定義する場合は、あなたのコンパイルコマンドで+define+...defineマクロ意志を使用している場合を除き、`ifndef abcの内側に書かれたコードは、トップモジュール/サブサブモジュール

答えて

0

にコンパイルされますコンパイル順に応じて有効になります。コンパイルされた後は、対応するundefが満たされるまで、コードまたはファイルの後続の行で取り込まれます。

あなたのケースでは、コンパイル順は:subsub.vsub.vtop.v(あなたのモジュール名による)です。

このabcsub.vの後続ラインならびにこの場合top.vある残りのファイルに有効である、​​はsub.vの最初の行にあると仮定すると、ではないsubsub.v

内のコードはtop.vにコンパイルされません。一方、ifndef abcsubsub.vがコンパイルされます。

Example here

2

`defineマクロや他のほとんどのコンパイラディレクティブのスコープはコンパイル単位です。コンパイル単位は、コンパイラが解析するソーステキストのストリームです。マクロは、コンパイル単位に現れる点で定義され、その時点以降に表示されます。

モジュールと他の名前空間で定義されたスコープは、VerilogまたはSystemVerilog構文が認識される前にマクロが事前処理されているため、無関係です。つまり、マクロ定義に対してインスタンス固有の制御を行うことはできません。

VerilogとSystemVerilogがコンパイル単位を定義する方法には違いがあります。

Verilogでは、各コンパイル単位はコンパイルステップ、またはソースコードをコンパイルするツールの1回の呼び出しです。一部のツールはコンパイルのステップが1つしかないため、すべてのソースコードを1つのステップでコンパイルする必要があります。他のツール(Modelsimなど)では、コードを別々のステップでコンパイルできます。 1つのコンパイルステップの`defineマクロは、再定義しない限り、他のコンパイルステップには表示されません。

SystemVerilogは、コンパイラコマンドラインの各ファイルを別々のコンパイル単位として扱う機能を追加します。これは、SystemVerilogを使用すると、typedefやモジュール外の関数などを定義できるため、必要でした。各ファイルを別々のコンパイル単位にしておくと、命名の衝突を防ぐことができます。 (このコンパイル単位の動作はC/C++でも同じです)。

レガシーVerilogコードとSystemVerilogを混在させる方法のため、コンパイルユニットのVerilogまたはSystemVerilog動作を選択できるツールがあります。

関連する問題