使用 peekpoketester 传递值时出错

Error while passing values using peekpoketester

我正在尝试通过 peekpoketester 中的 poke 方法将一些随机整数(我已存储在数组中)作为输入传递到我的硬件。但我收到此错误:

chisel3.internal.ChiselException:错误:不在 UserModule 中。可能的原因:缺少 Module() 包装、裸凿 API 调用,或试图在 BlackBox 中构建硬件。

可能是什么原因?我认为我在这里不需要模块包装,因为这不是硬件。

class TesterSimple (dut: DeviceUnderTest)(parameter1 : Int)(parameter2 : Int) extends
PeekPokeTester (dut) {
 var x = Array[Int](parameter1) 
 var y = Array[Int](parameter2) 
 var z = 1 
 poke(dut.io.IP1, z.asUInt)
 for(i <- 0 until parameter1){poke(dut.io.IP2(i), x(i).asUInt)}
 for(j <- 0 until parameter2){poke(dut.io.IP3(j), y(j).asUInt)}
}

object TesterSimple extends App {
 implicit val parameter1 = 2
 implicit val parameter2 = 2
 chisel3.iotesters.Driver (() => DeviceUnderTest(parameter1 :Int, parameter2 :Int)) { c =>
 new TesterSimple (c)(parameter1, parameter2)}
}

能不能也分享一下你的DUT? 我相信最有可能的情况是您的 DUT 没有扩展 Module

我有几点建议。

  1. 主要问题,我认为你没有正确初始化数组
    1. 尝试使用 Array.fillArray.tabulate 创建和初始化数组
  val rand = scala.util.Random
  var x = Array.fill(parameter1)(rand.nextInt(100))
  var y = Array.fill(parameter2)(rand.nextInt(100))
  1. 您不需要 poke 中的 .asUInt,它接受 Ints 或 BigInts
  2. 定义硬件常量时,使用.U而不是.asUInt,后者是一种铸造其他凿子类型的方法,它确实有效,但它是向后兼容的东西。
  3. 变量或方法最好不要以大写字母开头
  4. 如果您愿意,我建议我们 class DutName(val parameter1: Int, val parameter2: Int)class DutName(val parameter1: Int)(val parameter2: Int)
    1. 这将允许您在编写测试时使用 dut 的参数。
    2. 例如for(i <- 0 until dut.parameter1){poke(dut.io.IP2(i), x(i))}
    3. 这将使您不必在 DUT 和测试仪上复制参数对象

祝你好运!