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