`define
マクロや他のほとんどのコンパイラディレクティブのスコープはコンパイル単位です。コンパイル単位は、コンパイラが解析するソーステキストのストリームです。マクロは、コンパイル単位に現れる点で定義され、その時点以降に表示されます。
モジュールと他の名前空間で定義されたスコープは、VerilogまたはSystemVerilog構文が認識される前にマクロが事前処理されているため、無関係です。つまり、マクロ定義に対してインスタンス固有の制御を行うことはできません。
VerilogとSystemVerilogがコンパイル単位を定義する方法には違いがあります。
Verilogでは、各コンパイル単位はコンパイルステップ、またはソースコードをコンパイルするツールの1回の呼び出しです。一部のツールはコンパイルのステップが1つしかないため、すべてのソースコードを1つのステップでコンパイルする必要があります。他のツール(Modelsimなど)では、コードを別々のステップでコンパイルできます。 1つのコンパイルステップの`define
マクロは、再定義しない限り、他のコンパイルステップには表示されません。
SystemVerilogは、コンパイラコマンドラインの各ファイルを別々のコンパイル単位として扱う機能を追加します。これは、SystemVerilogを使用すると、typedefやモジュール外の関数などを定義できるため、必要でした。各ファイルを別々のコンパイル単位にしておくと、命名の衝突を防ぐことができます。 (このコンパイル単位の動作はC/C++でも同じです)。
レガシーVerilogコードとSystemVerilogを混在させる方法のため、コンパイルユニットのVerilogまたはSystemVerilog動作を選択できるツールがあります。