summaryrefslogtreecommitdiff
path: root/src/test/scala/chiselTests/StrongEnum.scala
diff options
context:
space:
mode:
authorJack2022-11-11 06:53:04 +0000
committerJack2022-11-11 06:53:04 +0000
commit3ce953c81f06519351c48277e3474b5720ec07ff (patch)
treeac79dcb80d0528c2ae86ca21da4cf424715ab645 /src/test/scala/chiselTests/StrongEnum.scala
parentadccde9998c91875e5490cff6d5822ffacc593ed (diff)
parentc8046636a25474be4c547c6fe9c6d742ea7b1d13 (diff)
Merge branch '3.5.x' into 3.5-release
Diffstat (limited to 'src/test/scala/chiselTests/StrongEnum.scala')
-rw-r--r--src/test/scala/chiselTests/StrongEnum.scala68
1 files changed, 68 insertions, 0 deletions
diff --git a/src/test/scala/chiselTests/StrongEnum.scala b/src/test/scala/chiselTests/StrongEnum.scala
index 44ed77f9..e9f412fe 100644
--- a/src/test/scala/chiselTests/StrongEnum.scala
+++ b/src/test/scala/chiselTests/StrongEnum.scala
@@ -5,6 +5,7 @@ package chiselTests
import chisel3._
import chisel3.experimental.ChiselEnum
import chisel3.experimental.AffectsChiselPrefix
+import chisel3.experimental.suppressEnumCastWarning
import chisel3.internal.firrtl.UnknownWidth
import chisel3.stage.{ChiselGeneratorAnnotation, ChiselStage}
import chisel3.util._
@@ -163,6 +164,27 @@ class StrongEnumFSM extends Module {
}
}
+object Opcode extends ChiselEnum {
+ val load = Value(0x03.U)
+ val imm = Value(0x13.U)
+ val auipc = Value(0x17.U)
+ val store = Value(0x23.U)
+ val reg = Value(0x33.U)
+ val lui = Value(0x37.U)
+ val br = Value(0x63.U)
+ val jalr = Value(0x67.U)
+ val jal = Value(0x6f.U)
+}
+
+class LoadStoreExample extends Module {
+ val io = IO(new Bundle {
+ val opcode = Input(Opcode())
+ val load_or_store = Output(Bool())
+ })
+ io.load_or_store := io.opcode.isOneOf(Opcode.load, Opcode.store)
+ printf(p"${io.opcode}")
+}
+
class CastToUIntTester extends BasicTester {
for ((enum, lit) <- EnumExample.all.zip(EnumExample.litValues)) {
val mod = Module(new CastToUInt)
@@ -481,6 +503,46 @@ class StrongEnumSpec extends ChiselFlatSpec with Utils {
(log should not).include("warn")
}
+ it should "suppress warning using suppressEnumCastWarning" in {
+ object TestEnum extends ChiselEnum {
+ val e0, e1, e2 = Value
+ }
+
+ class MyModule extends Module {
+ val in = IO(Input(UInt(2.W)))
+ val out = IO(Output(TestEnum()))
+ suppressEnumCastWarning {
+ val res = TestEnum(in)
+ out := res
+ }
+ }
+ val (log, _) = grabLog(ChiselStage.elaborate(new MyModule))
+ (log should not).include("warn")
+ }
+
+ it should "suppress exactly one warning using suppressEnumCastWarning" in {
+ object TestEnum1 extends ChiselEnum {
+ val e0, e1, e2 = Value
+ }
+ object TestEnum2 extends ChiselEnum {
+ val e0, e1, e2 = Value
+ }
+
+ class MyModule extends Module {
+ val in = IO(Input(UInt(2.W)))
+ val out1 = IO(Output(TestEnum1()))
+ val out2 = IO(Output(TestEnum2()))
+ suppressEnumCastWarning {
+ out1 := TestEnum1(in)
+ }
+ out2 := TestEnum2(in)
+ }
+ val (log, _) = grabLog(ChiselStage.elaborate(new MyModule))
+ log should include("warn")
+ log should include("TestEnum2") // not suppressed
+ (log should not).include("TestEnum1") // suppressed
+ }
+
"Casting a UInt to an Enum with .safe" should "NOT warn" in {
object MyEnum extends ChiselEnum {
val e0, e1, e2 = Value
@@ -514,6 +576,12 @@ class StrongEnumSpec extends ChiselFlatSpec with Utils {
it should "correctly check if the enumeration is one of the values in a given sequence" in {
assertTesterPasses(new IsOneOfTester)
}
+
+ it should "work with Printables" in {
+ ChiselStage.emitChirrtl(new LoadStoreExample) should include(
+ """printf(clock, UInt<1>("h1"), "%c%c%c%c%c", _chiselTestsOpcodePrintable[0], _chiselTestsOpcodePrintable[1], _chiselTestsOpcodePrintable[2], _chiselTestsOpcodePrintable[3], _chiselTestsOpcodePrintable[4])"""
+ )
+ }
}
class StrongEnumAnnotator extends Module {