Skip to content

Commit 93f759f

Browse files
fix(MainPipe, MSHR): state transitions of nested WriteCleanFull (#351)
* fix(MainPipe, MSHR): state transitions of nested WriteCleanFull **SnpOnceX**: SnpOnce, SnpOnceFwd **SnpToB**: SnpClean, SnpShared, SnpNotSharedDirty, SnpCleanFwd, SnpSharedFwd, SnpNotSharedDirtyFwd * 1) Common: Distinguish WriteBackFull/WriteEvictFull/WriteEvictOrEvict/ Evict nesting from WriteCleanFull using ```snpHitReleaseToInval``` and ```snpHitReleaseToClean``` for better robustness and readability * 2) MainPipe: For **SnpOnceX** and **SnpToB** nesting WriteCleanFull, redirect cache state to SC * 3) MainPipe: Update directory meta on **SnpOnceX** nesting WriteCleanFull * 4) MainPipe: For **SnpCleanShared** nesting WriteCleanFull, allow transition to UC * 5) MSHR: Clear dirty flag in directory meta on ```mp_probeack``` of **SnpOnceX** nesting WriteCleanFull * 6) MSHR: For **SnpOnceX** nesting WriteCleanFull, allow PassDirty * fix(MainPipe): fix SnpRespX state of non-WriteCleanFull nesting * fix(MSHR): SnpRespDataFwded on SnpOnceFwd with UD -> SC * fix(MSHR): UD -> SC on SnpOnceX nesting WriteCleanFull with dirty data * fix(MainPipe): SnpOnce UD -> SC only on nesting WriteCleanFull dirty * fix(MSHR): unnecessary directory hit predication * fix(MainPipe): pass meta change on snoops without entering MSHR * fix(MainPipe): compilation error * fix(MainPipe): compilation error * style(MainPipe): code style * fix(MSHR): consider directory miss and nesting write to I
1 parent 9682d42 commit 93f759f

File tree

7 files changed

+108
-42
lines changed

7 files changed

+108
-42
lines changed

src/main/scala/coupledL2/Common.scala

+4-3
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,8 @@ class TaskBundle(implicit p: Parameters) extends L2Bundle
120120

121121
// Used for get data from ReleaseBuf when snoop hit with same PA
122122
val snpHitRelease = Bool()
123-
val snpHitReleaseToB = Bool()
123+
val snpHitReleaseToInval = Bool()
124+
val snpHitReleaseToClean = Bool()
124125
val snpHitReleaseWithData = Bool()
125126
val snpHitReleaseIdx = UInt(mshrBits.W)
126127
val snpHitReleaseState = UInt(2.W)
@@ -227,8 +228,8 @@ class MSHRInfo(implicit p: Parameters) extends L2Bundle with HasTLChannelBits {
227228

228229
val replaceData = Bool() // If there is a replace, WriteBackFull or Evict
229230

230-
// exclude Release toB for nested snoop of releases
231-
val releaseToB = Bool()
231+
// release to T with data or UC (e.g. WriteCleanFull)
232+
val releaseToClean = Bool()
232233
}
233234

234235
class RespInfoBundle(implicit p: Parameters) extends L2Bundle

src/main/scala/coupledL2/tl2chi/MSHR.scala

