Upgrade to Pro — share decks privately, control downloads, hide ads and more …

実践的!FPGA開発セミナーvol.18 / FPGA_seminar_18_fixstars...

実践的!FPGA開発セミナーvol.18 / FPGA_seminar_18_fixstars_corporation_20230125

2023年1月25日に開催した、「実践的!FPGA開発セミナーvol.18」の当日資料です。

More Decks by 株式会社フィックスターズ

Other Decks in Programming

Transcript

  1. Copyright© Fixstars Group Who I am Yoshitaka TAKEMOTO 竹本 義孝

    ソリューション第四事業部  シニアエンジニア
  2. Copyright© Fixstars Group Chisel と Verilog の簡易比較 Verilog Chisel port

    宣言 module X ( input [1:0] a, output [2:0] b ); val io = IO( new Bundle { val a = Input(UInt(2.W)) val b = Output(UInt(3.W)) }) 三項演算子連打 logic x; assign x = c1 ? a1: c2 ? a2: c3 ? a3: x_default; val x = WireInit( xDefault ) when(c1) { x := a1 } when(c2) { x := a2 } when(c3) { x := a3 } MuxCaseというのもあるにはある switch 文 case (state) X: endcase when().elsewhen().otherwise が良い MuxLookupやswitch-is があるにはあるが … instance 化 my_module i1 ( .x(x), .y(y) ); val i1 = Module(new MyModule) i1.io.x := x i1.io.y := y コメント:switch is でいいのでは? 私:switch is は default がない コメント: 次のように書けばいい x := defaultValue switch~~ 指摘に気が付いてなくてすみません
  3. Copyright© Fixstars Group switch is を好まない理由 switch 構文は本質的に実装忘れに気が付けないから x :=

    defaultX y := defaultY switch(cnd) { is (CND1) { x := 1.U y := 1.U } is (CND2) { x := 2.U // y := 2.U 実装忘れ } } when(cnd === CND1) { x := 1.U y := 1.U }.elsewhen(cnd === CND2) { x := 2.U //y := 2.U 実装忘れ }.otherwise { x := defaultX y := defaultY } yに未定義はないので コンパイルエラーなし yの未定義を検知して コンパイルエラー
  4. Copyright© Fixstars Group Chiselのメリットが何なのか結局よくわからない 立場によって違うと思われます 個人: • Verilog より IDE

    等の補完が強力 • 記述が圧縮できる • Verilog より楽しい(個人の感想) • そもそも新しいパラダイムや機構に触れること以上のメリットが必要か? 組織: • 微妙
  5. Copyright© Fixstars Group Chisel でテストを作る 波形を取得する為に 「testOnly * – -DwriteVcd=1」を実行

    コマンドの意味は、全てのテスト実行する(* のワイルドカード)。 オプションとしてwriteVcd=1(波形ファイルの書き出し)を渡す ということ test_run_dirに 「〇_should_•」ディレクトリがあり その中に vcd ファイルが保存される GTKWave などで波形を確認してください
  6. Copyright© Fixstars Group Chisel assertion rose とかの関数はあって便利だけど、もっと System Verilog の謎記法(↓)チックに書けないの?

    property foobar; @(posedge clk) $rose(valid) |=> foo; endproperty FOOBAR : assert property(foobar); chiselverify を使えばポートに関しては書けそう? https://github.com/chiselverify/chiselverify
  7. Copyright© Fixstars Group ChiselVerify:追記 セミナー御担当の方は既にご存じかもしれませんが、 Chisel で Test - ChiselVerify

    https://github.com/chiselverify/ のような活動もあるようです。 御参考になるようでしたら幸いです。 やばい、System Verilogの並列アサーションもどきとしか書いてないじゃないの ちょっと README 読んできます
  8. Copyright© Fixstars Group ChiselVerify:何ができるの? ※ 実際に動かして試したわけじゃないです(これ書いてるの1/24 21:51ですもん) • Chiselテストの便利関数提供 ◦ ファンクショナルカバレッジ

    ▪ 3p 前で 謎記法 もどきと言ってるやつ ◦ 制約付きランダム検証機能 ▪ System Verilog の rand + constraint と同等と思われる ◦ AXI4 バス操作関数 • 比較動作検証機能の提供(と思われる) ◦ モデル動作として作った RTL や Software の出力と同じ結果になるかどうかの比較検証をするための機能だと思う ▪ マイコン開発してた時に「C++ の概念実装」と「Verilogで作ったRTL」の出力比較をするテストベンチを DPI-C で作ったことがありますが、それっぽい気がする 間違いあったら指摘お願いします
  9. Copyright© Fixstars Group Chisel のテストを Verilator で実行 論路規模が大きくなってくると、 FIRRTL のシミュレーションでは時間がかかる

    遅いと思ったら Verilator でシミュレーションすることを検討すると良い .withAnnotations(Seq(VerilatorBackendAnnotation)) Verilator のコンパイルに時間はかかるけど、シミュレーションは早い
  10. Copyright© Fixstars Group Verilator がおかしくなったら Verilator が成功するはずのテストで何故か失敗することがある - Verilator は失敗するが

    FIRRTL は成功する - ポート名などを変更しても VCD に反映されない - そもそも VCD 波形が出ない 一度 sbt を終了し、以下のディレクトリを削除するとうまくいく(場合がある) - target ディレクトリ(target chisel/target) - test_run_dir ディレクトリ 何が・どれが悪いのかはよくわからない
  11. Copyright© Fixstars Group Chisel でテスト メリット • 書くのが簡単 ◦ shell script

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

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

    poke で値を突っ込んで expect で確認 ▪ peek〇 で値として読みだすこともできます ◦ assert を使えば毎クロック勝手にチェック可能 • Chisel のテストを Verilator で走らせる方法について ◦ VerilatorBackendAnnotation をつける ◦ よく変になるので target ディレクトリとtest_run_dir を削除して sbt 再起動 • Chisel のメリット ・ デメリット ◦ 割とテスト書くのしんどい
  14. Copyright© Fixstars Group 論理どうやって設計してる? • VSCode + Markdown + mermaid

    + Draw.io + タイミングチャート清書サービス(改造)
  15. Copyright© Fixstars Group 論理どうやって設計してる? • 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 で編集できるので便利
  16. Copyright© Fixstars Group 論理どうやって設計してる? • WaveDrom ◦ https://wavedrom.com/editor.html ◦ 美しいタイミング図が作れる

    ◦ 最近はこれが使われていることが多い印象 ▪ 正直タイミング図を書くならこれ一択 ▪ GitHub 対応してくれないかな… でも書くの面倒くさい  ※個人の感想です。用法容量を守って正しくお使いください
  17. Copyright© Fixstars Group 論理どうやって設計してる? • タイミングチャート清書サービス(改造) ◦ こんな感じに2カラム化して出力ファイル名を変えれるようにしてる ◦ SVG

    の先頭にオリジナルデータが格納されてるので復元できるようにしてる ◦ SVG なので Markdown でそのまま表示できる。便利 ◦ 信号名で幅の調整しないと見切れるのは如何なものか… ▪ タイミグチャート清書サービス記法→WaveDrom→SVG の仕組みを作ろうと思い早や幾年
  18. Copyright© Fixstars Group Chisel と コンストラクタ と フィールド • Chisel

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

    private val にするようにした • private をつけるのも面倒になって {} でくくるようになった
  20. Copyright© Fixstars Group Chisel と IO Bundle チュートリアルでは、入出力が反転するポートは Flipped を使って書かれる

    Stream の様に入出力がはっきりしてる Bundle なら覚えやすいが、 複雑な Bundle になってくるとどちらで反転するのかわからなくなる 39 val primary = new HogeBundle val secondary = Flipped(new HogeBundle)
  21. Copyright© Fixstars Group Chisel と IO Bundle 結局 SystemVerilog の

    modport をまねる形に落ち着いた 40 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 ctrl = HogeBundle.ctrl val func = HogeBundle.func
  22. Copyright© Fixstars Group Chisel ノウハウ まとめ • FFの作り方 ◦ RegNextPair という

    object を作って使ってます • 内部信号にアクセスする悲劇 ◦ private val を使いましょう ◦ 面倒なら { } で囲いましょう • IO Bundle の Flipped ◦ 結局 SystemVerilog の modport は良いスタイルだと思う
  23. Copyright© Fixstars Group Chisel は救いになるか。 • 個人的には Verilog よりもずっと好きだし、書いていて楽しい •

    趣味用途には今日からの使用をお勧めします • 仕事に使えるかどうかは、微妙 ◦ 万人が使える物ではない ▪ 非プログラマとプログラマで書きあがるコードに大きな差が確実に出る ◦ エラーがきつい ◦ 保証がないことにどう向き合うか? • 既存モジュール接続のためのグルーロジックとしては仕事に使える ◦ 読める程度の Verilog コードしか出てこないなら問題は何もない • 小さなロジックで社外に出ないコードなら活用可能
  24. Copyright© Fixstars Group 最後に • Scala の資産を容易に取り込めるのは強い ◦ 一方で、 Scala

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

    信也 ソリューション第四事業部  事業部長
  26. Copyright© Fixstars Group Fixstars で 7 年以上 PM を担当してきた経験から PM

    の立場で FPGA エンジニアに期待することが たくさんあります。 今回の LT では PDCA サイクルのステップ毎に、 “10 Things Every (Fixstars') FPGA Engineer Should Know” としてご紹介します。
  27. Copyright© Fixstars Group 10. AI everywhere AI for your family

    AI for your friends AI for your team AI for your clients AI for yourself