FPGA開発セミナーvol.18 (2023/01/25)

1K Views

January 25, 23

スライド概要

フィックスターズならではの「FPGA」に関する高速化手法、効率的な開発ノウハウ、苦労話などについてお話しいたします。


<講演内容>

1.本講演~テストとノウハウ編:FPGA の論理を Chisel でゴリゴリ開発してみた話~
前回に続き、 Chisel でのテストのやり方と細かいノウハウについてお伝えします。
一般的に論理回路を記述するには VHDL や Verilog が使われますが、メジャーなプログラミング言語の開発支援環境と比較して貧弱であることは否めません。
高位合成ではなく、クロック単位での論理をゴリゴリ書きたいけれど、 VHDL も Verilog も書きたくない。
そこで、UC Berkeley が開発している Chisel3 を用いて開発を行った経験をもとに、テストのやり方や、開発のノウハウをお伝えしたいと思います。

2.Lightning Talk!
1)10 Things Every (Fixstars’) FPGA Engineer Should Know
2)ZynqMP SoCで楽しむエッジコンピューティング ~RTLプログラミングのススメ~


・当社技術ブログ 記事: https://proc-cpuinfo.fixstars.com/

・フィックスターズグループ/セミナー一覧: https://www.fixstars.com/ja/seminar

・フィックスターズのFPGAシステム開発: https://www.fixstars.com/ja/services/fpga

profile-image

フィックスターズは、コンピュータの性能を最大限に引き出すソフトウェア開発のスペシャリストです。車載、産業機器、金融、医療など、幅広い分野での開発経験があります。また、ディープラーニングや機械学習などの最先端技術にも力を入れています。 並列化や最適化技術を駆使して、マルチコアCPU、GPU、FPGA、量子アニーリングマシンなど、さまざまなハードウェアでソフトウェアを高速化するサービスを提供しています。さらに、長年の経験から培ったハードウェアの知識と最適化ノウハウを活かし、高精度で高性能なアルゴリズムの開発も行っています。       ・開催セミナー一覧:https://www.fixstars.com/ja/seminar   ・技術ブログ :https://proc-cpuinfo.fixstars.com/

シェア

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

実践的!FPGA開発セミナー vol.18 2023/01/25 18:00~ Copyright© Fixstars Group

2.

テストとノウハウ編: FPGA の論理を Chisel で ゴリゴリ開発してみた話 Copyright© Fixstars Group

3.

Who I am Yoshitaka TAKEMOTO 竹本 義孝 ソリューション第四事業部 シニアエンジニア Copyright© Fixstars Group

4.

前回のコメント等への 回答 Copyright© Fixstars Group

5.
[beta]
Chisel と Verilog の簡易比較
Verilog
port 宣言

Chisel

module X (
[1:0] a,
コメント:switch input
is でいいのでは?
output [2:0] b
私:switch is は );default がない
三項演算子連打

logic x;

コメント: 次のように書けばいい
assign x = c1 ? a1:
c2 ? a2:
x := defaultValue
c3 ? a3:
switch~~
x_default;

val io = IO( new Bundle {
val a = Input(UInt(2.W))
val b = Output(UInt(3.W))
})
指摘に気が付いてなくてすみません
val x = WireInit( xDefault )
when(c1) { x := a1 }
when(c2) { x := a2 }
when(c3) { x := a3 }
MuxCaseというのもあるにはある

switch 文

instance 化

case (state)
X:
endcase

when().elsewhen().otherwise が良い

my_module i1 (
.x(x),
.y(y)
);

val i1 = Module(new MyModule)
i1.io.x := x
i1.io.y := y

MuxLookupやswitch-is があるにはあるが…

Copyright© Fixstars Group

6.

