Как сгенерировать [error] вместо [info] при обнаружении неверного значения в функцию ожидаем () - PullRequest
3 голосов
/ 20 марта 2019

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

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 голосов
/ 20 марта 2019

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

Но я хотел бы призвать вас взглянуть на freechipsproject / chisel-testers2 repo. Именно здесь команда вкладывает большую часть своего времени в разработку тестов. Его было бы легче изменить, у него есть много других полезных функций для создания модульных тестов, и мы ищем способы сделать его лучше, чем тестеры с долотами .

...