FPGA開発日記

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

Chiselでモジュールを再帰インスタンスする方法

f:id:msyksphinz:20190119013850p:plain

Chiselでモジュールを書く場合の、いくつか便利な書き方をまとめておく。

Chiselで再帰を書く

この程度だったらVerilogでも可能。

class recurse_module (w: Int = 5) extends Module {
  val io = IO(new Bundle {
    val inst = Input(UInt(2.W))
    val dec = Output(UInt(20.W))
  })

  if (w == 1) {
    io.dec := io.inst
  } else {
    val u_mod = Module (new recurse_module(w-1))
    u_mod.io.inst := io.inst + 1.U
    io.dec := Cat(0.U(1.W), u_mod.io.dec)
  }
}

生成されたVerilogは、ひたすらモジュールがコピーされる。つまり、パラメータで静的に解析できなければ無理。w: Intコンパイル時に静的に決定できる必要がある。

module recurse_module( // @[:@3.2]
module recurse_module_1( // @[:@10.2]
  recurse_module recurse_module ( // @[option_some.scala 35:24:@15.4]
module recurse_module_2( // @[:@24.2]
  recurse_module_1 recurse_module ( // @[option_some.scala 35:24:@29.4]
module recurse_module_3( // @[:@38.2]
  recurse_module_2 recurse_module ( // @[option_some.scala 35:24:@43.4]
module recurse_module_4( // @[:@52.2]
  recurse_module_3 recurse_module ( // @[option_some.scala 35:24:@57.4]
module recurse_module_5( // @[:@66.2]
  recurse_module_4 recurse_module ( // @[option_some.scala 35:24:@71.4]
module recurse_module_6( // @[:@80.2]
  recurse_module_5 recurse_module ( // @[option_some.scala 35:24:@85.4]
module recurse_module_7( // @[:@94.2]
  recurse_module_6 recurse_module ( // @[option_some.scala 35:24:@99.4]
module recurse_module_8( // @[:@108.2]
  recurse_module_7 recurse_module ( // @[option_some.scala 35:24:@113.4]
module recurse_module_9( // @[:@122.2]
  recurse_module_8 recurse_module ( // @[option_some.scala 35:24:@127.4]