switch is を好まない理由 switch 構文は本質的に実装忘れに気が付けないから x := defaultX y := defaultY switch(cnd) { is (CND1) { x := 1.U y := 1.U } when(cnd === CND1) { x := 1.U y := 1.U }.elsewhen(cnd === CND2) { x := 2.U //y := 2.U 実装忘れ }.otherwise { x := defaultX y := defaultY } is (CND2) { x := 2.U // y := 2.U 実装忘れ } } yに未定義はないので コンパイルエラーなし yの未定義を検知して コンパイルエラー Copyright© Fixstars Group

7.

Chiselのメリットが何なのか結局よくわからない 立場によって違うと思われます 個人: ● Verilog より IDE 等の補完が強力 ● 記述が圧縮できる ● Verilog より楽しい(個人の感想) ● そもそも新しいパラダイムや機構に触れること以上のメリットが必要か? 組織: ● 微妙 Copyright© Fixstars Group

8.

Chisel でテスト Copyright© Fixstars Group

9.

Chisel でテスト Chisel のテストは、シミュレータを操作することで値を入力したり、値が正しいかの確認を行う ※ Chisel 3.6からは CIRCT に変わります Copyright© Fixstars Group

10.

Chisel でテストを作る enableが 1の時のinを 加算し、 出力する モジュール Copyright© Fixstars Group

11.

Chisel でテストを作る sbt で test とタイプするとテストを実行できる 成功すると[success]とでて終了する Copyright© Fixstars Group

12.

Chisel でテストを作る sbt で test とタイプするとテストを実行できる 成功すると[success]とでて終了する 正しく修正 Copyright© Fixstars Group

13.

Chisel でテストを作る it should “テスト名” test(new テストベンチモジュール) { tb => } を追加してテストを増やしていく Copyright© Fixstars Group

14.

Chisel でテストを作る ………いや、何で失敗すんのよ 波形、波形をくれ Copyright© Fixstars Group

15.

Chisel でテストを作る 波形を取得する為に 「testOnly * – -DwriteVcd=1」を実行 コマンドの意味は、全てのテスト実行する(* のワイルドカード)。 オプションとしてwriteVcd=1(波形ファイルの書き出し)を渡す ということ test_run_dirに 「〇_should_●」ディレクトリがあり その中に vcd ファイルが保存される GTKWave などで波形を確認してください Copyright© Fixstars Group

16.

Chisel assertion Verilog の assetion の様に毎クロック値を確認する、というようなテストをモジュール内に書けます assertを使って形式的検証ができるようになる、 という動画を見たけど使い方はよくわかってません…誰か教えて Copyright© Fixstars Group

17.

Chisel assertion rose とかの関数はあって便利だけど、もっと System Verilog の謎記法(↓)チックに書けないの? property foobar; @(posedge clk) endproperty $rose(valid) |=> foo; FOOBAR : assert property(foobar); chiselverify を使えばポートに関しては書けそう? https://github.com/chiselverify/chiselverify Copyright© Fixstars Group

18.

Chisel assertion 出力される Verilog が汚くなるのはご愛敬………? 何とかならない? Copyright© Fixstars Group

19.

ChiselVerify:追記 セミナー御担当の方は既にご存じかもしれませんが、 Chisel で Test - ChiselVerify https://github.com/chiselverify/ のような活動もあるようです。 御参考になるようでしたら幸いです。 やばい、System Verilogの並列アサーションもどきとしか書いてないじゃないの ちょっと README 読んできます Copyright© Fixstars Group

20.

ChiselVerify:何ができるの? ※ 実際に動かして試したわけじゃないです(これ書いてるの1/24 21:51ですもん) ● Chiselテストの便利関数提供 ○ ○ ○ ● ファンクショナルカバレッジ ■ 3p 前で 謎記法 もどきと言ってるやつ 制約付きランダム検証機能 ■ System Verilog の rand + constraint と同等と思われる AXI4 バス操作関数 比較動作検証機能の提供(と思われる) ○ モデル動作として作った RTL や Software の出力と同じ結果になるかどうかの比較検証をするための機能だと思う ■ マイコン開発してた時に「C++ の概念実装」と「Verilogで作ったRTL」の出力比較をするテストベンチを DPI-C で作ったことがありますが、それっぽい気がする 間違いあったら指摘お願いします Copyright© Fixstars Group

21.

Chisel のテストを Verilator で実行 論路規模が大きくなってくると、 FIRRTL のシミュレーションでは時間がかかる 遅いと思ったら Verilator でシミュレーションすることを検討すると良い .withAnnotations(Seq(VerilatorBackendAnnotation)) Verilator のコンパイルに時間はかかるけど、シミュレーションは早い Copyright© Fixstars Group

22.

Verilator がおかしくなったら Verilator が成功するはずのテストで何故か失敗することがある - Verilator は失敗するが FIRRTL は成功する ポート名などを変更しても VCD に反映されない そもそも VCD 波形が出ない 一度 sbt を終了し、以下のディレクトリを削除するとうまくいく(場合がある) - target ディレクトリ(target chisel/target) - test_run_dir ディレクトリ 何が・どれが悪いのかはよくわからない Copyright© Fixstars Group

23.

Chisel でテスト メリット ● 書くのが簡単 ○ shell script とか用意しなくても実行集計すぐできる ○ エディタの補完が効くのは偉大 ● 外部のライブラリなどをそのまま使える ○ CRC計算の結果があってるかとか、一度ファイルに出すとかせずにライブラリ呼び出した結 果を直接使える ● Scala の強力な構文が色々使える ○ for とか ○ match とか Copyright© Fixstars Group

24.

Chisel でテスト デメリット ● 書くのが辛い ○ Verilog で言ってしまえば、テストベンチの initial 内で全部のテストを記述するようなもの ○ always の様な時間の並列化や、 @(posedge 信号) みたいな記述が簡単にできない ○ 内部の信号に簡単にアクセスできない ● マルチ ドメイン クロックのテストが辛い ○ RTL 側は withClock で CDC は割と簡単に書ける ○ テスト側はテストベンチのクロック単位でしか時間が進まないので CDC が書けない ■ 私はテストベンチ用 モジュールでカウンタを使ってクロックを作るようなやり方で記述した ● it should “” の単位でテストを実行できない (やり方がわからない) ○ VSCode のGUIからはできるのだけども…tag というのを使えばできる? ○ (波形を見たい時に困ってます) ● 入力がクロックの立ち下がりに同期してるのが辛い ○ 信号が増えると目がバグるのでエッジをそろえないでほしい… Copyright© Fixstars Group

25.

Chisel でテスト まとめ ● Chisel でテストする方法について ○ 基本的には poke で値を突っ込んで expect で確認 ■ peek〇 で値として読みだすこともできます ○ assert を使えば毎クロック勝手にチェック可能 ● Chisel のテストを Verilator で走らせる方法について ○ VerilatorBackendAnnotation をつける ○ よく変になるので target ディレクトリとtest_run_dir を削除して sbt 再起動 ● Chisel のメリット ・ デメリット ○ 割とテスト書くのしんどい Copyright© Fixstars Group

26.

閑話休題 論理どうやって設計してる? Copyright© Fixstars Group

27.

論理どうやって設計してる? ● VSCode + Markdown + mermaid + Draw.io + タイミングチャート清書サービス(改造) Copyright© Fixstars Group

28.

論理どうやって設計してる? ● VSCode ○ 昨今独り勝ち状態のエディタ。Atomさん… ● Markdown ○ いわずもがな ● mermaid ○ 状態遷移図作成等に利用 ○ GitHub で Markdown に埋め込んでそのまま表示できる ○ VSCode には Markdown Preview Mermaid Support を導入すれば Markdown に組み込める ■ https://marketplace.visualstudio.com/items?itemName=bierner.markdown-mermaid ● Draw.io ○ HTML5/JavaScript で作られた Visio みたいなもの ○ VSCode では Draw.io Integration で VSCode 上で使うことができる ■ https://marketplace.visualstudio.com/items?itemName=hediet.vscode-drawio ○ *.drawio.svg という拡張子にして保存すれば、Markdown に組み込めて、Draw.io で編集できるので便利 Copyright© Fixstars Group

29.

論理どうやって設計してる? ● WaveDrom ○ https://wavedrom.com/editor.html ○ 美しいタイミング図が作れる ○ 最近はこれが使われていることが多い印象 ■ 正直タイミング図を書くならこれ一択 ■ GitHub 対応してくれないかな… でも書くの面倒くさい ※個人の感想です。用法容量を守って正しくお使いください Copyright© Fixstars Group

30.

論理どうやって設計してる? ● タイミングチャート清書サービス ○ 何も考えずに書ける ○ https://dora.bk.tsukuba.ac.jp/~takeuchi/?%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3 %82%A2%2F%E3%82%BF%E3%82%A4%E3%83%9F%E3%83%B3%E3%82%B0%E3%83%81%E3%83%A3%E3%83 %BC%E3%83%88%E6%B8%85%E6%9B%B8%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9 30 Copyright© Fixstars Group

31.

論理どうやって設計してる? ● タイミングチャート清書サービス(改造) ○ こんな感じに2カラム化して出力ファイル名を変えれるようにしてる ○ SVG の先頭にオリジナルデータが格納されてるので復元できるようにしてる ○ SVG なので Markdown でそのまま表示できる。便利 ○ 信号名で幅の調整しないと見切れるのは如何なものか… ■ タイミグチャート清書サービス記法→WaveDrom→SVG の仕組みを作ろうと思い早や幾年 Copyright© Fixstars Group

32.

Chisel 開発ノウハウ (あくまで個人のノウハウ) 32 Copyright© Fixstars Group

33.

FFの作り方 あれこれ Copyright© Fixstars Group

34.

FFの作り方 あれこれ Copyright© Fixstars Group

35.

FFの作り方 あれこれ 決まり切った所は関数化 Copyright© Fixstars Group

36.

Chisel と コンストラクタ と フィールド ● Chisel でロジックを書くこの部分はコンストラクタ ● ここにモジュールや信号なども定義していくのがチュートリアル的なスタイル ○ 定義した信号などはフィールドとなり外部からアクセス可能 .ioの書き忘れ ioポートではなく、レジスタのb Copyright© Fixstars Group

37.

Chisel と コンストラクタ と フィールド 出てくるエラーが スタック トレース 何が悪いのか全然わからん Copyright© Fixstars Group

38.

Chisel と コンストラクタ と フィールド ● 極力 private val にするようにした ● private をつけるのも面倒になって {} でくくるようになった Copyright© Fixstars Group

39.

Chisel と IO Bundle チュートリアルでは、入出力が反転するポートは Flipped を使って書かれる val primary = new HogeBundle val secondary = Flipped(new HogeBundle) Stream の様に入出力がはっきりしてる Bundle なら覚えやすいが、 複雑な Bundle になってくるとどちらで反転するのかわからなくなる Copyright© Fixstars Group 39

40.

Chisel と IO Bundle 結局 SystemVerilog の modport をまねる形に落ち着いた class HogeBundle extends Bundle { val moge = Output(略) val piyo = Input(略) } object HogeBundle { def apply() = new HogeBundle def ctrl = new HogeBundle def func = Flipped(new HogeBundle) } val func = HogeBundle.func 40 val ctrl = HogeBundle.ctrl Copyright© Fixstars Group

41.

Chisel ノウハウ まとめ ● FFの作り方 ○ RegNextPair という object を作って使ってます ● 内部信号にアクセスする悲劇 ○ private val を使いましょう ○ 面倒なら { } で囲いましょう ● IO Bundle の Flipped ○ 結局 SystemVerilog の modport は良いスタイルだと思う Copyright© Fixstars Group

42.

最後に 42 Copyright© Fixstars Group

43.

Chisel は救いになるか。 ● 個人的には Verilog よりもずっと好きだし、書いていて楽しい ● 趣味用途には今日からの使用をお勧めします ● 仕事に使えるかどうかは、微妙 ○ 万人が使える物ではない ■ 非プログラマとプログラマで書きあがるコードに大きな差が確実に出る ○ エラーがきつい ○ 保証がないことにどう向き合うか? ● 既存モジュール接続のためのグルーロジックとしては仕事に使える ○ 読める程度の Verilog コードしか出てこないなら問題は何もない ● 小さなロジックで社外に出ないコードなら活用可能 Copyright© Fixstars Group

44.

最後に ● Scala の資産を容易に取り込めるのは強い ○ 一方で、 Scala の上に構築されているが故の問題点があるのも事実 ● メタ プログラミング的な話もしたかったけど、時間足りないので削った ○ バグなのか、自分のミスなのかもわからないことが多いので手を出さない方が賢明 ● 私が思う Chisel の最大の成果は FIRRTL ○ そして時代は LLVM-CIRCT へ ○ 今後もっと LLVM-CIRCT を介してトランスパイルする言語が増えると面白いですね ● Chisel は今後も安泰? ○ お金の流れ的に十分安泰。後はユーザー数の問題かと ○ むろん、JavaScript で言う Chisel = CoffeeScript で今後 TypeScript が出てくる可能性も ■ でも、 CoffeeScript は今でも俺たちの心の中で輝いてるよね? ぜひ Chisel を使ってみましょう! Copyright© Fixstars Group

45.

Lightning Talk! Copyright© Fixstars Group

46.

10 Things Every (Fixstars') FPGA Engineer Should Know Copyright© Fixstars Group

47.

Who I am Shinya KAJI 写真 梶 信也 ソリューション第四事業部 事業部長 Copyright© Fixstars Group

48.

Fixstars で 7 年以上 PM を担当してきた経験か ら PM の立場で FPGA エンジニアに期待することが たくさんあります。 今回の LT では PDCA サイクルのステップ毎に、 “10 Things Every (Fixstars') FPGA Engineer Should Know” としてご紹介します。 Copyright© Fixstars Group

49.

1. ゴールまでのマイルストーンを描く プロジェクトゴールに至るまでの過程をプロジェクトメンバーと共有する。 マイルストーンが不明瞭でメンバー間で共有されていないと余計な手数を踏むことが多い。 Copyright© Fixstars Group

50.

2. 計画はほどほどに 計画はあくまで計画。過剰に労力をかけない。 Copyright© Fixstars Group

51.

3. 失敗を恐れずにまずはやってみる やればできることや既に分かっていることが 仕事として依頼されることは稀なこと。 やることでしか分からないことばかりなので 失敗を恐れずやってみる! Copyright© Fixstars Group https://twitter.com/suntory/status/1311131655474733057/photo/1

52.

4. 自分が出来ることではなく、求められていることを叶える 経験が長いエンジニアほどやり方が確立され、自分の出来ることと出来ないこと が明確に認識できる。自分なりの方法論を採用することは確実性が高いかもしれ ないが、ステークホルダーが求めているとは限らない。 Copyright© Fixstars Group

53.

5. エンドユーザ思考 システムを最終的に使うユーザのことを考え、どうあるべきかを考え続ける。 Copyright© Fixstars Group

54.

6. 求められているのは価値創造 プロセス (Process) よりも価値創造 (Produce) を大切にする プロセス Process 価値創造 Produce Copyright© Fixstars Group

55.

7. システム思考 ソフトウェアでもなくハードウェアでもなく、顧客が求めるものはシステムであ りソリューションであることを忘れない Copyright© Fixstars Group

56.

8. 自問自答を繰り返す この設計は妥当か? この実装よりも良いものはないか? 自動化して属人性を排除できないか? 言いたいことは伝えられているか? プロジェクトに関係するメンバー間で知 識レベルや前提知識は違って当然。 相手が分かってくれることを期待せず、 相手に知ってもらうために自分の成果を 客観視する! Copyright© Fixstars Group

57.

9. 僅かな努力を積み上げる力 日々 0.1% の成長を 10 年間コツコツと積み上げたエンジニアの成長は著しい Copyright© Fixstars Group

58.

10. AI everywhere AI for your family AI for your friends AI for your team AI for your clients AI for yourself Copyright© Fixstars Group

59.

Thank you! お問い合わせ窓口 : hr-seminar@fixstars.com Copyright © Fixstars Group