続chiselでリファクタリングしてみました(for/vec/reduce)

前回、chiselでinterfaceが良い感じでにかけることがわかりました。 すると、次にレジスタモジュールを良い感じで書きたくなりました。 レジスタを複数書くには、verilogだと、generate文を使えば良いと思います。 では、chiselだと?と思い、調べました!!

val my_args = Seq(1,2,3,4)
val exe_units = for (i <- 0 until num_units) yield{
   val exe_unit = Module(new AluExeUnit(args = my_args(i)))
   // any wiring or other logic can go here
   exe_unit
}

さて、次に↑で複数Instanceをしたのだから、モジュール間の接続を設定することが必要です。

  • VecのWireを作成し、モジュールに接続
  val readys = Wire(Vec(num_regs, UInt(1.W)))
  val rdatas = Wire(Vec(num_regs, UInt(16.W)))
  val outs   = Wire(Vec(num_regs, UInt(16.W)))

  val my_args  = Seq(1,2,3,4)
  val regs = for (i <- 0 until num_regs) yield {
     val i_wrreg = Module(new WRREG(16)) // args = my_args(i)
     i_wrreg.io.i_if        <> if_reg
     readys(i) := i_wrreg.io.i_if.ready 
     rdatas(i) := i_wrreg.io.i_if.rdata
     outs(i)    := i_wrreg.io.out
  }

最後に、↑で構成したWireの配列をReduce ORしたいとなります。verilogだと&xx_arrayやらです。

というわけで、↑で学んだことを生かして、以下にてコードを更新してみました。 大分良い感じで書けてきていると思います!

mod Slave Module. Add regsM · moamoai/AXI_interface@7cef393 · GitHub

あとがき

というわけで、設計はひどいままですが、リファクタリングが進んできました笑 多分parameterに配列を渡せるので、それを使えばもっとエレガントに書ける気がしましたが、今回はおいときました。

次はchiselでDMAもしくはフィルタ回路をいんちきに作ろうと思います。