+49-25
Original file line numberDiff line numberDiff line change
@@ -180,13 +180,18 @@ class MSHR(implicit p: Parameters) extends TL2CHIL2Module with HasCHIOpcodes {
180180

181181
val cmo_cbo = req_cboClean || req_cboFlush || req_cboInval
182182

183+
// *NOTICE: WriteBack/WriteClean(s) with nested snoops that passed dirty were not considered as
184+
// a nested hit here, which would no longer pass latest data to lower tier memories.
183185
val hitDirty = dirResult.hit && meta.dirty || probeDirty
184-
val hitWriteBack = req.snpHitRelease && req.snpHitReleaseWithData && req.snpHitReleaseDirty
186+
val hitWriteBack = req.snpHitRelease && req.snpHitReleaseWithData && req.snpHitReleaseDirty && req.snpHitReleaseToInval
187+
val hitWriteClean = req.snpHitRelease && req.snpHitReleaseWithData && req.snpHitReleaseDirty && req.snpHitReleaseToClean
185188
val hitWriteEvict = req.snpHitRelease && req.snpHitReleaseWithData && !req.snpHitReleaseDirty
186-
val hitWriteX = hitWriteBack || hitWriteEvict
187-
val hitDirtyOrWriteBack = hitDirty || hitWriteBack
188189

189-
val releaseToB = req_cboClean
190+
val hitWriteX = hitWriteBack || hitWriteClean || hitWriteEvict
191+
val hitWriteDirty = hitWriteBack || hitWriteClean
192+
val hitDirtyOrWriteDirty = hitDirty || hitWriteDirty
193+
194+
val releaseToClean = req_cboClean
190195

191196
/**
192197
* About which snoop should echo SnpRespData[Fwded] instead of SnpResp[Fwded]:
@@ -197,7 +202,7 @@ class MSHR(implicit p: Parameters) extends TL2CHIL2Module with HasCHIOpcodes {
197202
* 3. When the snoop opcode is non-forwarding non-stashing snoop, echo SnpRespData if RetToSrc = 1 as long as the
198203
* cache line is Shared Clean and the snoopee retains a copy of the cache line.
199204
*/
200-
val doRespData_dirty = hitDirtyOrWriteBack && (
205+
val doRespData_dirty = hitDirtyOrWriteDirty && (
201206
req_chiOpcode === SnpOnce ||
202207
snpToB ||
203208
req_chiOpcode === SnpUnique ||
@@ -216,8 +221,12 @@ class MSHR(implicit p: Parameters) extends TL2CHIL2Module with HasCHIOpcodes {
216221
(isSnpToBNonFwd(req_chiOpcode) || isSnpToNNonFwd(req_chiOpcode) || isSnpOnce(req_chiOpcode)) ||
217222
hitWriteEvict &&
218223
isSnpOnce(req_chiOpcode))
219-
// doRespData_once includes SnpOnceFwd(nested) UD -> I and SnpOnce UC -> UC/I(non-nested/nested)
220-
val doRespData_once = hitWriteBack &&
224+
// doRespData_once includes
225+
// 1. SnpOnceFwd : UD -> I (nesting WriteBack)
226+
// 2. SnpOnceFwd : UD -> SC (nesting WriteClean)
227+
// 3. SnpOnce : UC -> UC (non-nesting)
228+
// 4. SnpOnce : UC -> I (nesting WriteBack)
229+
val doRespData_once = (hitWriteBack || hitWriteClean) &&
221230
isSnpOnceFwd(req_chiOpcode) ||
222231
(dirResult.hit && !meta.dirty && meta.state =/= BRANCH || hitWriteEvict) &&
223232
isSnpOnce(req_chiOpcode)
@@ -298,34 +307,35 @@ class MSHR(implicit p: Parameters) extends TL2CHIL2Module with HasCHIOpcodes {
298307
}
299308

300309
// resp and fwdState
301-
val respCacheState = Mux(dirResult.hit, ParallelPriorityMux(Seq(
310+
// *NOTICE: Snp*Fwd would enter MSHR on directory missing
311+
val respCacheState = ParallelPriorityMux(Seq(
302312
snpToN -> I,
303-
snpToB -> SC,
313+
snpToB -> Mux(!dirResult.hit, I, SC),
304314
isSnpOnceX(req_chiOpcode) ->
305-
Mux(
306-
req.snpHitRelease,
307-
I, // also see 'nestedwb.b_inv_dirty' in MainPipe
315+
Mux(!dirResult.hit, I, Mux(
316+
req.snpHitReleaseToClean,
317+
SC,
308318
Mux(probeDirty || meta.dirty, UD, metaChi)
309-
),
319+
)),
310320
(isSnpStashX(req_chiOpcode) || isSnpQuery(req_chiOpcode)) ->
311321
Mux(probeDirty || meta.dirty, UD, metaChi),
312322
isSnpCleanShared(req_chiOpcode) ->
313323
Mux(isT(meta.state), UC, metaChi)
314-
)), I)
315-
val respPassDirty = hitDirtyOrWriteBack && (
324+
))
325+
val respPassDirty = hitDirtyOrWriteDirty && (
316326
snpToB ||
317327
req_chiOpcode === SnpUnique ||
318328
req_chiOpcode === SnpUniqueStash ||
319329
req_chiOpcode === SnpCleanShared ||
320330
req_chiOpcode === SnpCleanInvalid ||
321-
isSnpOnceX(req_chiOpcode) && hitWriteBack
331+
isSnpOnceX(req_chiOpcode) && hitWriteDirty
322332
)
323333
val fwdCacheState = Mux(
324334
isSnpToBFwd(req_chiOpcode),
325335
SC,
326336
Mux(isSnpToNFwd(req_chiOpcode), UC /*UC_UD*/, I)
327337
)
328-
val fwdPassDirty = isSnpToNFwd(req_chiOpcode) && hitDirtyOrWriteBack
338+
val fwdPassDirty = isSnpToNFwd(req_chiOpcode) && hitDirtyOrWriteDirty
329339

330340
/*TXRSP for CompAck */
331341
val orsp = io.tasks.txrsp.bits
@@ -630,21 +640,32 @@ class MSHR(implicit p: Parameters) extends TL2CHIL2Module with HasCHIOpcodes {
630640
* 1. If the snoop belongs to SnpToN
631641
* 2. If the snoop belongs to SnpToB
632642
* 3. If the snoop is SnpCleanShared
643+
* 4. If the snoop is SnpOnce/SnpOnceFwd and nesting WriteCleanFull
633644
* Otherwise, the dirty bit should stay the same as before.
634645
*/
635-
dirty = !snpToN && !snpToB && req_chiOpcode =/= SnpCleanShared && (dirResult.hit && meta.dirty) ||
636-
isSnpOnceX(req_chiOpcode) && probeDirty,
646+
dirty = !(
647+
!dirResult.hit || !meta.dirty ||
648+
snpToN ||
649+
snpToB ||
650+
isSnpCleanShared(req_chiOpcode) ||
651+
isSnpOnceX(req_chiOpcode) && req.snpHitReleaseToClean
652+
) || isSnpOnceX(req_chiOpcode) && probeDirty,
653+
// Directory would always be missing on nesting WriteBackFull/WriteEvict*/Evict
637654
state = Mux(
638655
snpToN,
639656
INVALID,
640-
Mux(snpToB, BRANCH, meta.state)
657+
Mux(
658+
// On SnpOnce/SnpOnceFwd nesting WriteCleanFull with UD, we went UD -> SC (T -> B here)
659+
snpToB || isSnpOnceX(req_chiOpcode) && hitWriteClean,
660+
BRANCH,
661+
meta.state)
641662
),
642663
clients = meta.clients & Fill(clientBits, !probeGotN && !snpToN),
643664
alias = meta.alias, //[Alias] Keep alias bits unchanged
644665
prefetch = !snpToN && meta_pft,
645666
accessed = !snpToN && meta.accessed
646667
)
647-
mp_probeack.metaWen := !req.snpHitRelease || req.snpHitReleaseToB
668+
mp_probeack.metaWen := !req.snpHitReleaseToInval
648669
mp_probeack.tagWen := false.B
649670
mp_probeack.dsWen := !snpToN && probeDirty && meta.clients.orR
650671
mp_probeack.wayMask := 0.U(cacheParams.ways.W)
@@ -679,7 +700,8 @@ class MSHR(implicit p: Parameters) extends TL2CHIL2Module with HasCHIOpcodes {
679700
mp_probeack.expCompAck.get := false.B
680701
mp_probeack.traceTag.get := req.traceTag.get
681702
mp_probeack.snpHitRelease := req.snpHitRelease
682-
mp_probeack.snpHitReleaseToB := req.snpHitReleaseToB
703+
mp_probeack.snpHitReleaseToInval := req.snpHitReleaseToInval
704+
mp_probeack.snpHitReleaseToClean := req.snpHitReleaseToClean
683705
mp_probeack.snpHitReleaseWithData := req.snpHitReleaseWithData
684706
mp_probeack.snpHitReleaseIdx := req.snpHitReleaseIdx
685707

@@ -867,7 +889,8 @@ class MSHR(implicit p: Parameters) extends TL2CHIL2Module with HasCHIOpcodes {
867889
mp_dct.expCompAck.get := false.B // DontCare
868890
mp_dct.traceTag.get := req.traceTag.get
869891
mp_dct.snpHitRelease := req.snpHitRelease
870-
mp_dct.snpHitReleaseToB := req.snpHitReleaseToB
892+
mp_dct.snpHitReleaseToInval := req.snpHitReleaseToInval
893+
mp_dct.snpHitReleaseToClean := req.snpHitReleaseToClean
871894
mp_dct.snpHitReleaseWithData := req.snpHitReleaseWithData
872895
mp_dct.snpHitReleaseIdx := req.snpHitReleaseIdx
873896
mp_dct.snpHitReleaseState := req.snpHitReleaseState
@@ -929,7 +952,8 @@ class MSHR(implicit p: Parameters) extends TL2CHIL2Module with HasCHIOpcodes {
929952
mp_cmometaw.expCompAck.get := false.B // DontCare
930953
mp_cmometaw.traceTag.get := 0.U
931954
mp_cmometaw.snpHitRelease := req.snpHitRelease
932-
mp_cmometaw.snpHitReleaseToB := req.snpHitReleaseToB
955+
mp_cmometaw.snpHitReleaseToInval := req.snpHitReleaseToInval
956+
mp_cmometaw.snpHitReleaseToClean := req.snpHitReleaseToClean
933957
mp_cmometaw.snpHitReleaseWithData := req.snpHitReleaseWithData
934958
mp_cmometaw.snpHitReleaseIdx := req.snpHitReleaseIdx
935959
mp_cmometaw.snpHitReleaseState := req.snpHitReleaseState
@@ -1306,7 +1330,7 @@ class MSHR(implicit p: Parameters) extends TL2CHIL2Module with HasCHIOpcodes {
13061330
io.msInfo.bits.w_rprobeacklast := state.w_rprobeacklast
13071331
io.msInfo.bits.replaceData := isT(meta.state) && meta.dirty || probeDirty || // including WriteCleanFull
13081332
isWriteEvictFull || isWriteEvictOrEvict
1309-
io.msInfo.bits.releaseToB := releaseToB
1333+
io.msInfo.bits.releaseToClean := releaseToClean
13101334
io.msInfo.bits.channel := req.channel
13111335

13121336
assert(!(c_resp.valid && !io.status.bits.w_c_resp))

src/main/scala/coupledL2/tl2chi/MainPipe.scala

+43-8
Original file line numberDiff line numberDiff line change
@@ -326,14 +326,21 @@ class MainPipe(implicit p: Parameters) extends TL2CHIL2Module with HasCHIOpcodes
326326
)
327327
}
328328
when (req_s3.chiOpcode.get === SnpCleanShared) {
329-
respCacheState := Mux(meta_s3.state === BRANCH, SC, UC)
329+
respCacheState := Mux(isT(meta_s3.state), UC, SC)
330+
}
331+
332+
when (req_s3.snpHitReleaseToClean) {
333+
// On SnpOnce/SnpOnceFwd nesting WriteCleanFull, turn UD/UC to SC
334+
when (isSnpOnceX(req_s3.chiOpcode.get)) {
335+
respCacheState := SC
336+
}
330337
}
331338
}
332339

333340
when (req_s3.snpHitRelease) {
334341
/**
335342
* NOTICE: On Stash and Query:
336-
* the cache state must maintain unchanged on nested WriteBack
343+
* the cache state must maintain unchanged on nested copy-back writes
337344
*/
338345
when (isSnpStashX(req_s3.chiOpcode.get) || isSnpQuery(req_s3.chiOpcode.get)) {
339346
respCacheState := Mux(
@@ -361,6 +368,9 @@ class MainPipe(implicit p: Parameters) extends TL2CHIL2Module with HasCHIOpcodes
361368
}
362369
}
363370

371+
val sink_resp_s3_b_meta = MetaEntry()
372+
val sink_resp_s3_b_metaWen = Wire(Bool())
373+
364374
sink_resp_s3.valid := task_s3.valid && !mshr_req_s3 && !need_mshr_s3
365375
sink_resp_s3.bits := task_s3.bits
366376
sink_resp_s3.bits.mshrId := (1 << (mshrBits-1)).U + sink_resp_s3.bits.sourceId
@@ -392,7 +402,26 @@ class MainPipe(implicit p: Parameters) extends TL2CHIL2Module with HasCHIOpcodes
392402
)))
393403
sink_resp_s3.bits.resp.foreach(_ := Mux(
394404
req_s3.snpHitRelease && !(isSnpStashX(req_s3.chiOpcode.get) || isSnpQuery(req_s3.chiOpcode.get)),
395-
setPD(I, req_s3.snpHitReleaseWithData && req_s3.snpHitReleaseDirty && !isSnpMakeInvalidX(req_s3.chiOpcode.get)),
405+
setPD(
406+
// On directory hit under non-invalidating snoop nesting WriteCleanFull,
407+
// excluding SnpStashX and SnpQuery:
408+
// 1. SnpCleanShared[1-sink_resp] : UD -> UC_PD, UC -> UC, SC -> SC
409+
// 2. SnpOnce*[2-sink_resp] : UD -> SC_PD, UC -> SC, SC -> SC
410+
// 3. snpToB : UD -> SC_PD, UC -> SC, SC -> SC
411+
//
412+
// *NOTE[1-sink_resp]:
413+
// UD -> SC transitions were not used on WriteCleanFull without nesting snoop, and
414+
// only UD -> UC update could be observed on directory in this case
415+
// Therefore, it was unnecessary to observe cache state from nested WriteCleanFull MSHRs, while
416+
// extracting PassDirty from MSHRs
417+
//
418+
// *NOTE[2-sink_resp]:
419+
// UD -> UC transitions were not allowed on SnpOnce*, while permitting UD -> UD and UC -> UC
420+
// On SnpOnce*, UD/UC were turned into SC on nested WriteClean, on which directory must hit
421+
// Otherwise, the cache state was fast forwarded to I by default
422+
// Directory might be missing after multiple nesting snoops on WriteClean, indicating losing UD
423+
Mux(req_s3.snpHitReleaseToClean && !isSnpToN(req_s3.chiOpcode.get), respCacheState, I),
424+
req_s3.snpHitReleaseWithData && req_s3.snpHitReleaseDirty && !isSnpMakeInvalidX(req_s3.chiOpcode.get)),
396425
setPD(respCacheState, respPassDirty && (doRespData || doRespDataHitRelease))
397426
))
398427
sink_resp_s3.bits.fwdState.foreach(_ := setPD(fwdCacheState, fwdPassDirty))
@@ -402,6 +431,8 @@ class MainPipe(implicit p: Parameters) extends TL2CHIL2Module with HasCHIOpcodes
402431
false.B
403432
) // TODO: parameterize this
404433
sink_resp_s3.bits.size := log2Ceil(blockBytes).U
434+
sink_resp_s3.bits.meta := sink_resp_s3_b_meta
435+
sink_resp_s3.bits.metaWen := sink_resp_s3_b_metaWen
405436

406437
}.otherwise { // req_s3.fromC
407438
sink_resp_s3.bits.opcode := ReleaseAck
@@ -477,8 +508,11 @@ class MainPipe(implicit p: Parameters) extends TL2CHIL2Module with HasCHIOpcodes
477508

478509
/* ======== Write Directory ======== */
479510
val metaW_valid_s3_a = sinkA_req_s3 && !need_mshr_s3_a && !req_get_s3 && !req_prefetch_s3 && !cmo_cbo_s3 // get & prefetch that hit will not write meta
511+
// Also write directory on:
512+
// 1. SnpOnce nesting WriteCleanFull under UD (SnpOnceFwd always needs MSHR) for UD -> SC
480513
val metaW_valid_s3_b = sinkB_req_s3 && !need_mshr_s3_b && dirResult_s3.hit &&
481-
!isSnpOnceX(req_s3.chiOpcode.get) && !isSnpStashX(req_s3.chiOpcode.get) && !isSnpQuery(req_s3.chiOpcode.get) && (
514+
(!isSnpOnce(req_s3.chiOpcode.get) || (req_s3.snpHitReleaseToClean && req_s3.snpHitReleaseDirty)) &&
515+
!isSnpStashX(req_s3.chiOpcode.get) && !isSnpQuery(req_s3.chiOpcode.get) && (
482516
meta_s3.state === TIP || meta_s3.state === BRANCH && isSnpToN(req_s3.chiOpcode.get)
483517
)
484518
val metaW_valid_s3_c = sinkC_req_s3 && dirResult_s3.hit
@@ -551,6 +585,9 @@ class MainPipe(implicit p: Parameters) extends TL2CHIL2Module with HasCHIOpcodes
551585
io.tagWReq.bits.way := Mux(mshr_refill_s3 && req_s3.replTask, io.replResp.bits.way, req_s3.way)
552586
io.tagWReq.bits.wtag := req_s3.tag
553587

588+
sink_resp_s3_b_metaWen := metaW_valid_s3_b
589+
sink_resp_s3_b_meta := metaW_s3_b
590+
554591
/* ======== Interact with Channels (SourceD/TXREQ/TXRSP/TXDAT) ======== */
555592
val chnl_fire_s3 = d_s3.fire || txreq_s3.fire || txrsp_s3.fire || txdat_s3.fire
556593
val req_drop_s3 = !need_write_releaseBuf && (
@@ -625,11 +662,9 @@ class MainPipe(implicit p: Parameters) extends TL2CHIL2Module with HasCHIOpcodes
625662
*
626663
* *NOTICE: Never allow 'b_inv_dirty' on SnpStash*, SnpQuery and other future snoops that would
627664
* leave cache line state untouched.
628-
*
629-
* *TODO: A SnpOnce* nesting WriteCleanFull would result in SnpResp*_I_PD, which was simple to
630-
* implement but could be further optimized.
665+
* Never allow 'b_inv_dirty' on SnpOnce* nesting WriteCleanFull, which would end with SC.
631666
*/
632-
io.nestedwb.b_inv_dirty := task_s3.valid && task_s3.bits.fromB && source_req_s3.snpHitRelease &&
667+
io.nestedwb.b_inv_dirty := task_s3.valid && task_s3.bits.fromB && source_req_s3.snpHitReleaseToInval &&
633668
!(isSnpStashX(req_s3.chiOpcode.get) || isSnpQuery(req_s3.chiOpcode.get))
634669
io.nestedwb.b_toB.foreach(_ :=
635670
task_s3.valid && task_s3.bits.fromB && source_req_s3.metaWen && source_req_s3.meta.state === BRANCH

src/main/scala/coupledL2/tl2chi/RXSNP.scala

+7-3
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,11 @@ class RXSNP(
8888
(!s.bits.dirHit || !s.bits.s_cmoresp) && s.bits.metaState =/= INVALID &&
8989
RegNext(s.bits.w_replResp) && s.bits.w_rprobeacklast && !s.bits.w_releaseack
9090
)).asUInt
91-
val releaseToBNestSnpMask = replaceNestSnpMask & VecInit(io.msInfo.map(s =>
92-
s.bits.releaseToB
91+
val releaseToInvalNestSnpMask = replaceNestSnpMask & VecInit(io.msInfo.map(s =>
92+
!s.bits.releaseToClean
93+
)).asUInt
94+
val releaseToCleanNestSnpMask = replaceNestSnpMask & VecInit(io.msInfo.map(s =>
95+
s.bits.releaseToClean
9396
)).asUInt
9497
val replaceDataMask = VecInit(io.msInfo.map(_.bits.replaceData)).asUInt
9598

@@ -159,7 +162,8 @@ class RXSNP(
159162
task.mergeA := false.B
160163
task.aMergeTask := 0.U.asTypeOf(new MergeTaskBundle)
161164
task.snpHitRelease := replaceNestSnpMask.orR
162-
task.snpHitReleaseToB := releaseToBNestSnpMask.orR
165+
task.snpHitReleaseToInval := releaseToInvalNestSnpMask.orR
166+
task.snpHitReleaseToClean := releaseToCleanNestSnpMask.orR
163167
task.snpHitReleaseWithData := (replaceNestSnpMask & replaceDataMask).orR
164168
task.snpHitReleaseState := replaceNestSnpState
165169
task.snpHitReleaseDirty := replaceNestSnpDirty

src/main/scala/coupledL2/tl2tl/MSHR.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -571,7 +571,7 @@ class MSHR(implicit p: Parameters) extends L2Module {
571571
io.msInfo.bits.w_replResp := state.w_replResp
572572
io.msInfo.bits.w_rprobeacklast := state.w_rprobeacklast
573573
io.msInfo.bits.replaceData := mp_release.opcode === ReleaseData
574-
io.msInfo.bits.releaseToB := false.B
574+
io.msInfo.bits.releaseToClean := false.B
575575
io.msInfo.bits.metaState := meta.state
576576
io.msInfo.bits.metaDirty := meta.dirty
577577
io.msInfo.bits.probeDirty := probeDirty

src/main/scala/coupledL2/tl2tl/MainPipe.scala

+2-1
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,8 @@ class MainPipe(implicit p: Parameters) extends L2Module with HasPerfEvents {
240240
ms_task.aMergeTask := req_s3.aMergeTask
241241
ms_task.txChannel := 0.U
242242
ms_task.snpHitRelease := false.B
243-
ms_task.snpHitReleaseToB := false.B
243+
ms_task.snpHitReleaseToInval := false.B
244+
ms_task.snpHitReleaseToClean := false.B
244245
ms_task.snpHitReleaseWithData := false.B
245246
ms_task.snpHitReleaseIdx := 0.U
246247
ms_task.snpHitReleaseState := 0.U

src/main/scala/coupledL2/tl2tl/SinkB.scala

+2-1
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,8 @@ class SinkB(implicit p: Parameters) extends L2Module {
5050
task.wayMask := Fill(cacheParams.ways, "b1".U)
5151
task.reqSource := MemReqSource.NoWhere.id.U // Ignore
5252
task.snpHitRelease := false.B
53-
task.snpHitReleaseToB := false.B
53+
task.snpHitReleaseToInval := false.B
54+
task.snpHitReleaseToClean := false.B
5455
task.snpHitReleaseWithData := false.B
5556
task.snpHitReleaseIdx := 0.U
5657
task.snpHitReleaseState := 0.U

0 commit comments

Comments
 (0)