Skip to content

Commit 387ca18

Browse files
committed
Fix relying on speculative values for PSF
1 parent 96ed8ed commit 387ca18

1 file changed

Lines changed: 16 additions & 14 deletions

File tree

‎src/main/scala/riscv/plugins/scheduling/dynamic/ReorderBuffer.scala‎

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -616,7 +616,17 @@ class ReorderBuffer(
616616
}
617617

618618
if (config.addressBasedPsf) {
619-
when(lsu.psfMisspeculation(rdbMessage.registerMap)) {
619+
when(
620+
lsu.psfMisspeculation(rdbMessage.registerMap) || (robEntries(
621+
rdbMessage.robIndex
622+
).registerMap
623+
.elementAs[Bool](
624+
pipeline.data.RD_DATA_VALID.asInstanceOf[PipelineData[Data]]
625+
) && rdbMessage.registerMap.element(
626+
pipeline.data.RD_DATA.asInstanceOf[PipelineData[Data]]
627+
) =/= robEntries(rdbMessage.robIndex).registerMap
628+
.element(pipeline.data.RD_DATA.asInstanceOf[PipelineData[Data]]))
629+
) {
620630
psfMispredictions := psfMispredictions + 1
621631
addPsfPredictorEntry(
622632
robEntries(rdbMessage.robIndex).registerMap
@@ -644,25 +654,17 @@ class ReorderBuffer(
644654
psfPredictions := psfPredictions + 1
645655
}
646656
}
647-
}
648-
649-
if (!config.addressBasedPsf) {
657+
} else {
650658
// detect wrongly forwarded value-based PSF
651659
when(
652660
lsu.operationOfBundle(rdbMessage.registerMap) === LsuOperationType.LOAD && robEntries(
653661
rdbMessage.robIndex
654662
).cdbUpdated
655663
) {
656-
val psfMismatch: Bool = if (config.addressBasedPsf) {
657-
lsu.psfAddress(robEntries(rdbMessage.robIndex).registerMap) =/= lsu.addressOfBundle(
658-
rdbMessage.registerMap
659-
)
660-
} else {
661-
rdbMessage.registerMap.element(
662-
pipeline.data.RD_DATA.asInstanceOf[PipelineData[Data]]
663-
) =/= robEntries(rdbMessage.robIndex).registerMap
664-
.element(pipeline.data.RD_DATA.asInstanceOf[PipelineData[Data]])
665-
}
664+
val psfMismatch: Bool = rdbMessage.registerMap.element(
665+
pipeline.data.RD_DATA.asInstanceOf[PipelineData[Data]]
666+
) =/= robEntries(rdbMessage.robIndex).registerMap
667+
.element(pipeline.data.RD_DATA.asInstanceOf[PipelineData[Data]])
666668

667669
when(psfMismatch) {
668670
psfMispredictions := psfMispredictions + 1

0 commit comments

Comments
 (0)