diff options
| author | Jim Lawson | 2020-07-13 11:26:43 -0700 |
|---|---|---|
| committer | GitHub | 2020-07-13 11:26:43 -0700 |
| commit | 417fc2adac01d47bd824d5851bda7baed4d92810 (patch) | |
| tree | bc220dafb3b0ebe8816506f1afbcecd0bf94478f /src/test | |
| parent | ac3ad980dd2e5abd43f3b36ecb1fb95b626aa398 (diff) | |
Provide an implementation of litOption() for BundleLits (#1280)
Diffstat (limited to 'src/test')
| -rw-r--r-- | src/test/scala/chiselTests/BundleLiteralSpec.scala | 43 |
1 files changed, 42 insertions, 1 deletions
diff --git a/src/test/scala/chiselTests/BundleLiteralSpec.scala b/src/test/scala/chiselTests/BundleLiteralSpec.scala index baf1022e..a166a461 100644 --- a/src/test/scala/chiselTests/BundleLiteralSpec.scala +++ b/src/test/scala/chiselTests/BundleLiteralSpec.scala @@ -8,6 +8,7 @@ import chisel3.testers.BasicTester import chisel3.experimental.BundleLiterals._ import chisel3.experimental.BundleLiteralException import chisel3.experimental.ChiselEnum +import chisel3.experimental.FixedPoint class BundleLiteralSpec extends ChiselFlatSpec with Utils { object MyEnum extends ChiselEnum { @@ -22,6 +23,30 @@ class BundleLiteralSpec extends ChiselFlatSpec with Utils { val c = MyEnum() } + class LongBundle extends Bundle { + val a = UInt(48.W) + val b = SInt(32.W) + val c = FixedPoint(16.W, 4.BP) + } + + "bundle literals" should "pack" in { + assertTesterPasses{ new BasicTester { + val bundleLit = (new MyBundle).Lit(_.a -> 42.U, _.b -> false.B, _.c -> MyEnum.sB) + bundleLit.litOption should equal (Some(169)) // packed as 42 (8-bit), false=0 (1-bit), sB=1 (1-bit) + chisel3.assert(bundleLit.asUInt() === bundleLit.litOption.get.U) // sanity-check consistency with runtime + + val longBundleLit = (new LongBundle).Lit( + _.a -> 0xDEADDEADBEEFL.U, _.b -> (-0x0BEEF00DL).S(32.W), _.c -> 4.5.F(16.W, 4.BP)) + longBundleLit.litOption should equal (Some( + (BigInt(0xDEADDEADBEEFL) << 48) + + (BigInt(0xFFFFFFFFL - 0xBEEF00DL + 1) << 16) + + BigInt(72))) + chisel3.assert(longBundleLit.asUInt() === longBundleLit.litOption.get.U) + + stop() + } } + } + "bundle literals" should "work in RTL" in { val outsideBundleLit = (new MyBundle).Lit(_.a -> 42.U, _.b -> true.B, _.c -> MyEnum.sB) assertTesterPasses{ new BasicTester{ @@ -29,7 +54,8 @@ class BundleLiteralSpec extends ChiselFlatSpec with Utils { chisel3.assert(outsideBundleLit.a === 42.U) chisel3.assert(outsideBundleLit.b === true.B) chisel3.assert(outsideBundleLit.c === MyEnum.sB) - + chisel3.assert(outsideBundleLit.isLit()) + chisel3.assert(outsideBundleLit.litValue().U === outsideBundleLit.asUInt()) val bundleLit = (new MyBundle).Lit(_.a -> 42.U, _.b -> true.B, _.c -> MyEnum.sB) chisel3.assert(bundleLit.a === 42.U) chisel3.assert(bundleLit.b === true.B) @@ -83,6 +109,8 @@ class BundleLiteralSpec extends ChiselFlatSpec with Utils { chisel3.assert(explicitBundleLit.a.a === 42.U) chisel3.assert(explicitBundleLit.a.b === true.B) chisel3.assert(explicitBundleLit.a.c === MyEnum.sB) + chisel3.assert(explicitBundleLit.a.isLit()) + chisel3.assert(explicitBundleLit.a.litValue().U === explicitBundleLit.a.asUInt()) // Specify the inner Bundle fields directly val expandedBundleLit = (new MyOuterBundle).Lit( @@ -96,6 +124,10 @@ class BundleLiteralSpec extends ChiselFlatSpec with Utils { chisel3.assert(expandedBundleLit.b.c === false.B) chisel3.assert(expandedBundleLit.b.d === 255.U) chisel3.assert(expandedBundleLit.b.e === MyEnum.sB) + chisel3.assert(! expandedBundleLit.a.isLit()) // element e is missing + chisel3.assert(expandedBundleLit.b.isLit()) + chisel3.assert(! expandedBundleLit.isLit()) // element a.e is missing + chisel3.assert(expandedBundleLit.b.litValue().U === expandedBundleLit.b.asUInt()) // Anonymously contruct the inner Bundle literal // A bit of weird syntax that depends on implementation details of the Bundle literal constructor @@ -105,6 +137,9 @@ class BundleLiteralSpec extends ChiselFlatSpec with Utils { chisel3.assert(childBundleLit.b.c === false.B) chisel3.assert(childBundleLit.b.d === 255.U) chisel3.assert(childBundleLit.b.e === MyEnum.sB) + chisel3.assert(childBundleLit.b.isLit()) + chisel3.assert(! childBundleLit.isLit()) // elements a and f are missing + chisel3.assert(childBundleLit.b.litValue().U === childBundleLit.b.asUInt()) stop() } } @@ -217,4 +252,10 @@ class BundleLiteralSpec extends ChiselFlatSpec with Utils { exc.getMessage should include (".c") } + "partial bundle literals" should "fail to pack" in { + ChiselStage.elaborate { new RawModule { + val bundleLit = (new MyBundle).Lit(_.a -> 42.U) + bundleLit.litOption should equal (None) + } } + } } |
