chisel


chiselで、仕事のverilog生成を楽にできないか考えて取り組み中

なんとか形になった気がするので、一応公開してみます。
必要箇所だけ抜粋したので、elaborateエラーが出るかもしれません。
出たら教えてください。

このconfigを読み込ますと、各信号を
io.apb_core.elements("ssp")(0).PRDATA :
のように指示できるので、for文なので、APBSELを作れるはず。

qiita.scala
package gcd
import chisel3._
import chisel3.experimental.ChiselEnum
import chisel3.experimental.{DataMirror, requireIsChiselType}
import chisel3.testers.BasicTester
import chisel3.util._
import scala.collection.immutable.ListMap
class APBSEL[Conf <: RVConfig] (conf:Conf) extends Module {
  val io = IO(new Bundle {
    val apb_master = new APBSlaveChannel
    val apb_core = new APBSlaveChannelCustom3(conf)
  })
}
class APBSlaveChannel extends Bundle {
  val  PADDR = Input(UInt(32.W))
  val  PWDATA = Input(UInt(32.W))
  val  PRDATA = Output(UInt(32.W))
  val  PSEL = Input(Bool())
  val  PENABLE = Input(Bool())
  val  PWRITE = Input(Bool())
  val  PREADY = Input(Bool())
  val  PREADYOUT = Output(Bool())
}
class APBSlaveChannelCustom3[Conf <: RVConfig](conf:Conf) extends Record {
  println(conf.insts_info)
  var elts = Array(("",0));  //OK
  conf.insts_info.foreach{ case (key,array) =>
    elts = elts :+ (key,array(0))
  }
  println(elts)
  val elements = ListMap( elts map { case (inst,num) =>
    s"$inst" -> Vec(num,Flipped((new APBSlaveChannel)))
  }:_*)
  def apply: Data = elements("APBSlaveChannel")
  override def cloneType: this.type = (new APBSlaveChannelCustom).asInstanceOf[this.type]
}

abstract class RVConfig()
{
  val ADDR_MAX_TOP = 0x40226fff
  val ADDR_MAX_TOP = 0x40226000
  val insts_info = scala.collection.mutable.LinkedHashMap[String, Array[Int]]()
  insts_info += ("uart" -> Array(4,0x40))
  insts_info += ("ssp" -> Array(4,0x40))
}
case class RV64ISynth() extends RVConfig
{
}