考虑以下代码:
import chisel3._
import chisel3.util._
import chisel3.iotesters._
class Inverter extends Module {
val io = IO(new Bundle {
val a = Input(UInt(4.W))
val s = Output(UInt(4.W))
})
io.s := ~io.a
}
class InverterTester(c: Inverter) extends PeekPokeTester(c) {
poke(c.io.a, 8)
step(1)
expect(c.io.s, 8) // Should be 7 here
}
object TestMain extends App {
chisel3.iotesters.Driver.execute(args, () => new Inverter()) {
c => new InverterTester(c)
}
}
现在我运行 sbt 'test:runMain TestMain'
并得到这一行(info
为紫色):
[info] [0.002] EXPECT AT 1 io_s got 7 expected 8 FAIL
sbt
的退出值为零。
我需要那条线是错误的(红色):
[error] [0.002] EXPECT AT 1 io_s got 7 expected 8 FAIL
以及使上述 sbt
命令以非零值退出。
如何在对现有代码进行最少更改的情况下实现它?
最佳答案
首先是简单的部分。您可以像这样使用 chisel.execute 的结果来获得非零结果代码。
val result = chisel3.iotesters.Driver.execute(args, () => new Inverter()) {
c => new InverterTester(c)
}
System.exit(if(result) 0 else 1)
不幸的是,更改日志记录级别需要更改 chisel-testers 存储库中的每个单独的后端。以下是更改三者之一的 TreadleBackend.scala 的示例。
def expect(signal: InstanceId, expected: BigInt, msg: => String)
(implicit logger: TestErrorLog, verbose: Boolean, base: Int) : Boolean = {
signal match {
case port: Element =>
val name = portNames(port)
val got = treadleTester.peek(name)
val good = got == expected
if (!good) {
logger error
s"""EXPECT AT $stepNumber $msg $name got ${bigIntToStr(got, base)} expected ${bigIntToStr(expected, base)}""" +
s""" ${if (good) "PASS" else "FAIL"}"""
}
else if (verbose) {
logger info
s"""EXPECT AT $stepNumber $msg $name got ${bigIntToStr(got, base)} expected ${bigIntToStr(expected, base)}""" +
s""" ${if (good) "PASS" else "FAIL"}"""
}
if(good) treadleTester.expectationsMet += 1
good
case _ => false
}
}
这不是一个不合理的问题,我认为 logger.error 在预期失败时更有意义。有人担心更改此设置可能会对正在寻找该字符串的现有用户产生意想不到的后果。
但我想鼓励您看一看 freechipsproject/chisel-testers2 repo 。这是团队投入大部分测试开发时间的地方。它会更容易改变,它有很多其他用于构建单元测试的好特性,我们正在寻找方法让它比 chisel-testers 更好。
关于scala - 如何在 expect() 中看到错误值时生成 [error] 而不是 [info],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55253375/