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
35
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
510
Zynq MP SoC で楽しむエッジコンピューティング ~RTLプログラミングのススメ~
ryuz88
0
1.8k
LUT-Network ~その後の話~
ryuz88
0
56
Rust で RTOSを考える
ryuz88
0
53
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
46
LUT-Network ~Edge環境でリアルタイムAIの可能性を探る~
ryuz88
0
50
LUT-Network ~本物のリアルタイムコンピューティングを目指して~
ryuz88
0
290
Other Decks in Programming
See All in Programming
PLoP 2024: The evolution of the microservice architecture pattern language
cer
PRO
0
2.4k
JaSST 24 九州:ワークショップ(は除く)実践!マインドマップを活用したソフトウェアテスト+活用事例
satohiroyuki
0
450
シェーダーで魅せるMapLibreの動的ラスタータイル
satoshi7190
1
440
Jakarta Concurrencyによる並行処理プログラミングの始め方 (JJUG CCC 2024 Fall)
tnagao7
1
270
開発効率向上のためのリファクタリングの一歩目の選択肢 ~コード分割~ / JJUG CCC 2024 Fall
ryounasso
0
420
Streams APIとTCPフロー制御 / Web Streams API and TCP flow control
tasshi
2
340
アジャイルを支えるテストアーキテクチャ設計/Test Architecting for Agile
goyoki
9
3.1k
Click-free releases & the making of a CLI app
oheyadam
2
100
AWS Lambdaから始まった Serverlessの「熱」とキャリアパス / It started with AWS Lambda Serverless “fever” and career path
seike460
PRO
0
140
C#/.NETのこれまでのふりかえり
tomokusaba
1
180
WebフロントエンドにおけるGraphQL(あるいはバックエンドのAPI)との向き合い方 / #241106_plk_frontend
izumin5210
4
1.3k
Generative AI Use Cases JP (略称:GenU)奮闘記
hideg
0
190
Featured
See All Featured
The Pragmatic Product Professional
lauravandoore
31
6.3k
Building Your Own Lightsaber
phodgson
102
6.1k
Designing Experiences People Love
moore
138
23k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
356
29k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
26
2.1k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
665
120k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
169
50k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
159
15k
Side Projects
sachag
452
42k
Java REST API Framework Comparison - PWX 2021
mraible
PRO
28
8.2k
jQuery: Nuts, Bolts and Bling
dougneiner
61
7.5k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
280
13k
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