FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

VerilatorのコンパイルバックエンドをClang+LLVMに変更する

VerilatorはSystem Verilog回路を読み込みフロントエンドで処理したのちC++を出力する。 出力したC++ファイルをコンパイルして実際のバイナリに変換するのがバックエンドだが、この時のコンパイラは基本的に自由に指定することができる。

自作CPUのデザインが大きくなってコンパイルが遅いなあ、と思っておりClangに移行したかったのだがマニュアルを見てもやり方が分からずしばらく放置していたのだが、やり方が分かったので変更してみた。

Verilatorコマンド実行時の環境変数ではなく、make実行時のオプションとしてCXX=clang++ LINK=clang++を追加しなければならなかったのだ。 verilated.mk`の中身を読んでやっと理解した。

VERILATOR_OPTS += -MAKEFLAGS "OBJCACHE=ccache CXX=clang++ LINK=clang++"
VERILATOR_OPTS += --compiler clang

 rv64_standard: $(DECODE_FILES) $(FILELIST) libspike_dpi.so
     verilator --top-module $(TOP) -o ../$(TOP)_rv64_standard --Mdir obj_dir_rv64_standard $(VERILATOR_OPTS) ../src/riscv_common_pkg.sv ../src/riscv64_pkg.sv ../src/msrh_standard_conf_pkg.sv  -f $(FILELIST)

-MAKEFLAGSオプションがmake実行時に渡されるオプションらしい。これを修正する。

これでコンパイルすると、おそらく体感速度でかなり高速化されたような気がする。 試しに自作CPUのいろんなコンフィグレーションでコンパイルしてみる。

  • Clang++

    • rv64_small 3:40.81
    • rv64_standard 5:35.10
    • rv64_big 9:43.64
  • GCC

    • rv64_small 5:56.09
    • rv64_standard 8:07.60
    • rv64_big 終了せず
f:id:msyksphinz:20210330004113p:plain