提交 13ad8a8f 编写于 作者: D Dan Tang

roq: only update fflags when fmac,fmisc,i2f units write back

上级 b44dfbf5
......@@ -57,7 +57,6 @@ class RoqDispatchData extends RoqCommitInfo {
}
class RoqWbData extends XSBundle {
val fflags = UInt(5.W)
val flushPipe = Bool()
}
......@@ -264,6 +263,7 @@ class Roq(numWbPorts: Int) extends XSModule with HasCircularQueuePtrHelper {
val writebackDataRead = writebackData.io.rdata
val exceptionDataRead = Wire(Vec(CommitWidth, ExceptionVec()))
val fflagsDataRead = Wire(Vec(CommitWidth, UInt(5.W)))
io.roqDeqPtr := deqPtr
......@@ -391,7 +391,7 @@ class Roq(numWbPorts: Int) extends XSModule with HasCircularQueuePtrHelper {
}).unzip
val fflags = Wire(Valid(UInt(5.W)))
fflags.valid := Mux(io.commits.isWalk, false.B, Cat(wflags).orR())
fflags.bits := wflags.zip(writebackDataRead.map(_.fflags)).map({
fflags.bits := wflags.zip(fflagsDataRead).map({
case (w, f) => Mux(w, f, 0.U)
}).reduce(_|_)
val dirty_fs = Mux(io.commits.isWalk, false.B, Cat(fpWen).orR())
......@@ -425,7 +425,7 @@ class Roq(numWbPorts: Int) extends XSModule with HasCircularQueuePtrHelper {
io.commits.info(i).pdest,
io.commits.info(i).old_pdest,
debug_exuData(deqPtrVec(i).value),
writebackDataRead(i).fflags.asUInt
fflagsDataRead(i)
)
XSInfo(state === s_walk && io.commits.valid(i), "walked pc %x wen %d ldst %d data %x\n",
debug_microOp(walkPtrVec(i).value).cf.pc,
......@@ -628,13 +628,13 @@ class Roq(numWbPorts: Int) extends XSModule with HasCircularQueuePtrHelper {
writebackData.io.wen := io.exeWbResults.map(_.valid)
writebackData.io.waddr := io.exeWbResults.map(_.bits.uop.roqIdx.value)
writebackData.io.wdata.zip(io.exeWbResults.map(_.bits)).map{ case (wdata, wb) =>
wdata.fflags := wb.fflags
wdata.flushPipe := wb.uop.ctrl.flushPipe
}
writebackData.io.raddr := commitReadAddr_next
for (i <- 0 until 16) {
val exceptionData = Module(new SyncDataModuleTemplate(Bool(), RoqSize, CommitWidth, RenameWidth + writebackCount(i)))
exceptionData.suggestName("exceptionData")
var wPortIdx = 0
for (j <- 0 until RenameWidth) {
exceptionData.io.wen (wPortIdx) := canEnqueue(j)
......@@ -675,6 +675,30 @@ class Roq(numWbPorts: Int) extends XSModule with HasCircularQueuePtrHelper {
exceptionDataRead.zip(exceptionData.io.rdata).map{ case (d, r) => d(i) := r }
}
val fflagsDataModule = Module(new SyncDataModuleTemplate(UInt(5.W), RoqSize, CommitWidth, 7))
var wPortIdx = 0
// 4 FMACs
for (i <- 0 until 4) {
fflagsDataModule.io.wen (wPortIdx) := io.exeWbResults(8+i).valid
fflagsDataModule.io.waddr(wPortIdx) := io.exeWbResults(8+i).bits.uop.roqIdx.value
fflagsDataModule.io.wdata(wPortIdx) := io.exeWbResults(8+i).bits.fflags
wPortIdx = wPortIdx + 1
}
// 2 FMISCs (the first one includes I2F from JumpUnit)
for (i <- 0 until 2) {
fflagsDataModule.io.wen (wPortIdx) := io.exeWbResults(14+i).valid
fflagsDataModule.io.waddr(wPortIdx) := io.exeWbResults(14+i).bits.uop.roqIdx.value
fflagsDataModule.io.wdata(wPortIdx) := io.exeWbResults(14+i).bits.fflags
wPortIdx = wPortIdx + 1
}
// 1 FMISC (Int Wb)
fflagsDataModule.io.wen (wPortIdx) := io.exeWbResults(7).valid
fflagsDataModule.io.waddr(wPortIdx) := io.exeWbResults(7).bits.uop.roqIdx.value
fflagsDataModule.io.wdata(wPortIdx) := io.exeWbResults(7).bits.fflags
fflagsDataModule.io.raddr := VecInit(deqPtrVec_next.map(_.value))
fflagsDataRead := fflagsDataModule.io.rdata
/**
* debug info
*/
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册