首页 > 解决方案 > 如何创建 Chisel 模块的数组/vec

问题描述

我创建了一个名为 SaturatingCounter 的 CHISEL 类(扩展)模块(下面的代码以防万一)。

我想要另一个模块中的这些计数器的数组/序列。

编辑:我找到了这个答案。但是当我尝试

 val vec_of_elements = Vec.fill(10) {Module(SaturatingCounter(4)).io}

我收到一个错误

Error:(72, 29) value fill is not a member of object chisel3.Vec
  val vec_of_elements = Vec.fill(10) {Module(SaturatingCounter(4)).io}

原始问题的其余部分

所以我尝试创建一个 Vec ,如下所示。这不起作用,因为我的类不是数据类型。我可以让它继承数据,但因为我仍然是一个看起来像一个大飞跃的初学者。

var foo = Vec(10,SaturatingCounter(4))

错误信息:

Error:(46, 23) inferred type arguments [something.SaturatingCounter] do not conform to method apply's type parameter bounds [T <: chisel3.Data]
  var foo = Vec(10,SaturatingCounter(4))

Error:(46, 47) type mismatch;
 found   : something.SaturatingCounter
 required: T
  var foo = Vec(10,SaturatingCounter(4))

是创建 SaturatingCounter 的数组/序列的正确解决方案吗?

饱和计数器

class SaturatingCounter (bits: Int) extends Module {
  require(bits >= 2)
  val io = IO(new Bundle {
    val valOut: SInt = Output(SInt(bits.W))
    val inc: SInt = Input(SInt(bits.W))
  })

  val count = RegInit(SInt(bits.W), 0.S)

  val minVal: SInt = ((1 << (bits-1)).asUInt())(bits-1,0).asSInt()
  val maxVal: SInt = (((1 << bits) - 1) >> 1).asSInt(bits.W)

  var sum : SInt = count + io.inc

  var operandsSignSame : Bool = io.inc(bits-1) === count(bits-1)
  var sumSignDifferent: Bool = sum(bits-1) =/= count(bits-1)

  when(operandsSignSame && sumSignDifferent) {
    when(count(bits-1)) {
      count := minVal
    }.otherwise {
      count := maxVal
    }
  }.otherwise {
    count := sum
  }
  io.valOut := count
}

object SaturatingCounter {
  def apply(bits: Int): SaturatingCounter = new SaturatingCounter(bits)
}

标签: chisel

解决方案


尝试使用它来创建模块并访问它们的io.

  val vec_of_elements = Vec(10, Module(SaturatingCounter(4)).io)

这对我有用。

注意.io, 通过添加你得到一些类型Data并且你可以访问io你在这里创建的所有模块。

一般来说,如果你想使用基于硬件的元素索引,或者你的元素是 IO 的一部分,你只需要一个 Vec。如果你不需要,你可以使用 Scala 集合,如 Seq、Array 或类似的。


推荐阅读