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
がいるかもしれない?
pokeによって値がセットされるのはクロックの立下り時になっている。