Skip to content

Commit 8cbf000

Browse files
wissyghTang-Haojin
authored andcommitted
fix(CSR, Trace): remove reg isXRetFlag in CSR
* remove useless reg `isXRetFlag` in CSR.scala * fix update of itype for xret instruction
1 parent 3ad9f3d commit 8cbf000

File tree

3 files changed

+16
-20
lines changed

3 files changed

+16
-20
lines changed

src/main/scala/xiangshan/backend/CtrlBlock.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,7 @@ class CtrlBlockImp(
257257
trace.io.in.fromPcMem(i) := pcMem.io.rdata(pcMemIdx).getPc(RegEnable(trace.toPcMem.blocks(i).bits.ftqOffset.get, traceValid))
258258
}
259259

260-
// Trap/Xret only occor in block(0).
260+
// Trap/Xret only occur in block(0).
261261
val tracePriv = Mux(Itype.isTrapOrXret(trace.toEncoder.blocks(0).bits.tracePipe.itype),
262262
io.fromCSR.traceCSR.lastPriv,
263263
io.fromCSR.traceCSR.currentPriv

src/main/scala/xiangshan/backend/fu/wrapper/CSR.scala

+1-8
Original file line numberDiff line numberDiff line change
@@ -228,13 +228,6 @@ class CSR(cfg: FuConfig)(implicit p: Parameters) extends FuncUnit(cfg)
228228

229229
val isXRet = valid && func === CSROpType.jmp && !isEcall && !isEbreak
230230

231-
// ctrl block will use theses later for flush // Todo: optimize isXRetFlag's DelayN
232-
val isXRetFlag = RegInit(false.B)
233-
isXRetFlag := Mux1H(Seq(
234-
DelayN(flush, 5) -> false.B,
235-
isXRet -> true.B,
236-
))
237-
238231
flushPipe := csrMod.io.out.bits.flushPipe
239232

240233
// tlb
@@ -306,7 +299,7 @@ class CSR(cfg: FuConfig)(implicit p: Parameters) extends FuncUnit(cfg)
306299
csrOut.vpu.vstart := csrMod.io.status.vecState.vstart.asUInt
307300
csrOut.vpu.vxrm := csrMod.io.status.vecState.vxrm.asUInt
308301

309-
csrOut.isXRet := RegEnable(isXRetFlag, false.B, io.in.fire)
302+
csrOut.isXRet := isXRet
310303

311304
csrOut.trapTarget := csrMod.io.out.bits.targetPc
312305
csrOut.interrupt := csrMod.io.status.interrupt

src/main/scala/xiangshan/backend/rob/Rob.scala

+14-11
Original file line numberDiff line numberDiff line change
@@ -1038,11 +1038,7 @@ class RobImp(override val wrapper: Rob)(implicit p: Parameters, params: BackendP
10381038

10391039
// trace
10401040
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){
10461042
// BranchType code(notaken itype = 4) must be correctly replaced!
10471043
robEntries(i).traceBlockInPipe.itype := Itype.Taken
10481044
}
@@ -1106,10 +1102,7 @@ class RobImp(override val wrapper: Rob)(implicit p: Parameters, params: BackendP
11061102

11071103
// trace
11081104
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){
11131106
// BranchType code(notaken itype = 4) must be correctly replaced!
11141107
needUpdate(i).traceBlockInPipe.itype := Itype.Taken
11151108
}
@@ -1239,16 +1232,26 @@ class RobImp(override val wrapper: Rob)(implicit p: Parameters, params: BackendP
12391232
val traceBlocks = io.trace.traceCommitInfo.blocks
12401233
val traceBlockInPipe = io.trace.traceCommitInfo.blocks.map(_.bits.tracePipe)
12411234

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+
12421243
for (i <- 0 until CommitWidth) {
12431244
traceBlocks(i).bits.ftqIdx.foreach(_ := rawInfo(i).ftqIdx)
12441245
traceBlocks(i).bits.ftqOffset.foreach(_ := rawInfo(i).ftqOffset)
12451246
traceBlockInPipe(i).itype := rawInfo(i).traceBlockInPipe.itype
12461247
traceBlockInPipe(i).iretire := rawInfo(i).traceBlockInPipe.iretire
12471248
traceBlockInPipe(i).ilastsize := rawInfo(i).traceBlockInPipe.ilastsize
12481249
traceValids(i) := io.commits.isCommit && io.commits.commitValid(i)
1249-
// exception only occor block(0).
1250+
// exception/xret only occur in block(0).
12501251
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
12521255
traceBlocks(i).bits.tracePipe.itype := Mux(io.exception.bits.isInterrupt,
12531256
Itype.Interrupt,
12541257
Itype.Exception

0 commit comments

Comments
 (0)