はじめに
どうも界隈でVerilatorなるものを耳にするようになったので少し試してみました。
結論から言うと、いろいろ制約はあるものの
の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"
を追加。
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等で情報お寄せいただいた皆様有難うございました。