未验证 提交 6474c47f 编写于 作者: Y Yinan Xu 提交者: GitHub

rob: optimize timing for commit and walk (#1644)

* rob: separate walk and commit valid bits

* rob: optimize instrCnt timing

* rob: fix blockCommit condition when flushPipe

When flushPipe is enabled, it will block commits in ROB. However,
in the deqPtrModule, the commit is not blocked. This commit fixes
the issue.
上级 53b8f1a7
...@@ -371,15 +371,17 @@ class RobCommitInfo(implicit p: Parameters) extends XSBundle { ...@@ -371,15 +371,17 @@ class RobCommitInfo(implicit p: Parameters) extends XSBundle {
} }
class RobCommitIO(implicit p: Parameters) extends XSBundle { class RobCommitIO(implicit p: Parameters) extends XSBundle {
val isCommit = Output(Bool())
val commitValid = Vec(CommitWidth, Output(Bool()))
val isWalk = Output(Bool()) val isWalk = Output(Bool())
val valid = Vec(CommitWidth, Output(Bool()))
// valid bits optimized for walk // valid bits optimized for walk
val walkValid = Vec(CommitWidth, Output(Bool())) val walkValid = Vec(CommitWidth, Output(Bool()))
val info = Vec(CommitWidth, Output(new RobCommitInfo))
def hasWalkInstr = isWalk && valid.asUInt.orR val info = Vec(CommitWidth, Output(new RobCommitInfo))
def hasCommitInstr = !isWalk && valid.asUInt.orR def hasWalkInstr: Bool = isWalk && walkValid.asUInt.orR
def hasCommitInstr: Bool = isCommit && commitValid.asUInt.orR
} }
class RSFeedback(implicit p: Parameters) extends XSBundle { class RSFeedback(implicit p: Parameters) extends XSBundle {
......
...@@ -342,7 +342,9 @@ class CtrlBlockImp(outer: CtrlBlock)(implicit p: Parameters) extends LazyModuleI ...@@ -342,7 +342,9 @@ class CtrlBlockImp(outer: CtrlBlock)(implicit p: Parameters) extends LazyModuleI
// Flushes to frontend may be delayed by some cycles and commit before flush causes errors. // Flushes to frontend may be delayed by some cycles and commit before flush causes errors.
// Thus, we make all flush reasons to behave the same as exceptions for frontend. // Thus, we make all flush reasons to behave the same as exceptions for frontend.
for (i <- 0 until CommitWidth) { for (i <- 0 until CommitWidth) {
val is_commit = rob.io.commits.valid(i) && !rob.io.commits.isWalk && !rob.io.flushOut.valid // why flushOut: instructions with flushPipe are not commited to frontend
// If we commit them to frontend, it will cause flush after commit, which is not acceptable by frontend.
val is_commit = rob.io.commits.commitValid(i) && rob.io.commits.isCommit && !rob.io.flushOut.valid
io.frontend.toFtq.rob_commits(i).valid := RegNext(is_commit) io.frontend.toFtq.rob_commits(i).valid := RegNext(is_commit)
io.frontend.toFtq.rob_commits(i).bits := RegEnable(rob.io.commits.info(i), is_commit) io.frontend.toFtq.rob_commits(i).bits := RegEnable(rob.io.commits.info(i), is_commit)
} }
......
...@@ -253,12 +253,10 @@ class Rename(implicit p: Parameters) extends XSModule with HasPerfEvents { ...@@ -253,12 +253,10 @@ class Rename(implicit p: Parameters) extends XSModule with HasPerfEvents {
* Instructions commit: update freelist and rename table * Instructions commit: update freelist and rename table
*/ */
for (i <- 0 until CommitWidth) { for (i <- 0 until CommitWidth) {
val commitValid = io.robCommits.isCommit && io.robCommits.commitValid(i)
val walkValid = io.robCommits.isWalk && io.robCommits.walkValid(i)
Seq((io.intRenamePorts, false), (io.fpRenamePorts, true)) foreach { case (rat, fp) => Seq((io.intRenamePorts, false), (io.fpRenamePorts, true)) foreach { case (rat, fp) =>
// is valid commit req and given instruction has destination register
val commitDestValid = io.robCommits.valid(i) && needDestRegCommit(fp, io.robCommits.info(i))
XSDebug(p"isFp[${fp}]index[$i]-commitDestValid:$commitDestValid,isWalk:${io.robCommits.isWalk}\n")
/* /*
I. RAT Update I. RAT Update
*/ */
...@@ -279,14 +277,15 @@ class Rename(implicit p: Parameters) extends XSModule with HasPerfEvents { ...@@ -279,14 +277,15 @@ class Rename(implicit p: Parameters) extends XSModule with HasPerfEvents {
II. Free List Update II. Free List Update
*/ */
if (fp) { // Float Point free list if (fp) { // Float Point free list
fpFreeList.io.freeReq(i) := commitDestValid && !io.robCommits.isWalk fpFreeList.io.freeReq(i) := commitValid && needDestRegCommit(fp, io.robCommits.info(i))
fpFreeList.io.freePhyReg(i) := io.robCommits.info(i).old_pdest fpFreeList.io.freePhyReg(i) := io.robCommits.info(i).old_pdest
} else { // Integer free list } else { // Integer free list
intFreeList.io.freeReq(i) := intRefCounter.io.freeRegs(i).valid intFreeList.io.freeReq(i) := intRefCounter.io.freeRegs(i).valid
intFreeList.io.freePhyReg(i) := intRefCounter.io.freeRegs(i).bits intFreeList.io.freePhyReg(i) := intRefCounter.io.freeRegs(i).bits
} }
} }
intRefCounter.io.deallocate(i).valid := io.robCommits.valid(i) && needDestRegCommit(false, io.robCommits.info(i))
intRefCounter.io.deallocate(i).valid := (commitValid || walkValid) && needDestRegCommit(false, io.robCommits.info(i))
intRefCounter.io.deallocate(i).bits := Mux(io.robCommits.isWalk, io.robCommits.info(i).pdest, io.robCommits.info(i).old_pdest) intRefCounter.io.deallocate(i).bits := Mux(io.robCommits.isWalk, io.robCommits.info(i).pdest, io.robCommits.info(i).old_pdest)
} }
...@@ -308,10 +307,10 @@ class Rename(implicit p: Parameters) extends XSModule with HasPerfEvents { ...@@ -308,10 +307,10 @@ class Rename(implicit p: Parameters) extends XSModule with HasPerfEvents {
} }
XSDebug(io.robCommits.isWalk, p"Walk Recovery Enabled\n") XSDebug(io.robCommits.isWalk, p"Walk Recovery Enabled\n")
XSDebug(io.robCommits.isWalk, p"validVec:${Binary(io.robCommits.valid.asUInt)}\n") XSDebug(io.robCommits.isWalk, p"validVec:${Binary(io.robCommits.walkValid.asUInt)}\n")
for (i <- 0 until CommitWidth) { for (i <- 0 until CommitWidth) {
val info = io.robCommits.info(i) val info = io.robCommits.info(i)
XSDebug(io.robCommits.isWalk && io.robCommits.valid(i), p"[#$i walk info] pc:${Hexadecimal(info.pc)} " + XSDebug(io.robCommits.isWalk && io.robCommits.walkValid(i), p"[#$i walk info] pc:${Hexadecimal(info.pc)} " +
p"ldest:${info.ldest} rfWen:${info.rfWen} fpWen:${info.fpWen} " + p"ldest:${info.ldest} rfWen:${info.rfWen} fpWen:${info.fpWen} " +
p"pdest:${info.pdest} old_pdest:${info.old_pdest}\n") p"pdest:${info.pdest} old_pdest:${info.old_pdest}\n")
} }
......
...@@ -105,13 +105,13 @@ class RenameTableWrapper(implicit p: Parameters) extends XSModule { ...@@ -105,13 +105,13 @@ class RenameTableWrapper(implicit p: Parameters) extends XSModule {
intRat.io.readPorts <> io.intReadPorts.flatten intRat.io.readPorts <> io.intReadPorts.flatten
val intDestValid = io.robCommits.info.map(_.rfWen) val intDestValid = io.robCommits.info.map(_.rfWen)
for ((arch, i) <- intRat.io.archWritePorts.zipWithIndex) { for ((arch, i) <- intRat.io.archWritePorts.zipWithIndex) {
arch.wen := !io.robCommits.isWalk && io.robCommits.valid(i) && intDestValid(i) arch.wen := io.robCommits.isCommit && io.robCommits.commitValid(i) && intDestValid(i)
arch.addr := io.robCommits.info(i).ldest arch.addr := io.robCommits.info(i).ldest
arch.data := io.robCommits.info(i).pdest arch.data := io.robCommits.info(i).pdest
XSError(arch.wen && arch.addr === 0.U && arch.data =/= 0.U, "pdest for $0 should be 0\n") XSError(arch.wen && arch.addr === 0.U && arch.data =/= 0.U, "pdest for $0 should be 0\n")
} }
for ((spec, i) <- intRat.io.specWritePorts.zipWithIndex) { for ((spec, i) <- intRat.io.specWritePorts.zipWithIndex) {
spec.wen := io.robCommits.isWalk && io.robCommits.valid(i) && intDestValid(i) spec.wen := io.robCommits.isWalk && io.robCommits.walkValid(i) && intDestValid(i)
spec.addr := io.robCommits.info(i).ldest spec.addr := io.robCommits.info(i).ldest
spec.data := io.robCommits.info(i).old_pdest spec.data := io.robCommits.info(i).old_pdest
XSError(spec.wen && spec.addr === 0.U && spec.data =/= 0.U, "pdest for $0 should be 0\n") XSError(spec.wen && spec.addr === 0.U && spec.data =/= 0.U, "pdest for $0 should be 0\n")
...@@ -128,12 +128,12 @@ class RenameTableWrapper(implicit p: Parameters) extends XSModule { ...@@ -128,12 +128,12 @@ class RenameTableWrapper(implicit p: Parameters) extends XSModule {
fpRat.io.debug_rdata <> io.debug_fp_rat fpRat.io.debug_rdata <> io.debug_fp_rat
fpRat.io.readPorts <> io.fpReadPorts.flatten fpRat.io.readPorts <> io.fpReadPorts.flatten
for ((arch, i) <- fpRat.io.archWritePorts.zipWithIndex) { for ((arch, i) <- fpRat.io.archWritePorts.zipWithIndex) {
arch.wen := !io.robCommits.isWalk && io.robCommits.valid(i) && io.robCommits.info(i).fpWen arch.wen := io.robCommits.isCommit && io.robCommits.commitValid(i) && io.robCommits.info(i).fpWen
arch.addr := io.robCommits.info(i).ldest arch.addr := io.robCommits.info(i).ldest
arch.data := io.robCommits.info(i).pdest arch.data := io.robCommits.info(i).pdest
} }
for ((spec, i) <- fpRat.io.specWritePorts.zipWithIndex) { for ((spec, i) <- fpRat.io.specWritePorts.zipWithIndex) {
spec.wen := io.robCommits.isWalk && io.robCommits.valid(i) && io.robCommits.info(i).fpWen spec.wen := io.robCommits.isWalk && io.robCommits.walkValid(i) && io.robCommits.info(i).fpWen
spec.addr := io.robCommits.info(i).ldest spec.addr := io.robCommits.info(i).ldest
spec.data := io.robCommits.info(i).old_pdest spec.data := io.robCommits.info(i).old_pdest
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册