使用 MixedVec 在凿子中使用动态参数创建 IO 包

Creating IO bundles using dynamic parameters in chisel using MixedVec

我的代码如下

class HWBLOCK(dummy_val : Int)(p : Parameters) extends Bundle{
  private val temp = Reg(Vec(dummy_val, UInt(4.W)))
  def set_temp(Index : Int, my_val : Int){ temp(Index) := my_val.U}
  def get_temp(Index : Int) : UInt = { return temp(Index) }
  override def cloneType : this.type = (new HWBLOCK(stageNumber)(p)).asInstanceOf[this.type]
}

class MyMath(p : Parameters) extends Module{
  val para = p(MyBlockKey).para
  val io = IO(new Bundle{
    val myval = Input(MixedVec((1 until para) map {i => new HWBLOCK(i)(p)})) 
})

}

现在,每当我尝试这个时,都会从躲猫猫测试员那里得到

poke(dut.io.myval(1).set_temp(1,1))

我收到这个错误

overloaded method value poke with alternatives:
[error]   (signal: chisel3.Aggregate,value: IndexedSeq[BigInt])Unit <and>
[error]   (signal: chisel3.Bundle,map: Map[String,BigInt])Unit <and>
[error]   [T <: chisel3.Element](signal: T, value: Long)(implicit evidence: chisel3.iotesters.Pokeable[T])Unit <and>
[error]   [T <: chisel3.Element](signal: T, value: Int)(implicit evidence: chisel3.iotesters.Pokeable[T])Unit <and>
[error]   [T <: chisel3.Element](signal: T, value: BigInt)(implicit evidence: chisel3.iotesters.Pokeable[T])Unit <and>
[error]   (path: String,value: Long)Unit <and>
[error]   (path: String,value: Int)Unit <and>
[error]   (path: String,value: BigInt)Unit
[error]  cannot be applied to (Unit)
[error]         poke(dut.io.myval(1).set_temp(1,1))

现在我有两个问题:

  1. 我能否以某种方式避免在 HWBLOCK 中使用 private val,这样我就不必使用函数来设置和获取值?我使用 private 的原因是因为这个

The only caveat is if you are passing something of type Data as a "generator" parameter, in which case you should make it a private val. github.com/freechipsproject/chisel3/wiki/Bundles-and-Vecs

  1. 如果我必须使用 private,有没有办法可以使用 peekpoketesters 访问 HWBLOCK 中的方法 class。

chisel-testers 和 chiseltest 中的 peek/poke 测试人员都将模块视为黑盒,唯一的数据进出方式是通过顶层 IO。在我看来,您正试图绕过该限制。我认为没有一种方法会奏效。如果您需要在内部硬件块中设置一些寄存器,您需要提供 IO 来设置和获取它。如果这是出于一次性诊断目的,您可以考虑使用 BoringUtils 授予访问权限。

是否有您试图通过在捆绑包中设置寄存器来解决的特定用例?您应该考虑将 HWBLOCK 重构为一个模块,并使用 scala 的强大功能以方便的方式连接每个 HWBLOCK 的 IO。