summaryrefslogtreecommitdiff
path: root/src/test/scala/ChiselTests/BitsOps.scala
blob: 62f28038bbb04adb5f0e2733e4a176ebef10fee0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package Chisel
import Chisel.testers._
import org.scalatest._
import org.scalatest.prop._
import org.scalatest.prop.GeneratorDrivenPropertyChecks._

class BitwiseOps(w: Int) extends Module {
  val io = new Bundle {
    val a = Bits(INPUT, w)
    val b = Bits(INPUT, w)
    val not = Bits(OUTPUT, w)
    val and = Bits(OUTPUT, w)
    val or  = Bits(OUTPUT, w)
    val xor = Bits(OUTPUT, w)
  }
  io.not := ~io.a
  io.and := io.a & io.b
  io.or := io.a | io.b
  io.xor := io.a ^ io.b
}

class BitwiseOpsSpec extends ChiselSpec {

  class BitwiseOpsTester(w: Int, a: Int, b: Int) extends BasicTester {
    val mask = (1 << w)-1;
    val dut = Module(new BitwiseOps(w))
    io.done := Bool(true)
    dut.io.a := UInt(a) 
    dut.io.b := UInt(b)
    when(dut.io.not != UInt(mask & ~a)) { io.error := UInt(1) }
    when(dut.io.and != UInt(mask & (a & b))) { io.error := UInt(2) }
    when(dut.io.or  != UInt(mask & (a | b))) { io.error := UInt(3) }
    when(dut.io.xor != UInt(mask & (a ^ b))) { io.error := UInt(4) }
  }

  "BitwiseOps" should "return the correct result" in {
    forAll(safeUInts, safeUInts) { (a: Int, b: Int) =>
      assert(TesterDriver.execute{ new BitwiseOpsTester(32, a, b) }) 
    }
  }
}