FPGA開発日記

FPGAというより、コンピュータアーキテクチャかもね! カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages

TileLinkの勉強 (5. Diplomacyがサポートするウィジェットについて(2))

前回の続き。 Chipyardのリファレンスは比較的詳しく書いてあると思うので、この資料を読みながらDiplomacyの勉強をしていこうと思う。 chipyard.readthedocs.io 今回はDiplomacyがサポートするウィジェットについて。AXI4とTileLinkについて様々なウィジェ…

TileLinkの勉強 (4. Diplomacyがサポートするウィジェットについて)

前回の続き。 Chipyardのリファレンスは比較的詳しく書いてあると思うので、この資料を読みながらDiplomacyの勉強をしていこうと思う。 chipyard.readthedocs.io 今回はDiplomacyがサポートするウィジェットについて。AXI4とTileLinkについて様々なウィジェ…

FIRRTLに入門する (24. FIRRTLにおけるメモリの生成を調査する)

$ sbt assembly && ./utils/bin/firrtl -td regress -i ./regress/ICache.fir -X sverilog -ll trace 2>&1 | tee ICache.log ======== Starting Transform CheckInitialization$ ======== Exception in thread "main" firrtl.passes.PassExceptions: firrtl.…

FIRRTLに入門する (23. 多次元配列の出力時のループ展開の調整(2))

前回まででループ展開の問題に対してある程度解決の目途が立った。しかしまだ調整できていない部分がある。 ExpandWhesによりデフォルト値が挿入されるのだが、これはなぜかというとポートであるoutと記述とout.a[0], out.a[1], out.a[2], out.a[3]がずれて…

FIRRTLに入門する (23. 多次元配列の出力時のループ展開の調整)

前回の実装で、配列に関する実装は以下のようになっていた。以下のFIRコードをコンパイルすると、Verilogファイルが生成されるのだが、 module VecBundle9 : input in: { a : { b : { c : UInt<8>[4] } [8] } [16] }[32] input sel1: UInt<5> input sel2: UI…

FIRRTLに入門する (22. 多次元配列の構造体に関するSystemVerilog出力の修正)

