diff --git a/src/main/scala/xiangshan/Bundle.scala b/src/main/scala/xiangshan/Bundle.scala index 796224c351511e5aec9b15fb8fc04c2a79f76978..f70f8be5c390af2c53aef146ef851cddacd2842e 100644 --- a/src/main/scala/xiangshan/Bundle.scala +++ b/src/main/scala/xiangshan/Bundle.scala @@ -57,6 +57,7 @@ class Redirect extends XSBundle { val brTag = UInt(BrTagWidth.W) val isException = Bool() val roqIdx = UInt(RoqIdxWidth.W) + val freelistAllocPtr = UInt(PhyRegIdxWidth.W) } class Dp1ToDp2IO extends XSBundle { diff --git a/src/main/scala/xiangshan/backend/Backend.scala b/src/main/scala/xiangshan/backend/Backend.scala index 00559497ef10afba85b26b0af4687d76d8673d97..662245542d798fd84a22f96d93887a4f21e458bc 100644 --- a/src/main/scala/xiangshan/backend/Backend.scala +++ b/src/main/scala/xiangshan/backend/Backend.scala @@ -12,7 +12,7 @@ import xiangshan.backend.brq.Brq import xiangshan.backend.dispatch.{Dispatch1, Dispatch2} import xiangshan.backend.exu._ import xiangshan.backend.issue.IssueQueue -import xiangshan.backend.regfile.Regfile +import xiangshan.backend.regfile.{Regfile, RfWritePort} import xiangshan.backend.roq.Roq @@ -89,6 +89,8 @@ class Backend(implicit val p: XSConfig) extends XSModule dispatch1.io.roqIdxs <> roq.io.roqIdxs dispatch2.io.in <> dispatch1.io.out + dispatch2.io.intPregRdy <> rename.io.intPregRdy + dispatch2.io.fpPregRdy <> rename.io.fpPregRdy intRf.io.readPorts <> dispatch2.io.readIntRf fpRf.io.readPorts <> dispatch2.io.readFpRf @@ -98,12 +100,25 @@ class Backend(implicit val p: XSConfig) extends XSModule val wbFpReqs = (fmacExeUnits ++ fmiscExeUnits ++ fmiscDivSqrtExeUnits).map(_.io.out) val intWbArb = Module(new WriteBackArbMtoN(wbIntReqs.length, NRWritePorts)) val fpWbArb = Module(new WriteBackArbMtoN(wbFpReqs.length, NRWritePorts)) + val wbIntResults = intWbArb.io.out + val wbFpResults = fpWbArb.io.out + + def exuOutToRfWrite(x: Valid[ExuOutput]) = { + val rfWrite = Wire(new RfWritePort) + rfWrite.wen := x.valid + rfWrite.addr := x.bits.uop.pdest + rfWrite.data := x.bits.data + rfWrite + } intWbArb.io.in <> wbIntReqs - intRf.io.writePorts <> intWbArb.io.out + intRf.io.writePorts <> wbIntResults.map(exuOutToRfWrite) fpWbArb.io.in <> wbFpReqs - fpRf.io.writePorts <> fpWbArb.io.out + fpRf.io.writePorts <> wbFpResults.map(exuOutToRfWrite) + + rename.io.wbIntResults <> wbIntResults + rename.io.wbFpResults <> wbFpResults roq.io.exeWbResults <> exeWbReqs diff --git a/src/main/scala/xiangshan/backend/dispatch/Dispatch2.scala b/src/main/scala/xiangshan/backend/dispatch/Dispatch2.scala index 7ee8fec4c314effc22e35db9e69a08d90e13d5f6..8eed91e3f1dd7eaaac0bfbd75a785eae30cc1bd0 100644 --- a/src/main/scala/xiangshan/backend/dispatch/Dispatch2.scala +++ b/src/main/scala/xiangshan/backend/dispatch/Dispatch2.scala @@ -13,6 +13,9 @@ class Dispatch2 extends XSModule with NeedImpl { // read regfile val readIntRf = Vec(NRReadPorts, Flipped(new RfReadPort)) val readFpRf = Vec(NRReadPorts, Flipped(new RfReadPort)) + // read reg status (busy/ready) + val intPregRdy = Vec(NRReadPorts, Input(Bool())) + val fpPregRdy = Vec(NRReadPorts, Input(Bool())) // enq Issue Queue val enqIQCtrl = Vec(exuConfig.ExuCnt, DecoupledIO(new MicroOp)) diff --git a/src/main/scala/xiangshan/backend/exu/Exu.scala b/src/main/scala/xiangshan/backend/exu/Exu.scala index 3202ebd5c3ecd43d24c2d754bd91632cf84ad541..39c0db75e5470fa9c1abc1ebc1f533907aa9db1c 100644 --- a/src/main/scala/xiangshan/backend/exu/Exu.scala +++ b/src/main/scala/xiangshan/backend/exu/Exu.scala @@ -4,7 +4,6 @@ import chisel3._ import chisel3.util._ import xiangshan._ import xiangshan.FuType._ -import xiangshan.backend.regfile.RfWritePort case class ExuConfig ( @@ -113,7 +112,7 @@ trait HasExeUnits{ class WriteBackArbMtoN(m: Int, n: Int) extends XSModule with NeedImpl { val io = IO(new Bundle() { val in = Vec(m, Flipped(DecoupledIO(new ExuOutput))) - val out = Vec(n, Flipped(new RfWritePort)) + val out = Vec(n, ValidIO(new ExuOutput)) }) } diff --git a/src/main/scala/xiangshan/backend/rename/Rename.scala b/src/main/scala/xiangshan/backend/rename/Rename.scala index 3470a2896e14e2ecb2db1fbc6a1369c72addbc77..968b527ca0c743bf2ec62b06550ec64396b337a8 100644 --- a/src/main/scala/xiangshan/backend/rename/Rename.scala +++ b/src/main/scala/xiangshan/backend/rename/Rename.scala @@ -8,7 +8,13 @@ class Rename extends XSModule with NeedImpl { val io = IO(new Bundle() { val redirect = Flipped(ValidIO(new Redirect)) val roqCommits = Vec(CommitWidth, Flipped(ValidIO(new RoqCommit))) + val wbIntResults = Vec(NRWritePorts, Flipped(ValidIO(new ExuOutput))) + val wbFpResults = Vec(NRWritePorts, Flipped(ValidIO(new ExuOutput))) + val intPregRdy = Vec(NRReadPorts, Output(Bool())) + val fpPregRdy = Vec(NRReadPorts, Output(Bool())) + // from decode buffer val in = Vec(RenameWidth, Flipped(DecoupledIO(new CfCtrl))) + // to dispatch1 val out = Vec(RenameWidth, DecoupledIO(new MicroOp)) }) }