Skip to content

Commit b40da89

Browse files
authored
fix(TXDAT): fix wrong DataCheck generation when data invalid (#455)
When snoop transactions(e.g. SnpMakeInvalid) nest write transactions(e.g. WriteCleanFull), data of write transactions may be changed to invalid. Under above cases, the corresponding DataCheck field should be generated by invalid data(DataCheck = 0xffffffff)
1 parent f118bca commit b40da89

File tree

1 file changed

+8
-7
lines changed

1 file changed

+8
-7
lines changed

src/main/scala/coupledL2/tl2chi/TXDAT.scala

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -130,22 +130,23 @@ class TXDAT(implicit p: Parameters) extends TL2CHIL2Module with HasCHIOpcodes {
130130
require(beat.getWidth == dat.data.getWidth)
131131
val beatOffsetWidth = log2Up(beatBytes)
132132

133+
val deassertBE = task.chiOpcode.get === CopyBackWrData && task.resp.get === I ||
134+
task.chiOpcode.get === WriteDataCancel
135+
val be = Fill(BE_WIDTH, !deassertBE)
136+
137+
val data = deassertData(beat, be)
133138
val dataCheck = if (enableDataCheck) {
134139
dataCheckMethod match {
135-
case 1 => VecInit((0 until DATACHECK_WIDTH).map(i => beat(8 * (i + 1) - 1, 8 * i).xorR ^ true.B)).asUInt
140+
case 1 => VecInit((0 until DATACHECK_WIDTH).map(i => data(8 * (i + 1) - 1, 8 * i).xorR ^ true.B)).asUInt
136141
case 2 =>
137142
val code = new SECDEDCode
138-
VecInit((0 until DATACHECK_WIDTH).map(i => code.encode(beat(8 * (i + 1) - 1, 8 * i)))).asUInt
143+
VecInit((0 until DATACHECK_WIDTH).map(i => code.encode(data(8 * (i + 1) - 1, 8 * i)))).asUInt
139144
case _ => 0.U(DATACHECK_WIDTH.W)
140145
}
141146
} else {
142147
DontCare
143148
}
144149

145-
val deassertBE = task.chiOpcode.get === CopyBackWrData && task.resp.get === I ||
146-
task.chiOpcode.get === WriteDataCancel
147-
val be = Fill(BE_WIDTH, !deassertBE)
148-
149150
dat.tgtID := task.tgtID.get
150151
dat.srcID := task.srcID.get
151152
dat.txnID := task.txnID.get
@@ -162,7 +163,7 @@ class TXDAT(implicit p: Parameters) extends TL2CHIL2Module with HasCHIOpcodes {
162163
List.tabulate(beatSize)(i => (i << (beatOffsetWidth - ChunkOffsetWidth)).U)
163164
)
164165
dat.be := be
165-
dat.data := deassertData(beat, be)
166+
dat.data := data
166167
dat.resp := task.resp.get
167168
// dat.fwdState := task.fwdState.get
168169
dat.setFwdState(task.fwdState.get)

0 commit comments

Comments
 (0)