1

システム Verilog デザインには、トップ モジュール、サブ モジュール、およびサブ サブ モジュールがあります。トップモジュールでインスタンス化されたサブモジュールでインスタンス化されたサブサブモジュール.トップモジュールにはサブサブモジュールのインスタンスもあります.階層ツリーを以下に示します

ここに画像の説明を入力

サブサブモジュールの定義には、このような 'ifndef ブロックに記述されたコードがあります

module sub_sub()
{
...........
`ifndef OFF
<code to avoid>
`endif
...........
}

コンパイル中にサブサブモジュール instance1 でのみ回避するコードを無効にするにはどうすればよいですか? サブモジュール インスタンスで `define OFF を使用しましたが、すべてのインスタンスから回避するコードを無効にします。

4

3 に答える 3

1

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

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

コードに対してインスタンス固有の制御が必要な場合は、インスタンス固有のオーバーライドを使用してパラメーターを定義する必要があります。次に、generate-if/case コンストラクトを使用して、実行するコードを制御できます。generate コンストラクトの制限が強すぎる場合は、procedural-if/case ステートメントを使用できます。最適化により、定数パラメーターの結果として取得されなかった分岐が削除されます。

于 2016-11-10T17:05:40.700 に答える