e-tipsmemo

ごった煮

Chisel3 Write Vcd file

Chisel3のテストを行ったものの波形が見たくなったりするかもしれないので、
テストしたときにVCDファイルを出力する手順のメモ

main/scala/example/counter.scala

シンプルなカウンターのロジックを書いた

package example

import chisel3._
import chisel3.stage._
import chisel3.stage.ChiselStage

class counter(bitWidth: Int) extends Module {
  val io = IO(new Bundle {
    val out = Output(UInt(bitWidth.W))
    val en = Input(Bool())
  })

  val counter = RegInit(UInt(bitWidth.W), 0.U)

  when(io.en) {
    counter := counter + 1.U
  }.otherwise {
    counter := counter
  }

  io.out := counter;

}

object counterMain extends App {
  val verilogString =
    (new chisel3.stage.ChiselStage).emitVerilog(new counter(32))
}

test/scala/example/counterTester.scala

package example

import chisel3._
import chiseltest._
import chiseltest.internal.WriteVcdAnnotation
import chiseltest.experimental.TestOptionBuilder._
// import treadle.{VerboseAnnotation, WriteVcdAnnotation}
import org.scalatest._
import org.scalatest.flatspec.AnyFlatSpec
import org.scalatest.matchers.should.Matchers

class counterTester
    extends AnyFlatSpec
    with ChiselScalatestTester
    with Matchers {
  behavior of "Testers2"

  it should "write vcd output when passing in a WriteVcdAnnotation" in {
    test(new counter(32)).withAnnotations(Seq(WriteVcdAnnotation)) { c =>
      c.reset.poke(true.B)
      c.clock.step()
      c.io.out.expect(0.U)
      c.reset.poke(false.B)
      c.clock.step()
      c.io.out.expect(0.U)
      c.io.en.poke(true.B)
      c.clock.step()
      c.io.out.expect(1.U)
      c.clock.step()
      c.io.out.expect(2.U)
      c.clock.step()
      c.io.out.expect(3.U)
      c.reset.poke(true.B)
      c.io.en.poke(false.B)
      c.clock.step()
      c.io.out.expect(0.U)
      c.reset.poke(false.B)
      c.clock.step()
      c.io.out.expect(0.U)
    }
  }
}

WriteVcdAnnotationを使う
chisel - Generating waveforms with ChiselTest framework - Stack Overflow
chisel-testers2/OptionsPassingTest.scala at 3e3ecc5b25b7b6bc48341ec07c7a54b7ad53bcb7 · ucb-bar/chisel-testers2 · GitHub

sbt test

-DwriteVcd=1

がいるかもしれない?

f:id:katakanan:20210115162359p:plain
pokeによって値がセットされるのはクロックの立下り時になっている。