如何在 expect() 中看到错误值时生成 [error] 而不是 [info]

How to generate an [error] instead of an [info] upon seeing a wrong value in expect()

考虑以下代码:

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 对于 expect 失败更有意义。有人担心更改此设置可能会对正在寻找该字符串的现有用户产生意想不到的后果。

但我想鼓励您看一下 freechipsproject/chisel-testers2 存储库。这是团队投入大部分测试开发时间的地方。它会更容易改变,它有很多其他用于构建单元测试的好特性,我们正在寻找方法让它比 chisel-testers.