@@ -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+
3337class 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