@@ -1038,11 +1038,7 @@ class RobImp(override val wrapper: Rob)(implicit p: Parameters, params: BackendP
1038
1038
1039
1039
// trace
1040
1040
val taken = branchWBs.map(writeback => writeback.valid && writeback.bits.robIdx.value === i.U && writeback.bits.redirect.get.bits.cfiUpdate.taken).reduce(_ || _)
1041
- val xret = csrWBs.map(writeback => writeback.valid && writeback.bits.robIdx.value === i.U && io.csr.isXRet).reduce(_ || _)
1042
-
1043
- when(robEntries(i).valid && xret){
1044
- robEntries(i).traceBlockInPipe.itype := Itype .ExpIntReturn
1045
- }.elsewhen(robEntries(i).valid && Itype .isBranchType(robEntries(i).traceBlockInPipe.itype) && taken){
1041
+ when(robEntries(i).valid && Itype .isBranchType(robEntries(i).traceBlockInPipe.itype) && taken){
1046
1042
// BranchType code(notaken itype = 4) must be correctly replaced!
1047
1043
robEntries(i).traceBlockInPipe.itype := Itype .Taken
1048
1044
}
@@ -1106,10 +1102,7 @@ class RobImp(override val wrapper: Rob)(implicit p: Parameters, params: BackendP
1106
1102
1107
1103
// trace
1108
1104
val taken = branchWBs.map(writeback => writeback.valid && writeback.bits.robIdx.value === needUpdateRobIdx(i) && writeback.bits.redirect.get.bits.cfiUpdate.taken).reduce(_ || _)
1109
- val xret = csrWBs.map(writeback => writeback.valid && writeback.bits.robIdx.value === needUpdateRobIdx(i) && io.csr.isXRet).reduce(_ || _)
1110
- when(robBanksRdata(i).valid && xret){
1111
- needUpdate(i).traceBlockInPipe.itype := Itype .ExpIntReturn
1112
- }.elsewhen(robBanksRdata(i).valid && Itype .isBranchType(robBanksRdata(i).traceBlockInPipe.itype) && taken){
1105
+ when(robBanksRdata(i).valid && Itype .isBranchType(robBanksRdata(i).traceBlockInPipe.itype) && taken){
1113
1106
// BranchType code(notaken itype = 4) must be correctly replaced!
1114
1107
needUpdate(i).traceBlockInPipe.itype := Itype .Taken
1115
1108
}
@@ -1239,16 +1232,26 @@ class RobImp(override val wrapper: Rob)(implicit p: Parameters, params: BackendP
1239
1232
val traceBlocks = io.trace.traceCommitInfo.blocks
1240
1233
val traceBlockInPipe = io.trace.traceCommitInfo.blocks.map(_.bits.tracePipe)
1241
1234
1235
+ // The reg 'isTraceXret' only for trace xret instructions. xret only occur in block(0).
1236
+ val isTraceXret = RegInit (false .B )
1237
+ when(io.csr.isXRet){
1238
+ isTraceXret := true .B
1239
+ }.elsewhen(isTraceXret && io.commits.isCommit && io.commits.commitValid(0 )){
1240
+ isTraceXret := false .B
1241
+ }
1242
+
1242
1243
for (i <- 0 until CommitWidth ) {
1243
1244
traceBlocks(i).bits.ftqIdx.foreach(_ := rawInfo(i).ftqIdx)
1244
1245
traceBlocks(i).bits.ftqOffset.foreach(_ := rawInfo(i).ftqOffset)
1245
1246
traceBlockInPipe(i).itype := rawInfo(i).traceBlockInPipe.itype
1246
1247
traceBlockInPipe(i).iretire := rawInfo(i).traceBlockInPipe.iretire
1247
1248
traceBlockInPipe(i).ilastsize := rawInfo(i).traceBlockInPipe.ilastsize
1248
1249
traceValids(i) := io.commits.isCommit && io.commits.commitValid(i)
1249
- // exception only occor block(0).
1250
+ // exception/xret only occur in block(0).
1250
1251
if (i == 0 ) {
1251
- when(io.exception.valid){
1252
+ when(isTraceXret && io.commits.isCommit && io.commits.commitValid(0 )){ // trace xret
1253
+ traceBlocks(i).bits.tracePipe.itype := Itype .ExpIntReturn
1254
+ }.elsewhen(io.exception.valid){ // trace exception
1252
1255
traceBlocks(i).bits.tracePipe.itype := Mux (io.exception.bits.isInterrupt,
1253
1256
Itype .Interrupt ,
1254
1257
Itype .Exception
0 commit comments