Skip to content

Commit d7f13f2

Browse files
authored
feat(MainPipe, ResponseUnit): support WriteEvictOrEvict transaction (#30)
1 parent 466bfd7 commit d7f13f2

File tree

4 files changed

+19
-11
lines changed

4 files changed

+19
-11
lines changed

src/main/scala/openLLC/MainPipe.scala

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -126,9 +126,11 @@ class MainPipe(implicit p: Parameters) extends LLCModule with HasCHIOpcodes {
126126
val cleanInvalid_s3 = !refill_task_s3 && opcode_s3 === CleanInvalid
127127
val cleanShared_s3 = !refill_task_s3 && opcode_s3 === CleanShared
128128
val writeCleanFull_s3 = !refill_task_s3 && opcode_s3 === WriteCleanFull
129+
val writeEvictOrEvict_s3 = !refill_task_s3 && opcode_s3 === WriteEvictOrEvict && afterIssueE.B
129130

130-
assert(!task_s3.valid || refill_task_s3 || readNotSharedDirty_s3 || readUnique_s3 || makeUnique_s3 || writeBackFull_s3 ||
131-
evict_s3 || makeInvalid_s3 || cleanInvalid_s3 || cleanShared_s3 || writeCleanFull_s3, "Unsupported opcode")
131+
assert(!task_s3.valid || refill_task_s3 ||
132+
readNotSharedDirty_s3 || readUnique_s3 || makeUnique_s3 || writeBackFull_s3 || evict_s3 || makeInvalid_s3 ||
133+
cleanInvalid_s3 || cleanShared_s3 || writeCleanFull_s3 || writeEvictOrEvict_s3, "Unsupported opcode")
132134

133135
/**
134136
* Requests have different coherence states after processing
@@ -140,7 +142,7 @@ class MainPipe(implicit p: Parameters) extends LLCModule with HasCHIOpcodes {
140142
*/
141143
val exclusiveReq_s3 = readUnique_s3 || readNotSharedDirty_s3 && !peerRNs_hit_s3 || makeUnique_s3
142144
val sharedReq_s3 = readNotSharedDirty_s3 && peerRNs_hit_s3
143-
val releaseReq_s3 = writeBackFull_s3 || evict_s3
145+
val releaseReq_s3 = writeBackFull_s3 || evict_s3 || writeEvictOrEvict_s3
144146
val invalidReq_s3 = makeInvalid_s3 || cleanInvalid_s3
145147
val cleanReq_s3 = cleanInvalid_s3 || cleanShared_s3
146148

@@ -257,6 +259,8 @@ class MainPipe(implicit p: Parameters) extends LLCModule with HasCHIOpcodes {
257259
val cleanInvalid_s4 = RegNext(cleanInvalid_s3, false.B)
258260
val cleanShared_s4 = RegNext(cleanShared_s3, false.B)
259261
val writeCleanFull_s4 = RegNext(writeCleanFull_s3, false.B)
262+
val writeEvictOrEvict_s4 = RegNext(writeEvictOrEvict_s3, false.B)
263+
260264
val sharedReq_s4 = RegNext(sharedReq_s3, false.B)
261265
val exclusiveReq_s4 = RegNext(exclusiveReq_s3, false.B)
262266
val releaseReq_s4 = RegNext(releaseReq_s3, false.B)
@@ -355,7 +359,7 @@ class MainPipe(implicit p: Parameters) extends LLCModule with HasCHIOpcodes {
355359
).asBools
356360
)
357361
refill_s4.valid := task_s4.valid && (
358-
(sharedReq_s4 || writeBackFull_s4) && !self_hit_s4 ||
362+
(sharedReq_s4 || writeBackFull_s4 || writeEvictOrEvict_s4) && !self_hit_s4 ||
359363
replace_snoop_s4
360364
)
361365
refill_s4.bits.state.s_refill := false.B
@@ -401,10 +405,11 @@ class MainPipe(implicit p: Parameters) extends LLCModule with HasCHIOpcodes {
401405
comp_s4.bits.state.s_urgentRead := true.B
402406
comp_s4.bits.state.w_datRsp := !(readNotSharedDirty_s4 || readUnique_s4)
403407
comp_s4.bits.state.w_snpRsp := !Cat(snpVec_comp_s4).orR
404-
comp_s4.bits.state.w_compack := !(readUnique_s4 || readNotSharedDirty_s4 || makeUnique_s4)
408+
comp_s4.bits.state.w_compack := !(readUnique_s4 || readNotSharedDirty_s4 || makeUnique_s4 ||
409+
writeEvictOrEvict_s4 && self_hit_s4)
405410
comp_s4.bits.state.w_comp := !(cleanReq_s4 && self_hit_s4 && selfDirty_s4)
406411
comp_s4.bits.task := comp_task_s4
407-
comp_s4.bits.is_miss := (readNotSharedDirty_s4 || readUnique_s4) && !self_hit_s4
412+
comp_s4.bits.is_miss := !self_hit_s4
408413

409414
/** Read/Write request to MemUnit **/
410415
val mem_task_s4 = WireInit(req_s4)

src/main/scala/openLLC/RefillUnit.scala

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ class RefillBufRead(implicit p: Parameters) extends LLCBundle {
3030

3131
class RefillState(implicit p: Parameters) extends LLCBundle {
3232
val s_refill = Bool()
33-
val w_datRsp = Bool()
33+
val w_datRsp = Bool()
3434
val w_snpRsp = Bool()
3535
}
3636

@@ -99,13 +99,14 @@ class RefillUnit(implicit p: Parameters) extends LLCModule with HasCHIOpcodes {
9999
when(canUpdate) {
100100
val entry = buffer(update_id)
101101
val isWriteBackFull = entry.task.chiOpcode === WriteBackFull
102+
val isWriteEvictOrEvict = entry.task.chiOpcode === WriteEvictOrEvict
102103
val inv_CBWrData = rspData.bits.resp === I
103104
val cancel = isWriteBackFull && inv_CBWrData
104105
val clients_hit = entry.dirResult.clients.hit
105106
val clients_meta = entry.dirResult.clients.meta
106107

107108
assert(
108-
!isWriteBackFull || inv_CBWrData || clients_hit && clients_meta(rspData.bits.srcID).valid,
109+
!isWriteBackFull && !isWriteEvictOrEvict || inv_CBWrData || clients_hit && clients_meta(rspData.bits.srcID).valid,
109110
"Non-exist block release?(addr: 0x%x)",
110111
Cat(entry.task.tag, entry.task.set, entry.task.bank, entry.task.off)
111112
)

src/main/scala/openLLC/ResponseUnit.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,8 @@ class ResponseUnit(implicit p: Parameters) extends LLCModule with HasCHIOpcodes
294294
txrsp.valid := txrspArb.io.out.valid
295295
txrsp.bits := txrspArb.io.out.bits
296296
txrsp.bits.chiOpcode := Mux(
297-
txrspArb.io.out.bits.chiOpcode === WriteBackFull || txrspArb.io.out.bits.chiOpcode === WriteCleanFull,
297+
txrspArb.io.out.bits.chiOpcode === WriteBackFull || txrspArb.io.out.bits.chiOpcode === WriteCleanFull ||
298+
txrspArb.io.out.bits.chiOpcode === WriteEvictOrEvict && buffer(txrspArb.io.chosen).is_miss,
298299
CompDBIDResp,
299300
Comp
300301
)

src/main/scala/openLLC/TopDownMonitor.scala

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,10 @@ package openLLC
2020
import org.chipsalliance.cde.config.Parameters
2121
import chisel3._
2222
import chisel3.util._
23+
import coupledL2.tl2chi._
2324
import utility.{XSPerfAccumulate}
2425

25-
class TopDownMonitor()(implicit p: Parameters) extends LLCModule {
26+
class TopDownMonitor()(implicit p: Parameters) extends LLCModule with HasCHIOpcodes {
2627
val io = IO(new Bundle() {
2728
val msStatus = Vec(banks, Vec(mshrs.response, Flipped(ValidIO(new ResponseInfo()))))
2829
val debugTopDown = new Bundle() {
@@ -43,7 +44,7 @@ class TopDownMonitor()(implicit p: Parameters) extends LLCModule {
4344
else Cat(ms.bits.tag, ms.bits.set, i.U(bankBits - 1, 0))
4445
val pBlockAddr = (pAddr.bits >> 6.U).asUInt
4546

46-
val isMiss = ms.valid && ms.bits.is_miss
47+
val isMiss = ms.valid && ms.bits.is_miss && (ms.bits.opcode === ReadNotSharedDirty || ms.bits.opcode === ReadUnique)
4748
pAddr.valid && msBlockAddr === pBlockAddr && isMiss
4849
}
4950
}

0 commit comments

Comments
 (0)