merge graphics

This commit is contained in:
Richard Yan
2023-04-25 00:10:51 -07:00
2 changed files with 25 additions and 19 deletions

View File

@@ -185,7 +185,7 @@ class CoalShiftQueue[T <: Data](
if (i == -1) true.B else if (i == entries) false.B else mask(i) if (i == -1) true.B else if (i == entries) false.B else mask(i)
} }
def paddedUsed = pad({ i: Int => used(i) }) def paddedUsed = pad({ i: Int => used(i) })
def validAfterInv(i: Int) = valid(i) && !io.invalidate.bits(i) def validAfterInv(i: Int) = valid(i) && (!io.invalidate.valid || !io.invalidate.bits(i))
val shift = (used =/= 0.U) && (io.queue.deq.ready || !validAfterInv(0)) val shift = (used =/= 0.U) && (io.queue.deq.ready || !validAfterInv(0))
for (i <- 0 until entries) { for (i <- 0 until entries) {
@@ -598,7 +598,7 @@ class CoalescingUnitImp(outer: CoalescingUnit, config: CoalescerConfig) extends
numPerLaneReqs, numPerLaneReqs,
sourceWidth, sourceWidth,
offsetBits, offsetBits,
config.SizeEnum.getWidth config.SizeEnum
) )
) )
println(s"=========== table sourceWidth: ${sourceWidth}") println(s"=========== table sourceWidth: ${sourceWidth}")
@@ -617,7 +617,7 @@ class CoalescingUnitImp(outer: CoalescingUnit, config: CoalescerConfig) extends
r.valid := false.B r.valid := false.B
r.source := origReqs(i).source r.source := origReqs(i).source
r.offset := (origReqs(i).address % (1 << config.MAX_SIZE).U) >> config.WORD_WIDTH r.offset := (origReqs(i).address % (1 << config.MAX_SIZE).U) >> config.WORD_WIDTH
r.sizeEnum := config.SizeEnum.logSizeToEnum(origReqs(i).size).asUInt r.sizeEnum := config.SizeEnum.logSizeToEnum(origReqs(i).size)
} }
} }
newEntry.lanes(0).reqs(0).valid := true.B newEntry.lanes(0).reqs(0).valid := true.B
@@ -753,7 +753,7 @@ class UncoalescingUnit(config: CoalescerConfig) extends Module {
when(inflightTable.io.lookup.valid && oldReq.valid) { when(inflightTable.io.lookup.valid && oldReq.valid) {
ioOldReq.valid := oldReq.valid ioOldReq.valid := oldReq.valid
ioOldReq.bits.source := oldReq.source ioOldReq.bits.source := oldReq.source
val logSize = config.SizeEnum.enumToLogSize(config.SizeEnum(oldReq.sizeEnum)) val logSize = found.sizeEnumT.enumToLogSize(oldReq.sizeEnum)
ioOldReq.bits.size := logSize ioOldReq.bits.size := logSize
ioOldReq.bits.data := ioOldReq.bits.data :=
getCoalescedDataChunk( getCoalescedDataChunk(
@@ -780,7 +780,7 @@ class InflightCoalReqTable(config: CoalescerConfig) extends Module {
config.DEPTH, config.DEPTH,
log2Ceil(config.NUM_OLD_IDS), log2Ceil(config.NUM_OLD_IDS),
config.MAX_SIZE, config.MAX_SIZE,
config.SizeEnum.getWidth config.SizeEnum
) )
val entries = config.NUM_NEW_IDS val entries = config.NUM_NEW_IDS
@@ -810,7 +810,7 @@ class InflightCoalReqTable(config: CoalescerConfig) extends Module {
r.valid := false.B r.valid := false.B
r.source := 0.U r.source := 0.U
r.offset := 0.U r.offset := 0.U
r.sizeEnum := config.SizeEnum.INVALID.asUInt r.sizeEnum := config.SizeEnum.INVALID
} }
} }
} }
@@ -858,14 +858,14 @@ class InflightCoalReqTableEntry(
val numPerLaneReqs: Int, val numPerLaneReqs: Int,
val sourceWidth: Int, val sourceWidth: Int,
val offsetBits: Int, val offsetBits: Int,
val sizeEnumBits: Int val sizeEnumT: InFlightTableSizeEnum
) extends Bundle { ) extends Bundle {
class PerCoreReq extends Bundle { class PerCoreReq extends Bundle {
val valid = Bool() // FIXME: delete this val valid = Bool() // FIXME: delete this
// FIXME: oldId and newId shares the same width // FIXME: oldId and newId shares the same width
val source = UInt(sourceWidth.W) val source = UInt(sourceWidth.W)
val offset = UInt(offsetBits.W) val offset = UInt(offsetBits.W)
val sizeEnum = UInt(sizeEnumBits.W) val sizeEnum = sizeEnumT()
} }
class PerLane extends Bundle { class PerLane extends Bundle {
val reqs = Vec(numPerLaneReqs, new PerCoreReq) val reqs = Vec(numPerLaneReqs, new PerCoreReq)

View File

@@ -26,7 +26,7 @@ class MultiPortQueueUnitTest extends AnyFlatSpec with ChiselScalatestTester {
for (_ <- 0 until 100) { for (_ <- 0 until 100) {
c.clock.step() c.clock.step()
} }
// c.io.deq(0).valid.expect(false.B) // c.io.deq(0).valid.expect(false.B)
} }
} }
} }
@@ -257,7 +257,7 @@ class CoalShiftQueueTest extends AnyFlatSpec with ChiselScalatestTester {
} }
it should "dequeue invalidated entries by itself" in { it should "dequeue invalidated entries by itself" in {
test(new CoalShiftQueue(UInt(8.W), 4)) { c => test(new CoalShiftQueue(gen = UInt(8.W), entries = 4)) { c =>
c.io.invalidate.valid.poke(false.B) c.io.invalidate.valid.poke(false.B)
// prepare // prepare
@@ -266,12 +266,10 @@ class CoalShiftQueueTest extends AnyFlatSpec with ChiselScalatestTester {
c.io.queue.enq.valid.poke(true.B) c.io.queue.enq.valid.poke(true.B)
c.io.queue.enq.bits.poke(0x12.U) c.io.queue.enq.bits.poke(0x12.U)
c.clock.step() c.clock.step()
c.io.queue.deq.ready.poke(false.B)
c.io.queue.enq.ready.expect(true.B) c.io.queue.enq.ready.expect(true.B)
c.io.queue.enq.valid.poke(true.B) c.io.queue.enq.valid.poke(true.B)
c.io.queue.enq.bits.poke(0x34.U) c.io.queue.enq.bits.poke(0x34.U)
c.clock.step() c.clock.step()
c.io.queue.deq.ready.poke(false.B)
c.io.queue.enq.ready.expect(true.B) c.io.queue.enq.ready.expect(true.B)
c.io.queue.enq.valid.poke(true.B) c.io.queue.enq.valid.poke(true.B)
c.io.queue.enq.bits.poke(0x56.U) c.io.queue.enq.bits.poke(0x56.U)
@@ -281,12 +279,13 @@ class CoalShiftQueueTest extends AnyFlatSpec with ChiselScalatestTester {
// invalidate two entries at head // invalidate two entries at head
c.io.invalidate.valid.poke(true.B) c.io.invalidate.valid.poke(true.B)
c.io.invalidate.bits.poke(0x3.U) c.io.invalidate.bits.poke(0x3.U)
// [ 0x56 | 0x34(inv) | 0x12(inv) ]
c.clock.step() c.clock.step()
// 0x12 should have been dequeued now // [ 0x56 | 0x34(inv) ]
c.io.invalidate.valid.poke(false.B) c.io.invalidate.valid.poke(false.B)
c.io.queue.deq.ready.poke(false.B) c.io.queue.deq.ready.poke(false.B)
c.clock.step() c.clock.step()
// 0x34 should have been dequeued now // [ 0x56 ]
c.io.queue.deq.ready.poke(true.B) c.io.queue.deq.ready.poke(true.B)
c.io.queue.deq.valid.expect(true.B) c.io.queue.deq.valid.expect(true.B)
c.io.queue.deq.bits.expect(0x56.U) c.io.queue.deq.bits.expect(0x56.U)
@@ -358,25 +357,26 @@ class UncoalescingUnitTest extends AnyFlatSpec with ChiselScalatestTester {
// .withAnnotations(Seq(VcsBackendAnnotation)) // .withAnnotations(Seq(VcsBackendAnnotation))
{ c => { c =>
val sourceId = 0.U val sourceId = 0.U
val four = c.io.newEntry.sizeEnumT.FOUR
c.io.coalReqValid.poke(true.B) c.io.coalReqValid.poke(true.B)
c.io.newEntry.source.poke(sourceId) c.io.newEntry.source.poke(sourceId)
c.io.newEntry.lanes(0).reqs(0).valid.poke(true.B) c.io.newEntry.lanes(0).reqs(0).valid.poke(true.B)
c.io.newEntry.lanes(0).reqs(0).source.poke(1.U) c.io.newEntry.lanes(0).reqs(0).source.poke(1.U)
c.io.newEntry.lanes(0).reqs(0).offset.poke(1.U) c.io.newEntry.lanes(0).reqs(0).offset.poke(1.U)
c.io.newEntry.lanes(0).reqs(0).sizeEnum.poke(1.U) // 1.U is FOUR 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).valid.poke(true.B)
c.io.newEntry.lanes(0).reqs(1).source.poke(2.U) 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(0.U)
c.io.newEntry.lanes(0).reqs(1).sizeEnum.poke(1.U) 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(1).reqs(0).valid.poke(false.B)
c.io.newEntry.lanes(2).reqs(0).valid.poke(true.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).source.poke(2.U)
c.io.newEntry.lanes(2).reqs(0).offset.poke(2.U) c.io.newEntry.lanes(2).reqs(0).offset.poke(2.U)
c.io.newEntry.lanes(2).reqs(0).sizeEnum.poke(1.U) c.io.newEntry.lanes(2).reqs(0).sizeEnum.poke(four)
c.io.newEntry.lanes(2).reqs(1).valid.poke(true.B) c.io.newEntry.lanes(2).reqs(1).valid.poke(true.B)
c.io.newEntry.lanes(2).reqs(1).source.poke(2.U) c.io.newEntry.lanes(2).reqs(1).source.poke(2.U)
c.io.newEntry.lanes(2).reqs(1).offset.poke(3.U) c.io.newEntry.lanes(2).reqs(1).offset.poke(3.U)
c.io.newEntry.lanes(2).reqs(1).sizeEnum.poke(1.U) c.io.newEntry.lanes(2).reqs(1).sizeEnum.poke(four)
c.io.newEntry.lanes(3).reqs(0).valid.poke(false.B) c.io.newEntry.lanes(3).reqs(0).valid.poke(false.B)
c.clock.step() c.clock.step()
@@ -421,7 +421,13 @@ class CoalInflightTableUnitTest extends AnyFlatSpec with ChiselScalatestTester {
val sizeBits = 2 val sizeBits = 2
val inflightCoalReqTableEntry = val inflightCoalReqTableEntry =
new InflightCoalReqTableEntry(numLanes, numPerLaneReqs, sourceWidth, offsetBits, sizeBits) new InflightCoalReqTableEntry(
numLanes,
numPerLaneReqs,
sourceWidth,
offsetBits,
testConfig.SizeEnum
)
// it should "stop enqueueing when full" in { // it should "stop enqueueing when full" in {
// test(new InflightCoalReqTable(numLanes, sourceWidth, entries)) { c => // test(new InflightCoalReqTable(numLanes, sourceWidth, entries)) { c =>