前回までで多次元構造体配列について、とりあえずエラーが出ずにVerilogが生成されるようになったが、生成されたSystemVerilogのコードは明らかにおかしい。 circuit VecBundle1 : module VecBundle9 : input in: { a : { b : { c : UInt<8>[4] } [8] } [16]…

TileLinkのDiplomacyを使った実際のデザインを試してみる

TileLinkはDiplomacyという方式を使って実装されており、それを理解するのは大変だ。実際に触ってみるのが一番良い気がする。 という訳で、RocketChipの中でTileLinkのユニットテストを行っているデザインを抽出して実行してみた。 使用したのは、RocketChip…

TileLinkの勉強 (3. Chipyardのリファレンスを読む)

前回の続き。 Chipyardのリファレンスは比較的詳しく書いてあると思うので、この資料を読みながらDiplomacyの勉強をしていこうと思う。 chipyard.readthedocs.io Diplomacyコネクタ Diplomacyのグラフは互いにエッジを使って接続されている。Diplomacyのライ…

RISC-Vのベクトル拡張命令の仕様書日本語版を最新仕様v0.8にアップデートした

https://msyksphinz-self.github.io/riscv-v-spec-japanese/html/index.html 結構昔にRISC-V Vector Extensionの仕様を日本語化したものを公開していたのだが、公開して移行全くアップデートしていなかったので最新仕様に対応すべく修正を行った。 前回の公…

TileLinkの勉強 (2. Chipyardのリファレンスを読む)

前回の続き。 Chipyardのリファレンスは比較的詳しく書いてあると思うので、この資料を読みながらDiplomacyの勉強をしていこうと思う。 chipyard.readthedocs.io 9.1.4. 識別ノード 識別ノード これまでのノードは入力もしくは出力が定義されていたが、識別…

TileLinkの勉強 (1. Chipyardのリファレンスを読む)

SiFive社のCPUおよびRocketChipには、バスとしてTileLinkおよびDiplomacyが使用されている。 TileLinkはバスプロトコルなので良いとして、Diplomacyの理解は非常に難解だ。私もまだ完全に理解できていない。 Chipyardのリファレンスは比較的詳しく書いてある…

「驚異の量子コンピュータ 宇宙最強マシンへの挑戦」を読んだ

量子コンピュータに関する本は久しぶりに読んだ。最近量子コンピュータ関係はあまり手を付けることができていなかったので復習の意味を込めて読了。 読み物として非常に面白かった。 量子コンピュータの発展の歴史と、その基礎的な技術と考え方について初心…

XMLとStemsを使ってVerilatorのRTLシミュレーション結果をGtkWaveでアノテーション表示する方法

VerilatorはVerilogをコンパイルしてシミュレーションするためのツールだが、波形ログとしてはVCDやFSTなどを出力することができる。VCDはかなり昔から使われている波形保存のためのフォーマット、FSTはVCDと違って圧縮されたより高速アクセスを実現するため…

FIRRTLに入門する (21. 多次元配列及び構造体に関する処理の検討(3))

前回までの多次元構造体の処理を見直して、もう少し簡単になるんじゃないかということで作り直した。基本的な考え方は以下の通りだ。 SubField(構造体のメンバへのアクセス)が発生すると、WSubFieldの構造を取り除き、WRefと足し込む名前(ex.name)を記憶して…

FIRRTLに入門する (20. 多次元配列及び構造体に関する処理の検討(2))

前回、多次元配列をそのままChiselで扱うためにはどうすればよいか考えたが、さらにまだ考えないといけないことがある。さらに、以下のような構文について考えた。 circuit VecBundle2 : module VecBundle2 : input in: { a : { b : UInt<8>[2] } [3] }[4] i…

FIRRTLに入門する (19. 多次元配列及び構造体に関する処理の検討)

前回、多次元配列をそのままChiselで扱うためにはどうすればよいか考えたが、さらにまだ考えないといけないことがある。これに、構造体が入ってきた場合はどうするか、ということだ。つまり、以下のようなコードを考える。 circuit VecBundle2 : module VecB…

FIRRTLのSystemVerilog変換までのフローを調査する。

FIRRTLの変換フローについて調査した。ソースコードを読みながら各Passが何を実行しているのかを確認していく。 実行方法としては、 ./utils/bin/firrtl -td regress -i ./regress/simple_test.fir -X sverilog -ll trace 2>&1 | tee simple_test.log として…

FIRRTLのFIRノード種類一覧

FIRRTLのLowerTypeで使われるExpression, Statementの種類について纏めておく。 src/main/scala/firrtl/passes/LowerTypes.scala src/main/scala/firrtl/ir/IR.scala github.com 特に迷ったのは、WSubIndexとWSubAccessの違い。WSubIndexはインデックスが固…

Scalaのvar型を使用したChiselの記述量削減テクニック

Scalaにはval型とvar型という2種類の型の種類が存在する。var型は再割り当て可能, val型は再割り当て不可能な型というもので、要するに、 var型 : 処理の中で何度も書き換えができる。 val型 : 処理の中で一度しか書き換えることができない。 というものだ。…

あけましておめでとうございます2020

あけましておめでとうございます。今年も、FPGA開発日記をよろしくお願いします。 https://publicdomainq.net/japanese-new-year-0028812/ 去年の成果としては、以下のような感じだと思う。自分自身、今年は意外とハードウェアよりも、ソフトウェアよりに移…

年末なので今年のまとめをしよう2019

このブログも始めてから5年が経った。 年末年始なので、今年一年はどうだったかな、ということでまとめてみよう。 今年の元旦には、こんな目標を立てていたのだった。 msyksphinz.hatenablog.com 2019年始に立てた目標 引き続きRISC-Vをベースとしたエコシス…

FIRRTLに入門する (18. 多次元配列に対する処理の検討)

前回のLowerTypeの実装では、多次元配列に関する処理が抜けていた。このため、以下のようなFIRのコードをコンパイルするとエラーが発生する。 VecBundle.fir circuit VecBundle : module VecBundle : input in: UInt<32>[3][4] input sel: UInt<2> output ou…

fork/joinが可能なchiselテスト環境chisel-testers2を試す

Chisel-Testers2のアナウンスが流れていた。時間が経っていたが試してみようと思う。 ChiselにはすでにIOTestersというテスト環境があるが、ぶっちゃけこれはあまり使いやすくない。 chisel-testers2は以下の改良(というか特徴)が加わっており、使いやすくな…

本当に私の人生を変えた技術書10選

年末ですね。年末に技術っぽいことを書いても誰も見ていないので、どうでもいいことを書こうと思います。 皆さん技術書は好きですか?好きですよね。読みもしないのに技術書典なんかに大挙して押しかけて、結局積読が増えていく。積んでいるとなんか落ち着く…

FIRRTLに入門する (17. LowerType時に配列を分解せずにBundleを分解する手法の調査(3))

LowerTypeの調査を続けている、前回の記事からずいぶんと時間が経ってしまったが、Bundleを分解する方法について調査している。つまり、FIRRTLで以下のように記述されているコードを、Vectorを分解せずにBundleのみ分解するということである。 circuit VecBu…

FIRRTLに入門する (16. LowerType時に配列を分解せずにBundleを分解する手法の調査(2))

LowerTypeの調査を続けている、前回の記事からずいぶんと時間が経ってしまったが、Bundleを分解する方法について調査している。つまり、FIRRTLで以下のように記述されているコードを、Vectorを分解せずにBundleのみ分解するということである。 circuit VecBu…

DSLでビルドツールを自作する (25日目 最後のまとめ)

この記事は「Qiita Advent Calendar 2019 DSLで自作ビルドツールを作ろう」の25日目の記事です。 25日目 最後のまとめ ここまで、24回に分けて一からビルドツールの開発に挑戦してきました。 DSLの勉強のために、Rubyのメタプログラミングについて一から勉強…

DSLでビルドツールを自作する (24日目 EmacsプロジェクトをRumyでコンパイルしてみる試行 ~ひたすらルールファイルを書く~)

この記事は「Qiita Advent Calendar 2019 DSLで自作ビルドツールを作ろう」の24日目の記事です。 24日目 EmacsプロジェクトをRumyでコンパイルしてみる試行 ~ひたすらルールファイルを書く~ 前回に引き続き、ひたすらMakefileをRumyファイルに移していきま…

DSLでビルドツールを自作する (23日目 EmacsプロジェクトをRumyでコンパイルしてみる試行 ~必要な機能は何か~)

この記事は「Qiita Advent Calendar 2019 DSLで自作ビルドツールを作ろう」の23日目の記事です。 23日目 EmacsプロジェクトをRumyでコンパイルしてみる試行 ~必要な機能は何か~ もうすこし大きなプロジェクトをビルドしてみたいと思います。いろいろと調べ…

DSLでビルドツールを自作する (22日目 gitコマンドに埋め込む1)

この記事は「Qiita Advent Calendar 2019 DSLで自作ビルドツールを作ろう」の22日目の記事です。 22日目 gitコマンドに埋め込む1 最近のビルドツールには、gitによるバージョン管理と融合し、リポジトリの管理の補助をしてくれる機能が当たりします。Rumy-Ma…