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
36
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
520
Zynq MP SoC で楽しむエッジコンピューティング ~RTLプログラミングのススメ~
ryuz88
0
1.8k
LUT-Network ~その後の話~
ryuz88
0
58
Rust で RTOSを考える
ryuz88
0
56
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
340
Other Decks in Programming
See All in Programming
Tauriでネイティブアプリを作りたい
tsucchinoko
0
370
どうして僕の作ったクラスが手続き型と言われなきゃいけないんですか
akikogoto
1
120
Kaigi on Rails 2024 〜運営の裏側〜
krpk1900
1
230
as(型アサーション)を書く前にできること
marokanatani
10
2.7k
とにかくAWS GameDay!AWSは世界の共通言語! / Anyway, AWS GameDay! AWS is the world's lingua franca!
seike460
PRO
1
880
よくできたテンプレート言語として TypeScript + JSX を利用する試み / Using TypeScript + JSX outside of Web Frontend #TSKaigiKansai
izumin5210
6
1.7k
ECS Service Connectのこれまでのアップデートと今後のRoadmapを見てみる
tkikuc
2
250
CSC509 Lecture 11
javiergs
PRO
0
180
ペアーズにおけるAmazon Bedrockを⽤いた障害対応⽀援 ⽣成AIツールの導⼊事例 @ 20241115配信AWSウェビナー登壇
fukubaka0825
6
2k
ヤプリ新卒SREの オンボーディング
masaki12
0
130
Pinia Colada が実現するスマートな非同期処理
naokihaba
4
230
Less waste, more joy, and a lot more green: How Quarkus makes Java better
hollycummins
0
100
Featured
See All Featured
We Have a Design System, Now What?
morganepeng
50
7.2k
Mobile First: as difficult as doing things right
swwweet
222
8.9k
The Art of Programming - Codeland 2020
erikaheidi
52
13k
Fontdeck: Realign not Redesign
paulrobertlloyd
82
5.2k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
126
18k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
159
15k
A Tale of Four Properties
chriscoyier
156
23k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.3k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
47
5k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
8
890
Making Projects Easy
brettharned
115
5.9k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
93
16k
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