2017-05-03 1 views
2

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?

Antwort

0

Liegt das nahe bei dem, was Sie vorhaben? Es ist viel mehr Schattierung in Form. Ich war nicht in der Lage, das Gen-Zeug hier arbeiten zu lassen (es gibt irgendeine seltsame Interaktion mit Meißel), und ich bin mit FreeSpec vertrauter, also begann ich damit. Ich habe auch einen Printf und einen Println geworfen, damit du glaubst, dass es funktioniert. Dies funktioniert auch mit dem Interpreter-Backend.

import org.scalatest.FreeSpec 
import org.scalacheck.Prop.AnyOperators 
import chisel3._ 
import chisel3.iotesters.PeekPokeTester 

class Add2 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 
    printf("%d = %d + %d\n", io.o, io.a, io.b) 
} 

class ScalaTestyTester extends FreeSpec { 
    "scalatest verilator test" in { 
    iotesters.Driver.execute(Array("--backend-name", "verilator"),() => new Add2) { c => 
     new PeekPokeTester(c) { 
     for(_ <- 0 until 10) { 
      val a = BigInt(G.width, scala.util.Random) 
      val b = BigInt(G.width, scala.util.Random) 
      println(s"testing a = $a b = $b") 
      val result = (a + b) & ((1 << G.width) - 1) 
      poke(c.io.a, a) 
      poke(c.io.b, b) 
      step(1) 
      peek(c.io.o) ?= result 
     } 
     } 
    } 
    } 
} 
+0

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? –

Verwandte Themen