Skip to content

Commit 82346e2

Browse files
sumailyycYan-Yiming
authored andcommitted
feat(OpenLLC): add support for ReadNoSnp transaction (OpenXiangShan/OpenLLC#22)
1 parent 0c2c1a0 commit 82346e2

File tree

3 files changed

+11
-7
lines changed

3 files changed

+11
-7
lines changed

llc-src/src/main/scala/openLLC/MainPipe.scala

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -126,9 +126,10 @@ 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 readNoSnp_s3 = !refill_task_s3 && opcode_s3 === ReadNoSnp
129130

130131
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")
132+
evict_s3 || makeInvalid_s3 || cleanInvalid_s3 || cleanShared_s3 || writeCleanFull_s3 || readNoSnp_s3, "Unsupported opcode")
132133

133134
/**
134135
* Requests have different coherence states after processing
@@ -257,6 +258,7 @@ class MainPipe(implicit p: Parameters) extends LLCModule with HasCHIOpcodes {
257258
val cleanInvalid_s4 = RegNext(cleanInvalid_s3, false.B)
258259
val cleanShared_s4 = RegNext(cleanShared_s3, false.B)
259260
val writeCleanFull_s4 = RegNext(writeCleanFull_s3, false.B)
261+
val readNoSnp_s4 = RegNext(readNoSnp_s3, false.B)
260262
val sharedReq_s4 = RegNext(sharedReq_s3, false.B)
261263
val exclusiveReq_s4 = RegNext(exclusiveReq_s3, false.B)
262264
val releaseReq_s4 = RegNext(releaseReq_s3, false.B)
@@ -374,7 +376,7 @@ class MainPipe(implicit p: Parameters) extends LLCModule with HasCHIOpcodes {
374376
val respSC_s4 = sharedReq_s4
375377
val respUC_s4 = makeUnique_s4 || !makeUnique_s4 && exclusiveReq_s4 && (!selfDirty_s4 || !self_hit_s4)
376378
val respUD_s4 = !makeUnique_s4 && exclusiveReq_s4 && self_hit_s4 && selfDirty_s4
377-
val respI_s4 = releaseReq_s4 || invalidReq_s4 || cleanReq_s4 || writeCleanFull_s4
379+
val respI_s4 = releaseReq_s4 || invalidReq_s4 || cleanReq_s4 || writeCleanFull_s4 || readNoSnp_s4
378380
val snpVec_comp_s4 = VecInit(
379381
Mux(
380382
request_snoop_s4,
@@ -394,12 +396,12 @@ class MainPipe(implicit p: Parameters) extends LLCModule with HasCHIOpcodes {
394396
)
395397

396398
comp_s4.valid := task_s4.valid && (
397-
releaseReq_s4 || invalidReq_s4 || cleanReq_s4 || makeUnique_s4 || writeCleanFull_s4 ||
399+
releaseReq_s4 || invalidReq_s4 || cleanReq_s4 || makeUnique_s4 || writeCleanFull_s4 || readNoSnp_s4 ||
398400
(readNotSharedDirty_s4 || readUnique_s4) && !self_hit_s4
399401
)
400402
comp_s4.bits.state.s_comp := false.B
401403
comp_s4.bits.state.s_urgentRead := true.B
402-
comp_s4.bits.state.w_datRsp := !(readNotSharedDirty_s4 || readUnique_s4)
404+
comp_s4.bits.state.w_datRsp := !(readNotSharedDirty_s4 || readUnique_s4 || readNoSnp_s4)
403405
comp_s4.bits.state.w_snpRsp := !Cat(snpVec_comp_s4).orR
404406
comp_s4.bits.state.w_compack := !(readUnique_s4 || readNotSharedDirty_s4 || makeUnique_s4)
405407
comp_s4.bits.state.w_comp := !(cleanInvalid_s4 && self_hit_s4 && selfDirty_s4)
@@ -420,7 +422,7 @@ class MainPipe(implicit p: Parameters) extends LLCModule with HasCHIOpcodes {
420422
mem_task_s4.expCompAck := false.B
421423

422424
// need ReadNoSnp/WriteNoSnp downwards
423-
val memRead_s4 = (readNotSharedDirty_s4 || readUnique_s4) && !self_hit_s4 && !peerRNs_hit_s4
425+
val memRead_s4 = (readNotSharedDirty_s4 || readUnique_s4) && !self_hit_s4 && !peerRNs_hit_s4 || readNoSnp_s4
424426
val memWrite_s4 = cleanReq_s4 && unique_peerRN_s4 || writeCleanFull_s4
425427
mem_s4.valid := task_s4.valid && (memRead_s4 || memWrite_s4)
426428
mem_s4.bits.state.s_issueReq := false.B

llc-src/src/main/scala/openLLC/RequestArb.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,9 @@ class RequestArb(implicit p: Parameters) extends LLCModule with HasClientInfo wi
6767
val isCleanInvalid_s1 = !task_s1.bits.refillTask && task_s1.bits.chiOpcode === CleanInvalid
6868
val isCleanShared_s1 = !task_s1.bits.refillTask && task_s1.bits.chiOpcode === CleanShared
6969
val isWriteCleanFull_s1 = !task_s1.bits.refillTask && task_s1.bits.chiOpcode === WriteCleanFull
70+
val isReadNoSnp_s1 = !task_s1.bits.refillTask && task_s1.bits.chiOpcode === ReadNoSnp
7071

71-
val isRead_s1 = isReadNotSharedDirty_s1 || isReadUnique_s1
72+
val isRead_s1 = isReadNotSharedDirty_s1 || isReadUnique_s1 || isReadNoSnp_s1
7273
val isClean_s1 = isCleanInvalid_s1 || isCleanShared_s1 || isWriteCleanFull_s1
7374

7475
// To prevent data hazards caused by read-after-write conflicts in the directory,

llc-src/src/main/scala/openLLC/ResponseUnit.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,8 @@ class ResponseUnit(implicit p: Parameters) extends LLCModule with HasCHIOpcodes
265265
}
266266

267267
/* Issue */
268-
val isRead = buffer.map(e => e.task.chiOpcode === ReadUnique || e.task.chiOpcode === ReadNotSharedDirty)
268+
val isRead = buffer.map(e => e.task.chiOpcode === ReadUnique || e.task.chiOpcode === ReadNotSharedDirty ||
269+
e.task.chiOpcode === ReadNoSnp)
269270
txdatArb.io.in.zip(buffer).zip(isRead).foreach { case ((in, e), r) =>
270271
in.valid := e.valid && e.state.w_datRsp && e.state.w_snpRsp && e.state.s_urgentRead && !e.state.s_comp && r
271272
in.bits.task := e.task

0 commit comments

Comments
 (0)