1

コンパイラに渡す最上位ファイルが次のようになっているとします。

`include "my_defines.sv"
`include "my_component.sv"

「my_component.sv」ファイル内で、次のように「my_defines.sv」の定義を使用しています。

my_variable = `CONSTANT_FROM_MY_DEFINES;

`include "my_defines.sv"問題は次のとおりです。「my_component.sv」内にある必要がありますか? おそらく、この要件はコンパイラ固有のものですか?

4

5 に答える 5

1

includeそのようなディレクティブは、そのファイルを がある場所にコピー アンド ペーストするようなものincludeです。コンパイラ:

  1. 指定したファイルを読み取ります。
  2. インクルードに遭遇すると、そのファイルを読み取ります。
  3. そのファイルが終了すると、元のファイルが続行されます。

その結果、コンパイラは 1 つの大きなフラット ファイルを認識します。

あなたの例では、以前に表示されているため、 my_definesin のものを使用できます。my_component

これを何度も行うと、最終的に競合が発生するという問題があります。2 つのものが相互に参照し合ったり (インクルードが最初に来る)、2 つのものが同じ名前を使用したり (衝突する定義)、複数のものに同じ include ステートメントがある (同じものの複数の定義) 場合があります。

これらの問題を解決するのがパッケージです。物事がもう少し複雑になり始めたら、それらを調べてください。

于 2012-09-24T09:34:46.660 に答える
0

これは、ソース ファイルがコンパイルされる順序に依存します。グローバルなマクロを具体的に参照しているためdefine、マクロを使用する前にマクロ定義をコンパイルする必要があります。あなたの場合、「my_defines.sv」はすでにトップファイルにコンパイルされているため、「my_component.sv」内に「my_defines.sv」を含める必要はありません。

于 2012-09-18T14:39:18.980 に答える
0

my_component.sv に `include "my_defines.sv を含める必要があります...

ベスト プラクティスは、すべてのインクルードを 1 つの pkg に追加し、その pkg を各ファイルに追加することです。

于 2012-10-11T13:15:37.743 に答える
0

マクロ定義はファイル間でのみ保持されますが、翻訳単位の最後までのみ保持されます。シミュレーターは、ソース ファイルを翻訳単位に割り当てる 2 つの異なる方法をサポートする必要があり、両方の方法で正しくコンパイルするために、定義でいっぱいのインクルード ファイルを取得するのは困難です。

定数にはパラメーターまたは const 変数を使用することをお勧めします。パラメータと定数は通常のスコープ規則に従うため、それらを必要とするすべてのファイル/スコープに安全に含めることができます。次に、コードが翻訳単位にどのように分割されているかは問題ではなく、常にコンパイルされます。`include はおそらく他の無関係なファイルではなく同じファイルにあるため、コードを参照しているときに定義を見つける方が簡単だと思います。

于 2012-10-10T21:53:54.653 に答える