FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

Chisel

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のライ…

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

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

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

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

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はインデックスが固…

あけましておめでとうございます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は以下の改良(というか特徴)が加わっており、使いやすくな…

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

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

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

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

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

FIRRTLで配列を扱えるように改造を行っている。単純に、配列をキープしながらFIRRTLの処理を進めていくことは可能なのだが、例えば以下のような状態が発生ると問題だ。下記の状況では、Bundleによる構造体が配列で複数定義されているような状態になる。 circ…

FIRRTLに入門する (14. Bundleの改造と配列の解析)

FIRRTLの解析に際し、BundleTypeとVecTypeの解析を行っている。LowerType()の中で、どのように変換されているのか解析をする。 以下の3つのコードを用意した。 circuit VecModules : module VecModules : input in: UInt<32>[4] input sel: UInt<2> output o…

FIRRTLに入門する (13. Bundleの改造と配列の制約)

Chisel/FIRRTLのBundleを使用すると、SystemVerilogのstructやインタフェースのように信号を扱うことができる。 circuit BundleTest : module BundleTest : input in: { a : UInt<32>, b : UInt<32> } output out : { a : UInt<32>, ans: UInt<32> } これをV…

FIRRTLに入門する (12. 配列参照のコードを残したままVerilogを出したい2)

Chiselで配列を出力するために試行錯誤してみる。 まず、試行する中で余計な処理をするコードを片っ端から省いていく。ここは最適化に影響しそうなところだが、とりあえず無視。 diff --git a/src/main/scala/firrtl/Emitter.scala b/src/main/scala/firrtl/…

FIRRTLに入門する (11. 配列参照のコードを残したままVerilogを出したい)

ChiselからVerilogを生成すると、配列参照の記述は最終的に除去され、とんでもないVerilogが生成されることはよくある。 これをVerilogでそのまま配列で出力する方法を探しているのだが、試行錯誤でなかなかうまく進まない。 まず、passes.RemoveAccessesパ…

ScalaのインタプリタAmmoniteでChisel3を動作させる試行

https://ammonite.io/ Chise(というかScala)を動かすために、わざわざbuild.sbtを作るのが面倒くさい。簡単にChiselを扱うことができないか、いろいろ調査していたら、Ammoniteというインタプリタあるのを発見した。 ammonite.io Ammoniteのインストールは以…

FIRRTLに入門する (10. 配列参照のコードはどこで除去される?)

ChiselからVerilogを生成すると、配列参照の記述は最終的に除去され、とんでもないVerilogが生成されることはよくある。例えば以下のようなFIRを書いたとすると、 circuit VecModules : module VecModules : input in: UInt<1>[16] input sel: UInt<4> outpu…

FIRRTLに入門する (9. Negative EdgeのAsynchronous Resetを追加してみる)

FIRでAsync Resetの作り方が分かったので、練習問題としてNegative EdgeのAsynchronous Resetを作ってみようかと思う。 Async Resetは専用の型が定義されていたので、同様にNegative EdgeのAsync Resetの型を定義してみる。 firrtl/src/main/scala/firrtl/ir…

FIRRTLに入門する (8. FIRRTLのレジスタアップデートの動作を確認する)

単純なデータパスであれば簡単にFIRの記述を書くことができる。次に、レジスタアップデートについて挙動を確認しよう。レジスタアップデートには、クロックとリセットの記述が必要である。 クロックは独自の型が定義されているが、リセットは独自の型が定義…

FIRRTLに入門する (7. FIRRTLにSystemVerilogCompilerを追加してみる)

現在FIRRTLでは出力オプションに-X sverilogを追加することができ、これは一応SystemVerilog出力用のコンパイラであるのだが、実際に適用してみると、 ------------------------------------------------------------------------------ Warning: SystemVeri…

FIRRTLに入門する (6. FIRRTLのコンパイルオプションについて違いを確認)

FIRRTLのコンパイルオプション・というか生成ファイルオプションには以下が存在する。 none : NoneCompiler() を呼び出す。特に何もしない。 hi : HighFirrtlCompiler()を呼び出す。 low : LowFirrtlCompiler()を呼び出す。 middle : MiddleFirrtlCompiler()…

FIRRTLに入門する (5. ANTLR4 用のFIRRTL.g4を使ってC++の簡易パーサを作ってみる)

FIRRTLのパーサがANTLRで作られていることが分かったので、これを使えば遊べるような気がしてきた。C++向けにFIRRTLの文法ファイルを変換して、C++で簡易パーサを作って遊んでみる。 まず、ANTLR4のランタイムをダウンロードした。C++用のANTLRランタイムを…