Skip to content

Commit af49a22

Browse files
committed
fix(CustomL1Hint): add hintDropQueue, drop extra hint for reqs retried in MainPipe s3
* add `hintDropQueue` to record hints need to be droped in `hintQueue` * add assertion to check ready for tl_d is always high
1 parent d2dc578 commit af49a22

File tree

2 files changed

+16
-4
lines changed

2 files changed

+16
-4
lines changed

src/main/scala/coupledL2/CoupledL2.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -425,6 +425,7 @@ abstract class CoupledL2Base(implicit p: Parameters) extends LazyModule with Has
425425
}
426426

427427
in.d.valid := slice.io.in.d.valid && sliceCanFire
428+
assert(in.d.ready)
428429
slice.io.in.d.ready := in.d.ready && sliceCanFire
429430
}
430431
in.b.bits.address := restoreAddress(slice.io.in.b.bits.address, i)

src/main/scala/coupledL2/CustomL1Hint.scala

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@ class HintQueueEntry(implicit p: Parameters) extends L2Bundle {
3030
val isKeyword = Bool()
3131
}
3232

33+
class RetryQueueEntry(implicit p: Parameters) extends L2Bundle {
34+
val source = UInt(sourceIdBits.W)
35+
}
36+
3337
class CustomL1HintIOBundle(implicit p: Parameters) extends L2Bundle {
3438
// input information
3539
val s1 = Flipped(ValidIO(new TaskBundle()))
@@ -110,6 +114,7 @@ class CustomL1Hint(implicit p: Parameters) extends L2Module {
110114
val hintEntries = mshrsAll
111115
val hintEntriesWidth = log2Ceil(hintEntries)
112116
val hintQueue = Module(new Queue(new HintQueueEntry, hintEntries))
117+
val hintDropQueue = Module(new Queue(new RetryQueueEntry, hintEntries, flow = true))
113118

114119
// this will have at most 2 entries
115120
val hint_s1Queue = Module(new Queue(new HintQueueEntry, 4, flow = true))
@@ -119,8 +124,14 @@ class CustomL1Hint(implicit p: Parameters) extends L2Module {
119124
hint_s1Queue.io.enq.bits.isKeyword := enqKeyWord_s1
120125
hint_s1Queue.io.deq.ready := hintQueue.io.enq.ready && !enqValid_s3
121126
// WARNING:TODO: ensure queue will never overflow
122-
assert(hint_s1Queue.io.enq.ready, "hint_s1Queue should never be full")
123-
assert(hintQueue.io.enq.ready, "hintQueue should never be full")
127+
// assert(hint_s1Queue.io.enq.ready, "hint_s1Queue should never be full")
128+
// assert(hintQueue.io.enq.ready, "hintQueue should never be full")
129+
130+
val hintDropValid = hintQueue.io.deq.valid && hintDropQueue.io.deq.valid && hintQueue.io.deq.bits.source === hintDropQueue.io.deq.bits.source
131+
132+
hintDropQueue.io.enq.valid := io.s3.retry && RegNextN(enqValid_s1, 2)
133+
hintDropQueue.io.enq.bits.source := task_s3.bits.sourceId
134+
hintDropQueue.io.deq.ready := hintDropValid
124135

125136
val deqLatency = RegNext(io.l1Hint.fire && io.l1Hint.bits.isGrantData)
126137
val hintEnqValid = enqValid_s3 || hint_s1Queue.io.deq.valid
@@ -129,9 +140,9 @@ class CustomL1Hint(implicit p: Parameters) extends L2Module {
129140
hintQueue.io.enq.bits.opcode := RegEnable(Mux(enqValid_s3, enqOpcode_s3, hint_s1Queue.io.deq.bits.opcode), hintEnqValid)
130141
hintQueue.io.enq.bits.source := RegEnable(Mux(enqValid_s3, enqSource_s3, hint_s1Queue.io.deq.bits.source), hintEnqValid)
131142
hintQueue.io.enq.bits.isKeyword := RegEnable(Mux(enqValid_s3, enqKeyWord_s3, hint_s1Queue.io.deq.bits.isKeyword), hintEnqValid)
132-
hintQueue.io.deq.ready := io.l1Hint.ready && !deqLatency
143+
hintQueue.io.deq.ready := io.l1Hint.ready && !deqLatency || hintDropValid
133144

134-
io.l1Hint.valid := hintQueue.io.deq.valid && !deqLatency && !io.s3.retry
145+
io.l1Hint.valid := hintQueue.io.deq.valid && !deqLatency && !hintDropValid
135146
io.l1Hint.bits.sourceId := hintQueue.io.deq.bits.source
136147
io.l1Hint.bits.isKeyword := hintQueue.io.deq.bits.isKeyword
137148
io.l1Hint.bits.isGrantData := hintQueue.io.deq.bits.opcode === GrantData || hintQueue.io.deq.bits.opcode === AccessAckData

0 commit comments

Comments
 (0)