Ryuz's tech blog

FPGAなどの技術ブログ

Verilatorやってみた

はじめに

どうも界隈でVerilatorなるものを耳にするようになったので少し試してみました。

結論から言うと、いろいろ制約はあるものの

  • シミュレーション速度が爆速である
  • テストベンチをC++で書くので OpenCV などが使いやすい

の2点から、シミュレーションに時間のかかる画像処理やビデオ信号処理には非常に適していそうです。

インストール

当方は Ubuntu をメインにしています(VMware や WSL2 で利用)。

最新版であるバージョンを試しましたので apt install は使わずに自分でコンパイルしました。

基本的にはここを参考にインストールですが、私はひとまずローカルにインスト―ルしました。

ドキュメント見ながらUbuntuで必要なパッケージを準備

sudo apt update
sudo apt install -y git perl python3 make g++ libfl2 libfl-dev zlibc zlib1g zlib1g-dev ccache  libgoogle-perftools-dev numactl perl-doc autoconf flex bison gdb graphviz cmake clang clang-format lcov

pip3 install sphinx sphinx_rtd_theme breathe
cpan install Pod::Perldoc
cpan install Parallel::Forker

本体の取得&ビルド&インストール

git clone https://github.com/verilator/verilator.git -b v4.222
cd verilator

autoconf
./configure --prefix $HOME/.opt/verilator-4.222
make -j2
make install

~/.bashrc に以下を追加してパスを通した。

export PATH="$HOME/.opt/verilator-4.222/bin:$PATH"
export PKG_CONFIG_PATH="$HOME/.opt/verilator-4.222/share/pkgconfig:$PKG_CONFIG_PATH"

ガウシアンフィルタを試してみる

拙作のFPGA環境に Verilator のテストベンチを追加してみた。 画像は今回はこちらのものを加工して Mandrill.pgm に変換し

git clone https://github.com/ryuz/jelly.git
cd jelly/testbench/sim/image/tb_img_gaussian/verilator

(該当ディレクトリに画像ファイル(Mandrill.pgm)を置く)

./run_verilator.sh

実行するといい感じにちゃんとガウシアンフィルタのかかった画像が出力できた。

作業中にもう少し大きな画像(512x512)で実験して、ストップウォッチ(手動)で計ってみたところ。

  • veritak : 2分15秒
  • iverilog : 4分7秒
  • xsim : 2分17秒
  • Verilator : 10秒

の結果でしたので、かなり速いと思います。

OpenCV を試してみる

今度は少し本格的に OpenCV を使った画像の読み書きを作ったので試してみます。こんどは画像ファイルは BOAT.bmp をそのまま使います。

今回は OpenCV のリンクもあるので cmake に挑戦してみます。

cmake のインストールは以前に一度やっていたようで v3.17 が入っていましたので一旦あわせてこんな感じでインストールします。

wget https://github.com/Kitware/CMake/releases/download/v3.17.1/cmake-3.17.1.tar.gz
tar zxvf cmake-3.17.1.tar.gz
cd cmake-3.17.1
./bootstrap --prefix=$HOME/.local
make
make install

.bashrc に

export PATH="$HOME/.local/bin:$PATH"

を追加。

OpenCV も以前やったここを参考に入れておきました。

cd ../../tb_img_canny/verilator

(該当ディレクトリに画像ファイル(BOAT.bmp)を置く)

make

いい感じに処理出来て png で出力できています。

C++のバージョンお話

C++のビルドに C++17 が使いたかったのですが、なぜか Verilator さんが かたくなに -std=gnu++14 を付けてくださるので、 share/verilator/include/verilated.mk を下のように書き換えたりしてます。

#CFG_CXXFLAGS_STD_NEWEST = -std=gnu++14
CFG_CXXFLAGS_STD_NEWEST = -std=c++17

誰かよい方法あったら教えてください。

参考にさせて頂いた資料

Twitter等で情報お寄せいただいた皆様有難うございました。