merge graphics
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
@@ -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 =>
|
||||||
|
|||||||
Reference in New Issue
Block a user