捆绑软件的Vec作为模块参数

问题描述 投票:1回答:2

我正在编写Wishbone Intercon模块以使地址自动解码。我有两个Bundle类,它们描述了Wishbone主接口和Wishbone从接口。

class WbMaster (val dwidth: Int,
                val awidth: Int) extends Bundle {
    val adr_o = Output(UInt(awidth.W))
//...
    val cyc_o = Output(Bool())
}

// Wishbone slave interface
class WbSlave (val dwidth: Int,
               val awidth: Int) extends Bundle {
  val adr_i = Input(UInt(awidth.W))
//...
  val cyc_i = Input(Bool())
}

我想像以下将这些Bundle作为参数传递给我的模块Wishbone:

class WbInterconOneMaster(val awbm: WbMaster,
                          val awbs: Vec(WbSlave)) extends Module {
    val io = IO(new Bundle{
      val wbm = Flipped(new WbMaster(awbm.dwidth, awbm.awidth))
      val wbs = Vec(?)
    })
}

目的是允许数量不等的叉骨从属设备,并让模块进行连接。如下所示:

  val spi2Wb = Module(new Spi2Wb(dwidth, awidth))
  val wbMdio1 = Module(new MdioWb(mainFreq, targetFreq))
  val wbMdio2 = Module(new MdioWb(mainFreq, targetFreq))

  val slavesVec = Vec(Seq(wbMdio1, wbMdio2))

  val wbIntercon = Module(new WbIntercon(spi2Wb.io.wbm, slavesVec))

问题有多个:

  • 这是正确的方法吗?
  • 如何在模块参数中声明Vec()?

我尝试过,但是不起作用:

// Wishbone Intercone with one master and several slaves
// data bus is same size as master
class WbInterconOneMaster(val awbm: WbMaster,
                          val awbs: Vec[Seq[WbSlave]]) extends Module {
    val io = IO(new Bundle{
      val wbm = Flipped(new WbMaster(awbm.dwidth, awbm.awidth))
      val wbs = Vec.fill(awbs.size){awbs.map(_.cloneType())}
    })
}
scala hdl chisel
2个回答
1
投票

尝试将您的参数考虑为所需类型的生成器。以下是这个想法的一个玩具示例。在这种情况下,一个构造函数参数bgen是一个生成器方法,它将返回Bundle的一个实例。它显示了此生成器的用法,也作为Vec

的一部分
class BundleX extends Bundle {
  val a = UInt(8.W)
  val b = UInt(8.W)
}

class ModuleX(bgen: () => BundleX, numInputs: Int) extends Module {
  val io = IO(new Bundle{
    val in1  = Input(Vec(numInputs, bgen()))
    val out1 = Output(bgen())
  })
  // output fields a and b are the the sum of all the corresponding inputs
  io.out1.a := io.in1.foldLeft(0.U) { case (res, value) => res +% value.a}
  io.out1.b := io.in1.foldLeft(0.U) { case (res, value) => res +% value.b}
}

class BundleXSpec extends ChiselPropSpec {
  property("testname") {
    elaborate(new ModuleX(() => new BundleX, 4))
  }
}

0
投票

I found a solution与MixedVec(实验)模块。我只是简单地将WbSlave Bundle的Seq传递为模块参数,然后制作了MixedVec(WbSlave实际上可以具有不同的参数):

class WbInterconOneMaster(val awbm: WbMaster,
                          val awbs: Seq[WbSlave]) extends Module {
    val io = IO(new Bundle{
      val wbm = Flipped(new WbMaster(awbm.dwidth, awbm.awidth))
      val wbs = MixedVec(awbs.map{i => new WbSlave(i.dwidth, i.awidth)})
    })

    io.wbm.dat_i := 0.U
    io.wbm.ack_i := 0.U
    for(i <- 0 until io.wbs.size){
      io.wbs(i).dat_o := 0.U
      io.wbs(i).ack_o := 0.U
    }
}

the testbench中进行编译。

© www.soinside.com 2019 - 2024. All rights reserved.