SystemVerilog では、コンパイル ユニットを使用することで、単一ファイルおよび複数ファイルのコンパイルがサポートされます。
コンパイル ユニットとは、一緒にコンパイルされた 1 つまたは複数の SV ソース ファイルのコレクションです。各コンパイル ユニットは、1 つのライブラリに関連付けられています。コンパイル ユニット スコープとは、グローバルなコンパイル ユニットに局所的に存在するスコープのことで、このスコープにはほかのデザイン スコープ外にあるすべての宣言が含まれます。コンパイル ユニット スコープには、通常、関数、タスク、パラメーター、ネット、モジュール外で宣言された変数およびユーザー定義のデータ型、インターフェイス、パッケージ、またはプログラムが含まれます。
たとえば、次のようなデザインがあるとします。
Tcl モード
read_verilog -lib lib1 {test1.sv }
read_verilog -lib lib2 {test2.sv }
read_verilog test3.sv
または
IDE
図 1. IDE
前述の場合、test1.sv に params や typedefs などのコンパイル ユニット スコープに次のような宣言があります。
Parameter P1 =2; // Parameter declared out of module scope
Module test1 (<port list>)
...
...
endmodule
上記のようにファイルを読み込みます。コンパイラ ユニット スコープでは、lib1 の下の test1.sv ファイルを読むことから開始しますが、コンパイル ユニットは単一のライブラリに関連付けられるべきなので、lib2 を使用して test2.sv を読み込むことはできません。これは、次のいずれかの方法で対処します。
Tcl モードの場合、すべてのファイルを 1 つのライブラリに含めます。
read_verilog -lib lib1 {test1.sv}
read_verilog -lib lib1 {test2.sv}
read_verilog test3.sv
または、ライブラリをまったく宣言しません。
read_verilog {test1.sv }
read_verilog {test2.sv}
read_verilog test3.sv
または、単一ファイルのコンパイル ユニット モードを使用します。
read_verilog -lib lib1 {test1.sv}
read_verilog -lib lib2 {test2.sv}
read_verilog test3.sv
synth_design -top <top_name> -sfcu
図 2. 設定