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.…
前回まででループ展開の問題に対してある程度解決の目途が立った。しかしまだ調整できていない部分がある。 ExpandWhesによりデフォルト値が挿入されるのだが、これはなぜかというとポートであるoutと記述とout.a[0], out.a[1], out.a[2], out.a[3]がずれて…
前回の実装で、配列に関する実装は以下のようになっていた。以下のFIRコードをコンパイルすると、Verilogファイルが生成されるのだが、 module VecBundle9 : input in: { a : { b : { c : UInt<8>[4] } [8] } [16] }[32] input sel1: UInt<5> input sel2: UI…
前回までで多次元構造体配列について、とりあえずエラーが出ずにVerilogが生成されるようになったが、生成されたSystemVerilogのコードは明らかにおかしい。 circuit VecBundle1 : module VecBundle9 : input in: { a : { b : { c : UInt<8>[4] } [8] } [16]…
前回までの多次元構造体の処理を見直して、もう少し簡単になるんじゃないかということで作り直した。基本的な考え方は以下の通りだ。 SubField(構造体のメンバへのアクセス)が発生すると、WSubFieldの構造を取り除き、WRefと足し込む名前(ex.name)を記憶して…
前回、多次元配列をそのままChiselで扱うためにはどうすればよいか考えたが、さらにまだ考えないといけないことがある。さらに、以下のような構文について考えた。 circuit VecBundle2 : module VecBundle2 : input in: { a : { b : UInt<8>[2] } [3] }[4] i…
前回、多次元配列をそのままChiselで扱うためにはどうすればよいか考えたが、さらにまだ考えないといけないことがある。これに、構造体が入ってきた場合はどうするか、ということだ。つまり、以下のようなコードを考える。 circuit VecBundle2 : module VecB…
FIRRTLの変換フローについて調査した。ソースコードを読みながら各Passが何を実行しているのかを確認していく。 実行方法としては、 ./utils/bin/firrtl -td regress -i ./regress/simple_test.fir -X sverilog -ll trace 2>&1 | tee simple_test.log として…
FIRRTLのLowerTypeで使われるExpression, Statementの種類について纏めておく。 src/main/scala/firrtl/passes/LowerTypes.scala src/main/scala/firrtl/ir/IR.scala github.com 特に迷ったのは、WSubIndexとWSubAccessの違い。WSubIndexはインデックスが固…
あけましておめでとうございます。今年も、FPGA開発日記をよろしくお願いします。 https://publicdomainq.net/japanese-new-year-0028812/ 去年の成果としては、以下のような感じだと思う。自分自身、今年は意外とハードウェアよりも、ソフトウェアよりに移…
このブログも始めてから5年が経った。 年末年始なので、今年一年はどうだったかな、ということでまとめてみよう。 今年の元旦には、こんな目標を立てていたのだった。 msyksphinz.hatenablog.com 2019年始に立てた目標 引き続きRISC-Vをベースとしたエコシス…
前回のLowerTypeの実装では、多次元配列に関する処理が抜けていた。このため、以下のようなFIRのコードをコンパイルするとエラーが発生する。 VecBundle.fir circuit VecBundle : module VecBundle : input in: UInt<32>[3][4] input sel: UInt<2> output ou…
Chisel-Testers2のアナウンスが流れていた。時間が経っていたが試してみようと思う。 ChiselにはすでにIOTestersというテスト環境があるが、ぶっちゃけこれはあまり使いやすくない。 chisel-testers2は以下の改良(というか特徴)が加わっており、使いやすくな…
LowerTypeの調査を続けている、前回の記事からずいぶんと時間が経ってしまったが、Bundleを分解する方法について調査している。つまり、FIRRTLで以下のように記述されているコードを、Vectorを分解せずにBundleのみ分解するということである。 circuit VecBu…
LowerTypeの調査を続けている、前回の記事からずいぶんと時間が経ってしまったが、Bundleを分解する方法について調査している。つまり、FIRRTLで以下のように記述されているコードを、Vectorを分解せずにBundleのみ分解するということである。 circuit VecBu…
FIRRTLで配列を扱えるように改造を行っている。単純に、配列をキープしながらFIRRTLの処理を進めていくことは可能なのだが、例えば以下のような状態が発生ると問題だ。下記の状況では、Bundleによる構造体が配列で複数定義されているような状態になる。 circ…
FIRRTLの解析に際し、BundleTypeとVecTypeの解析を行っている。LowerType()の中で、どのように変換されているのか解析をする。 以下の3つのコードを用意した。 circuit VecModules : module VecModules : input in: UInt<32>[4] input sel: UInt<2> output o…
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…
Chiselで配列を出力するために試行錯誤してみる。 まず、試行する中で余計な処理をするコードを片っ端から省いていく。ここは最適化に影響しそうなところだが、とりあえず無視。 diff --git a/src/main/scala/firrtl/Emitter.scala b/src/main/scala/firrtl/…
ChiselからVerilogを生成すると、配列参照の記述は最終的に除去され、とんでもないVerilogが生成されることはよくある。 これをVerilogでそのまま配列で出力する方法を探しているのだが、試行錯誤でなかなかうまく進まない。 まず、passes.RemoveAccessesパ…
https://ammonite.io/ Chise(というかScala)を動かすために、わざわざbuild.sbtを作るのが面倒くさい。簡単にChiselを扱うことができないか、いろいろ調査していたら、Ammoniteというインタプリタあるのを発見した。 ammonite.io Ammoniteのインストールは以…
ChiselからVerilogを生成すると、配列参照の記述は最終的に除去され、とんでもないVerilogが生成されることはよくある。例えば以下のようなFIRを書いたとすると、 circuit VecModules : module VecModules : input in: UInt<1>[16] input sel: UInt<4> outpu…
FIRでAsync Resetの作り方が分かったので、練習問題としてNegative EdgeのAsynchronous Resetを作ってみようかと思う。 Async Resetは専用の型が定義されていたので、同様にNegative EdgeのAsync Resetの型を定義してみる。 firrtl/src/main/scala/firrtl/ir…
単純なデータパスであれば簡単にFIRの記述を書くことができる。次に、レジスタアップデートについて挙動を確認しよう。レジスタアップデートには、クロックとリセットの記述が必要である。 クロックは独自の型が定義されているが、リセットは独自の型が定義…
現在FIRRTLでは出力オプションに-X sverilogを追加することができ、これは一応SystemVerilog出力用のコンパイラであるのだが、実際に適用してみると、 ------------------------------------------------------------------------------ Warning: SystemVeri…
FIRRTLのコンパイルオプション・というか生成ファイルオプションには以下が存在する。 none : NoneCompiler() を呼び出す。特に何もしない。 hi : HighFirrtlCompiler()を呼び出す。 low : LowFirrtlCompiler()を呼び出す。 middle : MiddleFirrtlCompiler()…
FIRRTLのパーサがANTLRで作られていることが分かったので、これを使えば遊べるような気がしてきた。C++向けにFIRRTLの文法ファイルを変換して、C++で簡易パーサを作って遊んでみる。 まず、ANTLR4のランタイムをダウンロードした。C++用のANTLRランタイムを…
FIRRTLは入力ファイルとして.firファイルを指定することができる。ということは、FIRファイルのファイルを読み込んで、Parseして、構文解析木を生成する場所があるはずである。それを調査した。 どうやらFIRRTLのコマンドラインを立ち上げたときは、FirrtlCl…
まずはfirrtlに取り込まれる引数を確認した。以下のようにprintlnを挿入した。 firrtl/options/Stage.scala final def execute(args: Array[String], annotations: AnnotationSeq): AnnotationSeq = { println("execute : args") for (i <- 0 until args.siz…
FIRRTLの動作を解析するためには、Scalaの総合開発環境としてIntelliJ IDEAをインストールしておくのが良い。 これまでインストールしていなかったので、これを機にインストールしておこう。 www.jetbrains.com 無料版のCommunity EditionのLinux版をダウン…