この質問は、システム Verilog マクロに関するものです。
トップモジュール、サブモジュール、サブサブモジュールがあります。トップモジュールでインスタンス化されたサブモジュールでインスタンス化されたサブサブモジュール。
サブモジュールでマクロを定義する`define abc
と、内部`ifndef abc
に記述されたコードはトップモジュール/サブサブモジュールでコンパイルされますか?
この質問は、システム Verilog マクロに関するものです。
トップモジュール、サブモジュール、サブサブモジュールがあります。トップモジュールでインスタンス化されたサブモジュールでインスタンス化されたサブサブモジュール。
サブモジュールでマクロを定義する`define abc
と、内部`ifndef abc
に記述されたコードはトップモジュール/サブサブモジュールでコンパイルされますか?
`define
マクロおよびその他のほとんどのコンパイラ ディレクティブのスコープは、コンパイル ユニットです。コンパイル単位は、コンパイラが解析するソース テキストのストリームです。マクロは、コンパイル単位に表示される時点で定義され、その時点から可視になります。
Verilog または SystemVerilog 構文が認識される前にマクロが前処理されるため、モジュールおよびその他の名前空間によって定義されるスコープは無関係です。これは、マクロ定義をインスタンス固有に制御できないことを意味します。
Verilog と SystemVerilog でコンパイル ユニットを定義する方法には、見た目の違いがあります。
Verilog では、各コンパイル ユニットはコンパイル ステップ、またはソース コードをコンパイルするツールの 1 つの呼び出しです。一部のツールでは、コンパイル ステップが 1 つしかなく、すべてのソース コードを 1 ステップでコンパイルする必要があります。他のツール (Modelsim など) を使用すると、別の手順でコードをコンパイルできます。あるコンパイル ステップの`define
マクロは、再定義しない限り、他のコンパイル ステップからは見えません。
SystemVerilog は、コンパイラ コマンド ラインの各ファイルを個別のコンパイル ユニットとして扱う機能を追加します。これが必要だったのは、SystemVerilog を使用すると、モジュールの外部で typedef や関数などを定義できるためです。各ファイルを個別のコンパイル単位に保つことで、名前の競合を防ぎます。(このコンパイル単位の動作は C/C++ でも同じです)。
従来の Verilog コードと SystemVerilog を混在させる方法があるため、一部のツールでは、コンパイル ユニットの Verilog または SystemVerilog の動作を選択できます。
+define+...
コンパイル コマンドでを使用していない限り、define
マクロはコンパイル順序に応じて有効になります。undef
コンパイルされると、対応する条件が満たされるまで、コードまたはファイルの後続の行によって取得されます。
あなたの場合、コンパイル順序は次のとおりです: subsub.v
, sub.v
, top.v
(モジュール名による)。
define abc
が の最初の行にあると仮定するとsub.v
、これは の後続の行だけでなく、この場合は である残りのファイルでもabc
有効ですが、 ではありません。sub.v
top.v
subsub.v
あなたの質問に答えるために、内のコードはコンパイルさifndef abc
れtop.v
ません。一方、ifndef abc
insubsub.v
はコンパイルされます。