#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-тестировщики.