続chiselでリファクタリングしてみました(for/vec/reduce)
前回、chiselでinterfaceが良い感じでにかけることがわかりました。 すると、次にレジスタモジュールを良い感じで書きたくなりました。 レジスタを複数書くには、verilogだと、generate文を使えば良いと思います。 では、chiselだと?と思い、調べました!!
- モジュールの複数Instance化はfor文で書く
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やらです。
配列のReduceはreduce関数を使用 (bit演算ならorR, andRで良いはずです)
io.out := io.input.reduce( + )
というわけで、↑で学んだことを生かして、以下にてコードを更新してみました。 大分良い感じで書けてきていると思います!
mod Slave Module. Add regsM · moamoai/AXI_interface@7cef393 · GitHub
あとがき
というわけで、設計はひどいままですが、リファクタリングが進んできました笑 多分parameterに配列を渡せるので、それを使えばもっとエレガントに書ける気がしましたが、今回はおいときました。
次はchiselでDMAもしくはフィルタ回路をいんちきに作ろうと思います。