summaryrefslogtreecommitdiff
path: root/src/test/scala/chiselTests/util/experimental/PlaSpec.scala
blob: 156249a2b4130e4462fb19b693ca177faa89473a (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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
package chiselTests.util.experimental

import chisel3._
import chisel3.stage.PrintFullStackTraceAnnotation
import chisel3.testers.BasicTester
import chisel3.util.{pla, BitPat}
import chiselTests.ChiselFlatSpec

class PlaSpec extends ChiselFlatSpec {
  "A 1-of-8 decoder (eg. 74xx138 without enables)" should "be generated correctly" in {
    assertTesterPasses(new BasicTester {
      val table = Seq(
        (BitPat("b000"), BitPat("b00000001")),
        (BitPat("b001"), BitPat("b00000010")),
        (BitPat("b010"), BitPat("b00000100")),
        (BitPat("b011"), BitPat("b00001000")),
        (BitPat("b100"), BitPat("b00010000")),
        (BitPat("b101"), BitPat("b00100000")),
        (BitPat("b110"), BitPat("b01000000")),
        (BitPat("b111"), BitPat("b10000000"))
      )
      table.foreach {
        case (i, o) =>
          val (plaIn, plaOut) = pla(table)
          plaIn := WireDefault(i.value.U(3.W))
          chisel3.assert(
            plaOut === o.value.U(8.W),
            "Input " + i.toString + " produced incorrect output BitPat(%b)",
            plaOut
          )
      }
      stop()
    })
  }

  "An active-low 1-of-8 decoder (eg. inverted 74xx138 without enables)" should "be generated correctly" in {
    assertTesterPasses(new BasicTester {
      val table = Seq(
        (BitPat("b000"), BitPat("b00000001")),
        (BitPat("b001"), BitPat("b00000010")),
        (BitPat("b010"), BitPat("b00000100")),
        (BitPat("b011"), BitPat("b00001000")),
        (BitPat("b100"), BitPat("b00010000")),
        (BitPat("b101"), BitPat("b00100000")),
        (BitPat("b110"), BitPat("b01000000")),
        (BitPat("b111"), BitPat("b10000000"))
      )
      table.foreach {
        case (i, o) =>
          val (plaIn, plaOut) = pla(table, BitPat("b11111111"))
          plaIn := WireDefault(i.value.U(3.W))
          chisel3.assert(
            plaOut === ~o.value.U(8.W),
            "Input " + i.toString + " produced incorrect output BitPat(%b)",
            plaOut
          )
      }
      stop()
    })
  }

  "#2112" should "be generated correctly" in {
    assertTesterPasses(new BasicTester {
      val table = Seq(
        (BitPat("b000"), BitPat("b?01")),
        (BitPat("b111"), BitPat("b?01"))
      )
      table.foreach {
        case (i, o) =>
          val (plaIn, plaOut) = pla(table)
          plaIn := WireDefault(i.value.U(3.W))
          chisel3.assert(o === plaOut, "Input " + i.toString + " produced incorrect output BitPat(%b)", plaOut)
      }
      stop()
    })
  }

  "A simple PLA" should "be generated correctly" in {
    assertTesterPasses(new BasicTester {
      val table = Seq(
        (BitPat("b0000"), BitPat("b1")),
        (BitPat("b0001"), BitPat("b1")),
        (BitPat("b0010"), BitPat("b0")),
        (BitPat("b0011"), BitPat("b1")),
        (BitPat("b0100"), BitPat("b1")),
        (BitPat("b0101"), BitPat("b0")),
        (BitPat("b0110"), BitPat("b0")),
        (BitPat("b0111"), BitPat("b0")),
        (BitPat("b1000"), BitPat("b0")),
        (BitPat("b1001"), BitPat("b0")),
        (BitPat("b1010"), BitPat("b1")),
        (BitPat("b1011"), BitPat("b0")),
        (BitPat("b1100"), BitPat("b0")),
        (BitPat("b1101"), BitPat("b1")),
        (BitPat("b1110"), BitPat("b1")),
        (BitPat("b1111"), BitPat("b1"))
      )
      table.foreach {
        case (i, o) =>
          val (plaIn, plaOut) = pla(table)
          plaIn := WireDefault(i.value.U(4.W))
          chisel3.assert(
            plaOut === o.value.U(1.W),
            "Input " + i.toString + " produced incorrect output BitPat(%b)",
            plaOut
          )
      }
      stop()
    })
  }
}