Как сгенерировать [ошибку] вместо [info] при виде неправильного значения в expect()

#scala #testing #sbt #chisel

#скала #тестирование #sbt #долото #scala #зубило

Вопрос:

Рассмотрим следующий код:

 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:

Сначала простая часть. Вы можете получить ненулевой код результата, используя результат 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. Именно на это команда тратит большую часть своего времени на тестирование и разработку. Его было бы проще изменить, в нем есть много других полезных функций для построения модульных тестов, и мы ищем способы сделать его лучше, чем chisel-тестировщики.