在Expect()中看到错误的值时如何生成[错误]而不是[信息]

时间:2019-03-20 03:56:32

标签: scala testing sbt chisel

考虑以下代码:

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命令。

如何在对现有代码进行最小更改的情况下实现它?

1 个答案:

答案 0 :(得分:0)

首先是简单的部分。您可以像这样使用chisel.execute的结果来获得非零结果代码。

  val result = chisel3.iotesters.Driver.execute(args, () => new Inverter()) {
    c => new InverterTester(c)
  }
  System.exit(if(result) 0 else 1)

不幸的是,要更改日志记录级别,需要更改凿子测试器存储库中的每个单独的后端。以下是更改三个实例之一的 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 更好的方法。