e-tipsmemo

ごった煮

Generate Hi/Mid/Lo FIRRTL

FIRRTLの抽象度?別を確認する。

object counterMain extends App {
  var uargs = Array("-X", "middle") //ここをかえる high middle low
  val FIRRTLString =
    // (new chisel3.stage.ChiselStage).emitVerilog(new counter(32))
    (new chisel3.stage.ChiselStage).emitFirrtl(new counter(32), uargs)
}

high-FIRRTL


EmitVerilogをするときに生成されるFIRRTLとくらべて、

skip @[counter.scala 15:27]

が無い

middle-FIRRTL

firrtl/spec.pdf at master · chipsalliance/firrtl · GitHub
https://raw.githubusercontent.com/chipsalliance/firrtl/master/spec/spec.pdf
によると、

The conditional statement is not used.

すでにwhen文はなく、muxになった。

low-FIRRTL


ポート宣言のフィールドがすべて展開されている。
EmitVerilogでlo-FIRRTLを生成したところ、16-17行目が意味ないのでskipに置き換わっていた。

FIRRTLの文法について

FIRRTLを定義しているANTLRの文法ファイルに
firrtl/FIRRTL.g4 at master · chipsalliance/firrtl · GitHub

もっとも気にしていたのはelse whenがFIRRTLに出てくるのかどうかという点で

when:
	'when' exp ':' info? suite? (
		'else' ( when | ':' info? suite?)
	)?;

これは読みやすさのために、else when を可能としているだけで、
出力されるFIRRTLには出てこないようだった。
また読みやすさのために、when-elseの中身が一行だけの時は、
そのブロックを一行にすることもできるらしい。
読みやすい?
f:id:katakanan:20210208131648p:plain

The Definitive ANTLR 4 Reference

The Definitive ANTLR 4 Reference

  • 作者:Parr, Terence
  • 発売日: 2013/01/29
  • メディア: ペーパーバック