例えば以下の2つのVerilogファイルを持ったプロジェクトを考える。
package.sv
package normal_package; localparam SIZE = 32; endpackage // normal_package
module2.sv
module module2 import normal_package::*; ( input logic clk, input logic reset, input logic [SIZE-1: 0] a, input logic [SIZE-1: 0] b, output logic [SIZE-1: 0] c ); always_ff @ (posedge clk, posedge reset) begin if (reset) begin c <= 'h0; end else begin c <= a + b; end end endmodule // module2
これをVivadoで論理合成するとき、ファイルリストの順番を以下のように指定したとする。
add_files -norecurse module2.sv
add_files -norecurse package.sv
すると、以下のようなエラーが発生する。
ERROR: [Synth 8-1031] normal_package is not declared [/home/msyksphinz/work/riscv/reorder_files_example/module2.xpr/module2.srcs/sources_1/imports/reorder_files_example/module2.sv:2]
つまり、package.sv
が読み込まれていないのに、module2.sv
の中でpackage.sv
を参照していてそれでエラーが発生しているのだ。
したがってファイルリストの順番を直すと、この問題は解決する。
add_files -norecurse package.sv
add_files -norecurse module2.sv
しかし、この場合はシンプルだが、もっとファイル名が多い場合は、依存関係を手動で解析して並べ替えるのはかなり難しい。 そこで、Vivadoの論理合成スクリプトに以下を追加する。
set_property top ${TOP_NAME} [current_fileset]
reorder_files -auto -disable_unused
指定されたファイルセット内のソースファイルを並べ替える。指定されたファイルをファイルセット内の他のファイルの前後に配置します。このコマンドには、デザインの現在のトップ・モジュールの要件に基づいてファイルを並べ替える自動並べ替え機能もあります。
これを追加することで、自動的に依存関係を解析して並べ替えることができる。面倒なファイルリストの並べ替えを行う必要はないということだ。