SlideShare a Scribd company logo
Verilatorやってみた!
~ OpenCVでテストベンチを書いてみた ~
2021/05/29 Verilator勉強会
Ryuji Fuchikami
@Ryuz88
とりあえず
自己紹介させてください
2
自己紹介
• 平日は某企業で働くサラリーマン
• 1976年生まれ 全国転々としつつも結局、福岡が一番長く、今も福岡在住
• 1998~ μITRON仕様 Real-Time OS HOS-80 をリリース
• 現在 HOS-V4a にて各種組み込みCPUに対応 (組み込みRustも実験中)
(ARM,H8,SH,MIPS,x86,Z80,AM,V850,MicroBlaze, etc.)
• 2008~ FPGA用ソフトコアSoC環境 Jelly をリリース(MIPS互換コア)
• 現在 Zynq 上にて Real-Time GPU や LUT-Network の実験など
各種 Real-Time コア開発の実験場と化す
• 2018~ LUT-Network用の環境 BinaryBrain を開発中
• 微分可能回路記述にてFPGA回路をそのまんま深層学習
• リアルタイムコンピューティング(当然Edgeコンピュータ)を探求中
• 電脳メガネ計画(いつかやりたい電脳コイルの世界)
• Real-Time 画像I/O (カメラ[IMX219] & OLED 1kfps駆動)
• Real-Time GPU開発 (frame buffer無し、ゼロ遅延描画)
• Real-Time DNN開発 (超低遅延DNN認識)
3
それでは Verilator の話
4
使い始めて一か月程の身なので...
中身はブラックボックスのまま
使ってみた感想とか
やってみた体験中心にお話しします
5
巷で噂のVerilator
6
何が凄いのか早速やってみた
• 環境
• Intel Core i7-4770@3.4GHz 32GB/GT1660SUPPER/GT1030
• Ubuntu 18.04/20.04 (Windows 10 Pro WSL2)
• Verilator v4.200 ← 必ず新しいものを入れよう!
• VS code
• Xming + GTKwave
7
WLSのおかげで Windows でも快適に使えます。
まだ使ってないVerilogな人に伝えたい事
• 思ったより簡単に導入できる
• 思った以上に開発効率が上がる
• 新しい使い方について、とても潜在力を
有している
8
Verilatorすごい!
• 数時間かかっていた画像処理シミュレーションが数分で終わった
• VCD形式よりはるかに小さいFST形式
• OpenCV はじめ C++ の資産がテストベンチ記述に使える
• シミュレーションの進行や制御がC++で自由に弄れる
• 体重が 2㎏減った
9
※ 上記は個人の感想です。効果は個人差がある場合があります。
まずはインストール
10
ドキュメント通りやれば
難なくインストール完了
https://verilator.org/guide/latest/install.html
testbench(C++)
ほぼVerilogのまま既存テストベンチを動かしてみる
11
testbench(Verilog)
画像出力
モデル
ガウシアン
フィルタ
for文
クロック&リセット
AXI4 Stream 画像保存
モデル
$fscanf()で頑張って読む
Mandrill.pgm
img_0001.pgm
$fdisplay()で頑張って書く
AXI4 Stream
最小構成
クロックとリセット準備しただけなのに
12
いろいろ制約心配していたら、いともあっさり結果でました
こいつ・・・動くぞ!
ちかっぱ速かとです
13
ツール 速度
Veritak 2分15秒
iverilog 4分7秒
xsim 2分17秒
Verilator 10秒
とある512x512画像でテスト
さらに波形ダンプ止めたら瞬殺(1秒以下)でした
ここまでに嵌った初心者の穴紹介(1)
• 横着せずにクロックはC++まで引き出そう
• 最初 –public つけて、そのまま全部外から弄ろうとしたら嵌りました
• Warning対応をどこまでやるかは判断が必要
• Warningといいつつコンパイル止まるので、-Wno-XXX
• 非常に強力な文法チェックなので、新規に書くならちゃんと対応したい
(古い大量のコード抱えてると全部対応はツライ)
14
で、本格的に使い方検討開始
15
C++でモデル書いたら
OpenCVとか使えるんじゃ?
普通のシミュレータとの違い
# が使えない (@は使える)
つまり単独ではイベントが起こらないのでシミュレーションが進行しない
16
シミュレーションの進行はユーザー側のC++に任されている
eval()呼ばないと進行しない、信号入れないと@イベントも起きない
C++テストベンチで時間も空間(信号)も自由自在
え? 何やってもいいんですか?
はじめにやったこと
17
@Vengineerさんの薄い本を読む
なんかわかった気になる
C++が主導権を握ったシミュレーションの世界へGO!
我々はシミュレータに時空間を支配されていた
18
Verilatorで支配者になろう!
何が必要か?
Verilog の文法に即した信号のハンドシェークが
C++ ⇔ Verilog間で必要
19
• イベントキューの機能
• ノンブロッキング代入の機能
具体的にはC++側の
イベントキューの機能(#の代替)
20
initial begin
reset = 1’b1;
#1000
reset = 1’b0;
end
always #5.0 clk = ~clk;
要はこんな記述の代わりに
1000ns後にリセット解除するコードの実行予約が必要だったり
こんな記述の代わりに
5ns後に波形反転コードが呼ばれ、再び5ns後に再予約される仕組み
だったりが必要
⇒ C++ の std::priority_queue とかで楽に作れるよね
C++でのノンブロッキング代入の対応
21
そもそもノンブロッキング代入のおさらい
• 参照する変数はイベント前の値
• 代入は即時実施されず、イベント完了後に反映される
イベント処理時に eval() 呼ぶ前と呼んだ後の
それぞれで変数アクセスタイミングがC++に必要
その他のケア
22
initial な処理と、 final な処理が必要だよね
細かい挙動は@Vengineerさんの薄い本で把握!
結局こんな感じの基底クラス実装
23
必要な処理だけoverrideしてモデルを書けるフレームワークを考えてみた
• 前処理/後処理
• 自分が動くべきタイミングかどうかの監視
• イベント前の値取得と、イベント後の反映
• 怪しいUIを追加する為の別スレッド
作ってみた自作クラスはこんな感じ
24
Manager
イベント
キュー
Reset
Node
Clock
Node
ImageLoad
Node
(OpenCV利用)
ImageDump
Node
(OpenCV利用)
Verilator
Node
Verilator
生成の
モジュール
必要に応じて値を参照
(テンプレートを活用して
型異存なく接続)
C++で書いたモデル
実行してみる(bmp/png/jpgが使える!)
25
画像読み込みモデル
26
一応ブランキングとかもいれて、ビデオ信号っぽい波形も作れるように
してみた。
AXI4-Stream のテスト用に乱数ウェイトを入れてみる
27
valid/ready のハンドシェークは乱数入れるだけで初期のバグ出しに効果的
verilogでも困らないが、C++だとstd::random とかが充実している
調子にのってUIつけてみた
28
OpenCVで回転などの画像の前処理も楽々実装。
シミュレーション表示するスレッドとは別にのぞき見表示するスレッドを準備
ESCキーを押せば途中でも finish() 実行して中断するように実装
波形ダンプとカバレッジOFFしてみた
29
とても速いです。
でも –threads オプション付けたら逆に遅くなったりもしたのでまだまだこれから
ここまでに嵌った初心者の穴紹介(2)
• Verilator 任せだとC++のオプションがうまく操作できない
• cmake は新しいものを使おう
• 古い cmake 使っていたら、-std=++17 つけてるのに、-std=gnu++11 も一緒
について解析に手間取りました。
• cmake新しくしたら一発解決でした。
30
おまけ
31
• コンパイルとても長い
(多分私のVerilogコードも原因)
• 実行が超速でびっくり
• 大量のデータの実験にはよさそう
(動画使った時系列処理の確認とか)
【LUT-Network(拙作のFPGA DNN)やってみた】
【非同期クロックもやってみた】
• 複数クロックを作ってみたが
あっさり動いてくれた
まとめ
• 導入は思ったより簡単
• 普通の同期回路ならクロックだけ外に引っ張り出したらほとんどのVerilog記述のテス
トベンチはほぼそのまま使えた
• SystemVerilogも基本的なところは使えそう?(使い込んでないので自信なし)
• 爆速なのでシミュレーション時間が開発効率に直結する分野に人に超おすすめ
• Verilator や cmake などはなるべく最新を入れましょう
• WSL2 + VS code 最高! Ubuntu20.04 オススメ
• 使い方の応用が非常に奥深い
• OpenCV の例は一つの例に過ぎない (ROSとかUnityとか繋ぐと面白いかも)
• C++のいいところとVerilogのいいところ混ぜてたテストベンチが簡単に書ける
• 速いしいろいろなものと繋げてシステムシミュレーションできるかも
(カメラとかの実デバイスとか、FPGAの実体とか)
32
参考にさせて頂いた情報
• @Vengineer様 「Verilator の薄い本」
• 「Verilatorの中を調べる」No.1、例題解析編]
• https://booth.pm/ja/items/2917623
• 「Verilatorの中を調べる」No.2、テストデータ解析編]
• https://vengineer.booth.pm/items/2927828
• 「みねっちょのマイコン関係ブログ」様
• WSL で 無償の Verilog な サイクルベースシミュレータ Verilator を使う
• https://minettyo.com/entry/logicdesign_wsl_verilator
• 「FPGA開発日記」 様
• Verilatorの使い方(1. Verilatorの考え方と基本的なシミュレーション実行方法)
• https://msyksphinz.hatenablog.com/entry/2020/05/06/040000
• Verilatorの使い方(2. 波形ダンプの方法)
• https://msyksphinz.hatenablog.com/entry/2020/05/08/040000
• Verilatorの使い方(3. Lintとして活用する)
• https://msyksphinz.hatenablog.com/entry/2020/05/10/000000
33
発表者アクセス先
• 渕上 竜司 (Ryuji Fuchikami)
• e-mail : ryuji.fuchikami@nifty.com
• Web-Site : http://ryuz.my.coocan.jp/
• Blog. : http://ryuz.txt-nifty.com/
https://ryuz.hatenablog.com/
• GitHub : https://github.com/ryuz/
• Twitter : https://twitter.com/Ryuz88
• Facebook : https://www.facebook.com/ryuji.fuchikami
• YouTube : https://www.youtube.com/user/nekoneko1024
34
本発表に関連するブログ記事は下記の2件です
• Verilatorやってみた
https://ryuz.hatenablog.com/entry/2021/05/01/135821
• C++の動作モデル書いてみた(主にVerilator用)
https://ryuz.hatenablog.com/entry/2021/05/02/104700
ご清聴ありがとうございました
35

