summaryrefslogtreecommitdiff
path: root/src/test/scala/chiselTests/MulLookup.scala
blob: 0f67ea343113f78d5cba3d90ff17102c0a754455 (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
// SPDX-License-Identifier: Apache-2.0

package chiselTests

import chisel3._
import chisel3.testers.BasicTester

class MulLookup(val w: Int) extends Module {
  val io = IO(new Bundle {
    val x = Input(UInt(w.W))
    val y = Input(UInt(w.W))
    val z = Output(UInt((2 * w).W))
  })
  val tbl = VecInit(
    for {
      i <- 0 until 1 << w
      j <- 0 until 1 << w
    } yield (i * j).asUInt((2 * w).W)
  )
  io.z := tbl(((io.x << w) | io.y))
}

class MulLookupTester(w: Int, x: Int, y: Int) extends BasicTester {
  val dut = Module(new MulLookup(w))
  dut.io.x := x.asUInt
  dut.io.y := y.asUInt
  assert(dut.io.z === (x * y).asUInt)
  stop()
}

class MulLookupSpec extends ChiselPropSpec {

  property("Mul lookup table should return the correct result") {
    forAll(smallPosInts, smallPosInts) { (x: Int, y: Int) =>
      assertTesterPasses { new MulLookupTester(3, x, y) }
    }
  }
}