2

この質問は、システム Verilog マクロに関するものです。
トップモジュール、サブモジュール、サブサブモジュールがあります。トップモジュールでインスタンス化されたサブモジュールでインスタンス化されたサブサブモジュール。

サブモジュールでマクロを定義する`define abc と、内部`ifndef abcに記述されたコードはトップモジュール/サブサブモジュールでコンパイルされますか?

4

2 に答える 2

4

`defineマクロおよびその他のほとんどのコンパイラ ディレクティブのスコープは、コンパイル ユニットです。コンパイル単位は、コンパイラが解析するソース テキストのストリームです。マクロは、コンパイル単位に表示される時点で定義され、その時点から可視になります。

Verilog または SystemVerilog 構文が認識される前にマクロが前処理されるため、モジュールおよびその他の名前空間によって定義されるスコープは無関係です。これは、マクロ定義をインスタンス固有に制御できないことを意味します。

Verilog と SystemVerilog でコンパイル ユニットを定義する方法には、見た目の違いがあります。

Verilog では、各コンパイル ユニットはコンパイル ステップ、またはソース コードをコンパイルするツールの 1 つの呼び出しです。一部のツールでは、コンパイル ステップが 1 つしかなく、すべてのソース コードを 1 ステップでコンパイルする必要があります。他のツール (Modelsim など) を使用すると、別の手順でコードをコンパイルできます。あるコンパイル ステップの`defineマクロは、再定義しない限り、他のコンパイル ステップからは見えません。

SystemVerilog は、コンパイラ コマンド ラインの各ファイルを個別のコンパイル ユニットとして扱う機能を追加します。これが必要だったのは、SystemVerilog を使用すると、モジュールの外部で typedef や関数などを定義できるためです。各ファイルを個別のコンパイル単位に保つことで、名前の競合を防ぎます。(このコンパイル単位の動作は C/C++ でも同じです)。

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

于 2016-11-08T15:44:37.243 に答える
1

+define+...コンパイル コマンドでを使用していない限り、defineマクロはコンパイル順序に応じて有効になります。undefコンパイルされると、対応する条件が満たされるまで、コードまたはファイルの後続の行によって取得されます。

あなたの場合、コンパイル順序は次のとおりです: subsub.v, sub.v, top.v(モジュール名による)。

define abcが の最初の行にあると仮定するとsub.v、これは の後続の行だけでなく、この場合は である残りのファイルでもabc有効ですが、 ではありません。sub.vtop.vsubsub.v

あなたの質問に答えるために、内のコードはコンパイルさifndef abctop.vません。一方、ifndef abcinsubsub.vはコンパイルされます。

例はこちら

于 2016-11-08T13:37:07.527 に答える