More Related Content

PPTX
本当は恐ろしい分散システムの話
PDF
Intro to SVE 富岳のA64FXを触ってみた
PDF
いまさら聞けないarmを使ったNEONの基礎と活用事例
PDF
CUDAのアセンブリ言語基礎のまとめ PTXとSASSの概説
PDF
FPGA+SoC+Linux実践勉強会資料
PDF
TVM の紹介
PDF
20111015 勉強会 (PCIe / SR-IOV)
PDF
ARM CPUにおけるSIMDを用いた高速計算入門
本当は恐ろしい分散システムの話
Intro to SVE 富岳のA64FXを触ってみた
いまさら聞けないarmを使ったNEONの基礎と活用事例
CUDAのアセンブリ言語基礎のまとめ PTXとSASSの概説
FPGA+SoC+Linux実践勉強会資料
TVM の紹介
20111015 勉強会 (PCIe / SR-IOV)
ARM CPUにおけるSIMDを用いた高速計算入門

What's hot (20)

PDF
計算機アーキテクチャを考慮した高能率画像処理プログラミング
PPTX
Deep Learningのための専用プロセッサ「MN-Core」の開発と活用(2022/10/19東大大学院「 融合情報学特別講義Ⅲ」)
PDF
高速な倍精度指数関数expの実装
PDF
Zynq mp勉強会資料
PDF
ChatGPT 人間のフィードバックから強化学習した対話AI
PDF
VerilatorとSystemCでSoftware Driven Verification
PDF
ACRiウェビナー:小野様ご講演資料
PPTX
BoostAsioで可読性を求めるのは間違っているだろうか
PDF
CUDAプログラミング入門
PDF
VerilatorとSystemC
PDF
containerdの概要と最近の機能
PDF
大学研究室レベルでLocal 5Gを導入するための手法の考察
PDF
組み込みでこそC++を使う10の理由
PDF
Lispマシン・シミュレータの紹介
PDF
マルチレイヤコンパイラ基盤による、エッジ向けディープラーニングの実装と最適化について
PDF
3種類のTEE比較(Intel SGX, ARM TrustZone, RISC-V Keystone)
PPTX
Microsemi FPGAで RISC-V を動かしてみた話 (Lチカ)
PDF
プログラムを高速化する話Ⅱ 〜GPGPU編〜
PDF
知っておくべきCephのIOアクセラレーション技術とその活用方法 - OpenStack最新情報セミナー 2015年9月
計算機アーキテクチャを考慮した高能率画像処理プログラミング
Deep Learningのための専用プロセッサ「MN-Core」の開発と活用(2022/10/19東大大学院「 融合情報学特別講義Ⅲ」)
高速な倍精度指数関数expの実装
Zynq mp勉強会資料
ChatGPT 人間のフィードバックから強化学習した対話AI
VerilatorとSystemCでSoftware Driven Verification
ACRiウェビナー:小野様ご講演資料
BoostAsioで可読性を求めるのは間違っているだろうか
CUDAプログラミング入門
VerilatorとSystemC
containerdの概要と最近の機能
大学研究室レベルでLocal 5Gを導入するための手法の考察
組み込みでこそC++を使う10の理由
Lispマシン・シミュレータの紹介
マルチレイヤコンパイラ基盤による、エッジ向けディープラーニングの実装と最適化について
3種類のTEE比較(Intel SGX, ARM TrustZone, RISC-V Keystone)
Microsemi FPGAで RISC-V を動かしてみた話 (Lチカ)
プログラムを高速化する話Ⅱ 〜GPGPU編〜
知っておくべきCephのIOアクセラレーション技術とその活用方法 - OpenStack最新情報セミナー 2015年9月
Ad

More from ryuz88 (9)

PPTX
LUT-Network その後の話(2022/05/07)
PDF
Rust で RTOS を考える
PDF
Fast and Light-weight Binarized Neural Network Implemented in an FPGA using L...
PPTX
FPGA勉強会資料 20210516
PPTX
Deep Learning development flow
PPTX
LUT-Network ~Edge環境でリアルタイムAIの可能性を探る~
PPTX
LUT-Network Revision2 -English version-
PPTX
LUT-Network Revision2
PPTX
LUT-Network ~本物のリアルタイムコンピューティングを目指して~
LUT-Network その後の話(2022/05/07)
Rust で RTOS を考える
Fast and Light-weight Binarized Neural Network Implemented in an FPGA using L...
FPGA勉強会資料 20210516
Deep Learning development flow
LUT-Network ~Edge環境でリアルタイムAIの可能性を探る~
LUT-Network Revision2 -English version-
LUT-Network Revision2
LUT-Network ~本物のリアルタイムコンピューティングを目指して~
Ad

Verilator勉強会 2021/05/29