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]