Внутренние компоненты отладочного модуля в долоте

#chisel #chiseltest

Вопрос:

У меня есть сложный модуль, написанный на зубиле. Я использую chiseltest, чтобы проверить его работу. Тест провалился. Я хочу иметь возможность проверять внутренние значения проводов модуля, чтобы отладить, что происходит не так. Поскольку PeekPokeTester позволяет мне проверять только значение сигналов ввода-вывода, как я могу проверить внутренние провода?

Вот пример:

 import chisel3._

class MyModule extends Module {
  val io = IO(new Bundle {
    val a = Input(Bool())
    val b = Input(Bool())
    val c = Input(Bool())
    val d = Output(Bool())
  })

  val i = Wire(Bool())
  i := io.a ^ io.b

  io.d := i | io.c
}
 
 import chisel3._
import chisel3.tester._
import org.scalatest.FreeSpec

class MyModuleTest extends FreeSpec with ChiselScalatestTester {
  "MyModule should work properly" in {
    test(new MyModule) { dut =>
      dut.io.a.poke(true.B)
      dut.io.b.poke(false.B)
      dut.io.c.poke(false.B)
      dut.i.expect(true.B)  // This line throws a java.util.NoSuchElementException
                            // : key not found: Bool(Wire in MyModule)
    }
  }
}
 

Как я могу проверить промежуточное значение «i»?

Ответ №1:

Есть несколько способов сделать это.

1 ) Включите вывод VCD, добавив аннотацию к вашему тесту, как в

 import chiseltest.experimental.TestOptionBuilder._
import treadle._
...
test(new MyModule).withAnnotations(Seq(WriteVcdAnnotation)) { dut =>
 

Файл .vcd будет помещен в соответствующий test_run_dir/ вы можете просмотреть его с помощью GtkWave или аналогичного

2 ) добавьте printf инструкции в свой модуль.

3 ) В репозитории Treadle есть оболочка моделирования, которая позволяет вам заглядывать и выполнять шаги на основе файла firrtl (файл firrtl должен находиться в том же каталоге test_run_dir/, что и выше). Здесь есть немного документации

Удачи!