Hier ist der misel3-Test, der ScalaCheck verwendet, um die Eigenschaftsprüfung auf einer einfachen kombinatorischen Schaltung durchzuführen.Verwenden von ScalaCheck mit PeekPokeTester
package stackoverflow
import org.scalatest.{ Matchers, FlatSpec, GivenWhenThen}
import org.scalacheck.{ Properties, Gen, Arbitrary}
import org.scalacheck.Prop.{ forAll, AnyOperators, collect}
import chisel3._
import firrtl_interpreter.InterpretiveTester
object G {
val width = 8
}
class Add extends Module {
val io = IO(new Bundle {
val a = Input(UInt(G.width.W))
val b = Input(UInt(G.width.W))
val o = Output(UInt(G.width.W))
})
io.o := io.a + io.b
}
class AddTester {
val s = chisel3.Driver.emit(() => new Add)
val tester = new InterpretiveTester(s)
def run(a : Int, b : Int) = {
val result = (a + b) & ((1 << G.width)-1)
tester.poke(s"io_a", a)
tester.poke(s"io_b", b)
tester.peek(s"io_o") ?= result
}
}
object AddTest extends Properties("Add") {
val t = new AddTester
val gen = Gen.choose(0,(1 << G.width)-1)
property("Add") = forAll(gen, gen) {
case (a:Int,b:Int) => t.run(a, b)
}
}
Dies verwendet den frtrtl-Interpreter direkt. Weiß jemand, wie man etwas Ähnliches mit dem PeekPokeTester macht, damit ich auch den Verilator und die vcs-Backends benutzen kann?
Ich hatte auf eine skalacheck-artige Lösung gehofft. Mein Problem ist, dass ich die Testklasse nicht sowohl von "Eigenschaften" (scalacheck runner) als auch von "PeekPokeTester" ableiten kann. Die Delegation arbeitet mit dem frtrtl-Interpreter. Gibt es eine Möglichkeit, eine Instanz eines "PeekPokeTester" (oder eines anderen VCS-basierten Testers) zu erstellen und dann Peek/Poke-Methodenaufrufe für diese Instanz auszuführen? –