diff --git a/src/test/scala/coalescing/CoalescingUnitTest.scala b/src/test/scala/coalescing/CoalescingUnitTest.scala index 3a2e4a5..b97e5a5 100644 --- a/src/test/scala/coalescing/CoalescingUnitTest.scala +++ b/src/test/scala/coalescing/CoalescingUnitTest.scala @@ -440,6 +440,22 @@ class CoalShiftQueueTest extends AnyFlatSpec with ChiselScalatestTester { } } +object uncoalescerTestConfig extends CoalescerConfig( + numLanes = 4, + queueDepth = 2, + waitTimeout = 8, + addressWidth = 24, + dataBusWidth = 5, + // watermark = 2, + wordSizeInBytes = 4, + wordWidth = 2, + numOldSrcIds = 16, + numNewSrcIds = 4, + respQueueDepth = 4, + coalLogSizes = Seq(4), + sizeEnum = DefaultInFlightTableSizeEnum +) + class UncoalescerUnitTest extends AnyFlatSpec with ChiselScalatestTester { behavior of "uncoalescer" val numLanes = 4 @@ -450,8 +466,8 @@ class UncoalescerUnitTest extends AnyFlatSpec with ChiselScalatestTester { val coalDataWidth = 128 val numInflightCoalRequests = 4 - it should "work" in { - test(new Uncoalescer(testConfig)) + it should "work in general case" in { + test(new Uncoalescer(uncoalescerTestConfig)) // vcs helps with simulation time, but sometimes errors with // "mutation occurred during iteration" java error // .withAnnotations(Seq(VcsBackendAnnotation)) @@ -466,7 +482,7 @@ class UncoalescerUnitTest extends AnyFlatSpec with ChiselScalatestTester { c.io.newEntry.lanes(0).reqs(0).sizeEnum.poke(four) c.io.newEntry.lanes(0).reqs(1).valid.poke(true.B) c.io.newEntry.lanes(0).reqs(1).source.poke(2.U) - c.io.newEntry.lanes(0).reqs(1).offset.poke(0.U) + c.io.newEntry.lanes(0).reqs(1).offset.poke(1.U) // same offset to different lanes c.io.newEntry.lanes(0).reqs(1).sizeEnum.poke(four) c.io.newEntry.lanes(1).reqs(0).valid.poke(false.B) c.io.newEntry.lanes(2).reqs(0).valid.poke(true.B) @@ -500,7 +516,7 @@ class UncoalescerUnitTest extends AnyFlatSpec with ChiselScalatestTester { // offset is counting from LSB c.io.uncoalResps(0)(0).bits.data.expect(0x5ca1ab1eL.U) c.io.uncoalResps(0)(0).bits.source.expect(1.U) - c.io.uncoalResps(0)(1).bits.data.expect(0xdeadbeefL.U) + c.io.uncoalResps(0)(1).bits.data.expect(0x5ca1ab1eL.U) c.io.uncoalResps(0)(1).bits.source.expect(2.U) c.io.uncoalResps(2)(0).bits.data.expect(0x89abcdefL.U) c.io.uncoalResps(2)(0).bits.source.expect(2.U) @@ -508,6 +524,67 @@ class UncoalescerUnitTest extends AnyFlatSpec with ChiselScalatestTester { c.io.uncoalResps(2)(1).bits.source.expect(2.U) } } + + it should "uncoalesce when coalesced to the same word offset" in { + test(new Uncoalescer(uncoalescerTestConfig)) + // .withAnnotations(Seq(VcsBackendAnnotation)) + { c => + val sourceId = 0.U + val four = c.io.newEntry.sizeEnumT.FOUR + c.io.coalReqValid.poke(true.B) + c.io.newEntry.source.poke(sourceId) + c.io.newEntry.lanes(0).reqs(0).valid.poke(true.B) + c.io.newEntry.lanes(0).reqs(0).source.poke(0.U) + c.io.newEntry.lanes(0).reqs(0).offset.poke(1.U) + c.io.newEntry.lanes(0).reqs(0).sizeEnum.poke(four) + c.io.newEntry.lanes(0).reqs(1).valid.poke(false.B) + c.io.newEntry.lanes(1).reqs(0).valid.poke(true.B) + c.io.newEntry.lanes(1).reqs(0).source.poke(1.U) + c.io.newEntry.lanes(1).reqs(0).offset.poke(1.U) + c.io.newEntry.lanes(1).reqs(0).sizeEnum.poke(four) + c.io.newEntry.lanes(1).reqs(1).valid.poke(false.B) + c.io.newEntry.lanes(2).reqs(0).valid.poke(true.B) + c.io.newEntry.lanes(2).reqs(0).source.poke(2.U) + c.io.newEntry.lanes(2).reqs(0).offset.poke(1.U) + c.io.newEntry.lanes(2).reqs(0).sizeEnum.poke(four) + c.io.newEntry.lanes(2).reqs(1).valid.poke(false.B) + c.io.newEntry.lanes(3).reqs(0).valid.poke(true.B) + c.io.newEntry.lanes(3).reqs(0).source.poke(3.U) + c.io.newEntry.lanes(3).reqs(0).offset.poke(1.U) + c.io.newEntry.lanes(3).reqs(0).sizeEnum.poke(four) + c.io.newEntry.lanes(3).reqs(1).valid.poke(false.B) + + c.clock.step() + + c.io.coalReqValid.poke(false.B) + + c.clock.step() + + c.io.coalResp.valid.poke(true.B) + c.io.coalResp.bits.source.poke(sourceId) + val lit = (BigInt(0x0123456789abcdefL) << 64) | BigInt(0x5ca1ab1edeadbeefL) + c.io.coalResp.bits.data.poke(lit.U) + + // table lookup is combinational at the same cycle + // offset is counting from LSB + c.io.uncoalResps(0)(0).valid.expect(true.B) + c.io.uncoalResps(0)(0).bits.data.expect(0x5ca1ab1eL.U) + c.io.uncoalResps(0)(0).bits.source.expect(0.U) + c.io.uncoalResps(0)(1).valid.expect(false.B) + c.io.uncoalResps(1)(0).valid.expect(true.B) + c.io.uncoalResps(1)(0).bits.data.expect(0x5ca1ab1eL.U) + c.io.uncoalResps(1)(0).bits.source.expect(1.U) + c.io.uncoalResps(1)(1).valid.expect(false.B) + c.io.uncoalResps(2)(0).valid.expect(true.B) + c.io.uncoalResps(2)(0).bits.data.expect(0x5ca1ab1eL.U) + c.io.uncoalResps(2)(0).bits.source.expect(2.U) + c.io.uncoalResps(2)(1).valid.expect(false.B) + c.io.uncoalResps(3)(0).valid.expect(true.B) + c.io.uncoalResps(3)(0).bits.data.expect(0x5ca1ab1eL.U) + c.io.uncoalResps(3)(0).bits.source.expect(3.U) + c.io.uncoalResps(3)(1).valid.expect(false.B) + } + } } class CoalInflightTableUnitTest extends AnyFlatSpec with ChiselScalatestTester {