Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Verilatorやってみた! ~ OpenCVでテストベンチを書いてみた ~
Search
Ryuji Fuchikami
May 29, 2021
Programming
0
110
Verilatorやってみた! ~ OpenCVでテストベンチを書いてみた ~
Verilator勉強会 (2021/05/29) で発表した資料です。
https://connpass.com/event/212792/
Ryuji Fuchikami
May 29, 2021
Tweet
Share
More Decks by Ryuji Fuchikami
See All by Ryuji Fuchikami
オリジナルの深層学習で HLS Challenge にチャレンジ
ryuz88
0
590
Zynq MP SoC で楽しむエッジコンピューティング ~RTLプログラミングのススメ~
ryuz88
0
2.1k
LUT-Network ~その後の話~
ryuz88
0
88
Rust で RTOSを考える
ryuz88
0
110
Fast and Light-weight Binarized Neural Network Implemented in an FPGA using LUT-based Signal Processing and its Time-domain Extension for Multi-bit Processing
ryuz88
0
78
LUT-Network ~Edge環境でリアルタイムAIの可能性を探る~
ryuz88
0
63
LUT-Network ~本物のリアルタイムコンピューティングを目指して~
ryuz88
0
1k
Other Decks in Programming
See All in Programming
F#で自在につくる静的ブログサイト - 関数型まつり2025
pizzacat83
0
310
Webからモバイルへ Vue.js × Capacitor 活用事例
naokihaba
0
740
The Evolution of Enterprise Java with Jakarta EE 11 and Beyond
ivargrimstad
1
830
Spring gRPC で始める gRPC 入門 / Introduction to gRPC with Spring gRPC
mackey0225
2
520
Datadog RUM 本番導入までの道
shinter61
1
310
データベースコネクションプール(DBCP)の変遷と理解
fujikawa8
1
270
CursorはMCPを使った方が良いぞ
taigakono
0
140
設計やレビューに悩んでいるPHPerに贈る、クリーンなオブジェクト設計の指針たち
panda_program
2
150
生成AIコーディングとの向き合い方、AIと共創するという考え方 / How to deal with generative AI coding and the concept of co-creating with AI
seike460
PRO
1
320
Claude Codeの使い方
ttnyt8701
1
130
[初登壇@jAZUG]アプリ開発者が気になるGoogleCloud/Azure+wasm/wasi
asaringo
0
130
Passkeys for Java Developers
ynojima
3
870
Featured
See All Featured
Reflections from 52 weeks, 52 projects
jeffersonlam
351
20k
Rails Girls Zürich Keynote
gr2m
94
14k
Why You Should Never Use an ORM
jnunemaker
PRO
56
9.4k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
233
17k
Into the Great Unknown - MozCon
thekraken
39
1.9k
Automating Front-end Workflow
addyosmani
1370
200k
Balancing Empowerment & Direction
lara
1
340
Understanding Cognitive Biases in Performance Measurement
bluesmoon
29
1.8k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
130
19k
Visualization
eitanlees
146
16k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
31
1.2k
For a Future-Friendly Web
brad_frost
179
9.8k
Transcript
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
[email protected]
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 :
[email protected]
• 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