Ryuz's tech blog

FPGAなどの技術ブログ

Verilator に Clang と Ninja を使ってみる

Verilator のコンパイルを速くしたい

実行速度は爆速の Verilator ですが、ソースの規模が大きくなってくるとコンパイル時間が長くなってきます。

こちらで、Clang使うと少し早くなると紹介されていたのですが、なかなか手を出せずにいたところ cmake で使う方法を、こちらで見かけたのでやってみました。

Clang を使ってみる

Ubuntu の場合ですが、clang が入っていなければこんな感じで入ると思います。

sudo apt update
sudo apt install clang

先例に倣って clang-cmakeinit.cmake というファイルを作ってみました(ファイル名は何でもいいのかな?)。

set(CMAKE_C_COMPILER "/usr/bin/clang" CACHE string "clang compiler" FORCE)
set(CMAKE_CXX_COMPILER "/usr/bin/clang++" CACHE string "clang++ compiler" FORCE)

従来

mkdir -p build && cd build && cmake ..

としていたのですが、

mkdir -p build && cd build && cmake  -C ../clang-cmakeinit.cmake ..

とすればよいようです。

ついでに Ninja も試してみる

インストールはこんな感じのようです。

sudo apt install ninja-build

先の例がこうなります。

mkdir -p build && cd build && cmake -GNinja -C ../clang-cmakeinit.cmake ..

計ってみました

Windows10 の WSL2 に Ubuntu 20.04 を入れている環境ですが、time コマンドでこちらのビルド時間を測ってみました。

オリジナルの gcc 環境

real    0m32.254s
user    0m20.771s
sys     0m4.748s

Clan にした場合

real    0m29.899s
user    0m17.881s
sys     0m4.267s

おお、速くなった。

Clan + Ninjaにした場合

real    0m20.849s
user    0m17.695s
sys     0m2.891s

おお、これも効いた。

結論

環境や対象によると思いますが、結構変わるかもしれません。 ディスクキャッシュとかそういう状況次第でも変動しそうです。

少し後から clean と build を繰り返してみましたが、どうやらそれなりの改善効果はあるようです。

ちょっとでも速い方が嬉しいですよね。いろいろ試してみる価値はあるのかなと。

追記

Verilator の sample にならって、cmake を Makefile から呼び出して使ってますが、結局 clang や ninjya があるときだけ使う用に、こんな感じに落ち着きました。MakefileMakefile で便利ですね。

# cmake のフラグ
CMAKE_FLAGS = 

# clang があれば使う
ifeq (,$(shell which clang))
WITH_CLANG ?= No
else
WITH_CLANG ?= Yes
endif

# ninja があれば使う
ifeq (,$(shell which ninja))
WITH_NINJA ?= No
else
WITH_NINJA ?= Yes
endif

ifeq ($(WITH_CLANG),Yes)
CMAKE_FLAGS += -C ../clang-cmakeinit.cmake
endif

ifeq ($(WITH_NINJA),Yes)
CMAKE_FLAGS += -GNinja
endif

all: build run coverage

.PHONY : build
build:
    mkdir -p build && cd build && cmake $(CMAKE_FLAGS) ..
    cmake --build build -j

.PHONY : clean
clean:
    rm -rf build