FPGA開発日記

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

ハードウェア記述言語Chiselコンパイラの内部解析(2. Chiselコンパイルのフローを追いかける)

https://cdn-ak.f.st-hatena.com/images/fotolife/m/msyksphinz/20181105/20181105012126.png

ハードウェア記述言語ChiselはScalaのプラットフォームの上に構築されている。大きく分けて2つのリポジトリから構成されている。

chisel3のリポジトリは、ChiselのコードをFIRへ変換する。firrtlのリポジトリは、FIRのコードをVerilogに変換する。

以下のようなコードでsimple.scalaコンパイルすると、emitVerilogが呼び出される。

  • simple.scala
class simple extends Module {
...
}
object simple extends App {
  chisel3.Driver.emitVerilog(new simple())
}

printデバッグを行うと、chisel3リポジトリchisel3/src/main/scala/chisel3/Driver.scala内のemitVerilog()execute()が呼び出されることが分かる。

とりあえずはtargetsの変換を見てみることにした。

    val targets =
      Seq( classOf[DriverCompatibility.AddImplicitOutputFile],
           classOf[DriverCompatibility.AddImplicitOutputAnnotationFile],
           classOf[DriverCompatibility.DisableFirrtlStage],
           classOf[ChiselStage],
           classOf[DriverCompatibility.MutateOptionsManager],
           classOf[DriverCompatibility.ReEnableFirrtlStage],
           classOf[DriverCompatibility.FirrtlPreprocessing],
           classOf[chisel3.stage.phases.MaybeFirrtlStage] )

それぞれ以下に実装がある。それぞれのクラスのtransform()が呼ばれるらしい。

  • AddImplicitOutputFile : chisel3/src/main/scala/chisel3/stage/phases/AddImplicitOutputFile.scala
  • AddImplicitOutputAnnotationFile : chisel3/src/main/scala/chisel3/stage/phases/AddImplicitOutputAnnotationFile.scala
  • DisableFirrtlStage : chisel3/src/main/scala/chisel3/stage/phases/DriverCompatibility.scala
  • ChiselStage : chisel3/src/main/scala/chisel3/stage/ChiselStage.scala
  • MutateOptionsManager : chisel3/src/main/scala/chisel3/stage/phases/DriverCompatibility.scala
  • ReEnableFirrtlStage : chisel3/src/main/scala/chisel3/stage/phases/DriverCompatibility.scala
  • FirrtlPreprocessing : chisel3/src/main/scala/chisel3/stage/phases/DriverCompatibility.scala
  • MaybeFirrtlStage : chisel3/src/main/scala/chisel3/stage/phases/MaybeFirrtlStage.scala

最初のAnnotationのあたりはまだ理解できないので、ChiselStageのあたりを読んでみる。

  • chisel3/src/main/scala/chisel3/stage/ChiselStage.scala
class ChiselStage extends Stage with PreservesAll[Phase] {
  val shell: Shell = new Shell("chisel") with ChiselCli with FirrtlCli

  private val targets =
    Seq( classOf[chisel3.stage.phases.Checks],
         classOf[chisel3.stage.phases.Elaborate],
         classOf[chisel3.stage.phases.AddImplicitOutputFile],
         classOf[chisel3.stage.phases.AddImplicitOutputAnnotationFile],
         classOf[chisel3.stage.phases.MaybeAspectPhase],
         classOf[chisel3.stage.phases.Emitter],
         classOf[chisel3.stage.phases.Convert],
         classOf[chisel3.stage.phases.MaybeFirrtlStage] )
  • Checks : chisel3/src/main/scala/chisel3/stage/phases/Checks.scala.
    • Sanity checks an firrtl.AnnotationSeq before running the main firrtl.options.Phases of chisel3.stage.ChiselStage.
  • Elaborate : chisel3/src/main/scala/chisel3/stage/phases/Elaborate.scala.
    • Elaborate all chisel3.stage.ChiselGeneratorAnnotations into chisel3.stage.ChiselCircuitAnnotations.
  • AddImplicitOutputFile : chisel3/src/main/scala/chisel3/stage/phases/AddImplicitOutputFile.scala.
    • Add a output file for a Chisel circuit, derived from the top module in the circuit, if no ChiselOutputFileAnnotation already exists.
  • AddImplicitOutputAnnotationFile : chisel3/src/main/scala/chisel3/stage/phases/AddImplicitOutputAnnotationFile.scala.
    • Adds an firrtl.options.OutputAnnotationFileAnnotation if one does not exist. This replicates old behavior where an output annotation file was always written.
  • MaybeAspectPhase : chisel3/src/main/scala/chisel3/stage/phases/MaybeAspectPhase.scala.
    • Run AspectPhase if a chisel3.aop.Aspect is present.
  • Emiter : chisel3/src/main/scala/chisel3/stage/phases/Emitter.scala.
  • Convert : chisel3/src/main/scala/chisel3/stage/phases/Convert.scala.
  • MaybeFirrtlStage : chisel3/src/main/scala/chisel3/stage/phases/MaybeFirrtlStage.scala.
    • Run firrtl.stage.FirrtlStage if a chisel3.stage.NoRunFirrtlCompilerAnnotation is not present.
f:id:msyksphinz:20190826150622p:plain