Store SizeEnum in entry instead of UInt

This commit is contained in:
Hansung Kim
2023-04-23 21:38:11 -07:00
parent 5d105b36c5
commit 7539c39c45
2 changed files with 13 additions and 13 deletions

View File

@@ -13,7 +13,6 @@ import freechips.rocketchip.unittest._
trait InFlightTableSizeEnum extends ChiselEnum { trait InFlightTableSizeEnum extends ChiselEnum {
val INVALID: Type val INVALID: Type
val FOUR: Type
def logSizeToEnum(x: UInt): Type def logSizeToEnum(x: UInt): Type
def enumToLogSize(x: Type): UInt def enumToLogSize(x: Type): UInt
} }
@@ -598,7 +597,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 +616,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 +752,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 +779,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 +809,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 +857,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

@@ -287,25 +287,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()
@@ -350,7 +351,7 @@ 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 =>