FIRRTLというのはハードウェア記述言語Chiselのバックエンドに相当する部分で、Chisel→FIRRTL→Verilogという段階を取り、FIRRTL→VerilogというのはLLVMで言うバックエンドに相当する部分であると説明にも書いてある。
FIRRTL自体はScalaで記述されており、動作も少しもっさりしているような印象だが、なにより生成されるVerilogファイルがイマイチな気がしている。 なんでそんなVerilog出すの?なんでこの機能ないの?といったものが散見されるので、自分で実装を理解してみることにした。
まずはダウンロードとビルドだが、現時点で安定版リリースの1.2.0を使用することにする。
git clone git@github.com:freechipsproject/firrtl.git cd firrtl sbt assembly # コンパイル
コンパイル後にサンプルプログラムとしてRocketCore.fir
をRocketCore.v
に変換してみる。
./utils/bin/firrtl -td regress -i regress/RocketCore.fir -o regress/RocketCore.v -X verilog
これでとりあえず実行は終了。RocketCore.v
が生成されている。
このRocketCore.firは6000行近くもあるのだが、流してみると8.5秒くらいかかっている。
もう少し小さな回路で確認しながら、どのような挙動になっているのか見てみたいと思う。