@@ -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