提交 c7d17c6d 编写于 作者: L LinJiawei

Dispatch: palce ALUs after MDUs

上级 330aa36c
...@@ -99,11 +99,11 @@ class IntegerBlock ...@@ -99,11 +99,11 @@ class IntegerBlock
len = XLEN len = XLEN
)) ))
val aluExeUnits = Array.tabulate(exuParameters.AluCnt)(_ => Module(new AluExeUnit))
val jmpExeUnit = Module(new JumpExeUnit) val jmpExeUnit = Module(new JumpExeUnit)
val mduExeUnits = Array.tabulate(exuParameters.MduCnt)(_ => Module(new MulDivExeUnit)) val mduExeUnits = Array.tabulate(exuParameters.MduCnt)(_ => Module(new MulDivExeUnit))
val aluExeUnits = Array.tabulate(exuParameters.AluCnt)(_ => Module(new AluExeUnit))
val exeUnits = jmpExeUnit +: (aluExeUnits ++ mduExeUnits) val exeUnits = jmpExeUnit +: (mduExeUnits ++ aluExeUnits)
def needWakeup(cfg: ExuConfig): Boolean = def needWakeup(cfg: ExuConfig): Boolean =
(cfg.readIntRf && cfg.writeIntRf) || (cfg.readFpRf && cfg.writeFpRf) (cfg.readIntRf && cfg.writeIntRf) || (cfg.readFpRf && cfg.writeFpRf)
......
...@@ -17,37 +17,40 @@ class Dispatch2Int extends XSModule { ...@@ -17,37 +17,40 @@ class Dispatch2Int extends XSModule {
val readPortIndex = Vec(exuParameters.IntExuCnt, Output(UInt(log2Ceil(8 / 2).W))) val readPortIndex = Vec(exuParameters.IntExuCnt, Output(UInt(log2Ceil(8 / 2).W)))
}) })
val jmpCnt = exuParameters.JmpCnt
val mduCnt = exuParameters.MduCnt
val aluCnt = exuParameters.AluCnt
/** /**
* Part 1: generate indexes for reservation stations * Part 1: generate indexes for reservation stations
*/ */
assert(jmpCnt == 1)
val jmpCanAccept = VecInit(io.fromDq.map(deq => deq.valid && jumpExeUnitCfg.canAccept(deq.bits.ctrl.fuType))) val jmpCanAccept = VecInit(io.fromDq.map(deq => deq.valid && jumpExeUnitCfg.canAccept(deq.bits.ctrl.fuType)))
val aluCanAccept = VecInit(io.fromDq.map(deq => deq.valid && aluExeUnitCfg.canAccept(deq.bits.ctrl.fuType)))
val mduCanAccept = VecInit(io.fromDq.map(deq => deq.valid && mulDivExeUnitCfg.canAccept(deq.bits.ctrl.fuType))) val mduCanAccept = VecInit(io.fromDq.map(deq => deq.valid && mulDivExeUnitCfg.canAccept(deq.bits.ctrl.fuType)))
assert(exuParameters.JmpCnt == 1) val aluCanAccept = VecInit(io.fromDq.map(deq => deq.valid && aluExeUnitCfg.canAccept(deq.bits.ctrl.fuType)))
val jmpIndexGen = Module(new IndexMapping(dpParams.IntDqDeqWidth, exuParameters.JmpCnt, false))
val aluIndexGen = Module(new IndexMapping(dpParams.IntDqDeqWidth, exuParameters.AluCnt, true)) val jmpIndexGen = Module(new IndexMapping(dpParams.IntDqDeqWidth, jmpCnt, false))
val mduIndexGen = Module(new IndexMapping(dpParams.IntDqDeqWidth, exuParameters.MduCnt, true)) val mduIndexGen = Module(new IndexMapping(dpParams.IntDqDeqWidth, mduCnt, true))
val aluPriority = PriorityGen((0 until exuParameters.AluCnt).map(i => io.numExist(i+exuParameters.JmpCnt))) val aluIndexGen = Module(new IndexMapping(dpParams.IntDqDeqWidth, aluCnt, true))
val mduPriority = PriorityGen((0 until exuParameters.MduCnt).map(i => io.numExist(i+exuParameters.JmpCnt+exuParameters.AluCnt)))
val mduPriority = PriorityGen(io.numExist.slice(jmpCnt, jmpCnt + mduCnt))
val aluPriority = PriorityGen(io.numExist.drop(jmpCnt + mduCnt))
jmpIndexGen.io.validBits := jmpCanAccept jmpIndexGen.io.validBits := jmpCanAccept
aluIndexGen.io.validBits := aluCanAccept
mduIndexGen.io.validBits := mduCanAccept mduIndexGen.io.validBits := mduCanAccept
aluIndexGen.io.validBits := aluCanAccept
jmpIndexGen.io.priority := DontCare jmpIndexGen.io.priority := DontCare
aluIndexGen.io.priority := aluPriority
mduIndexGen.io.priority := mduPriority mduIndexGen.io.priority := mduPriority
aluIndexGen.io.priority := aluPriority
val allIndexGen = Seq(jmpIndexGen, aluIndexGen, mduIndexGen) val allIndexGen = Seq(jmpIndexGen, mduIndexGen, aluIndexGen)
val validVec = allIndexGen.map(_.io.mapping.map(_.valid)).reduceLeft(_ ++ _) val validVec = allIndexGen.flatMap(_.io.mapping.map(_.valid))
val indexVec = allIndexGen.map(_.io.mapping.map(_.bits)).reduceLeft(_ ++ _) val indexVec = allIndexGen.flatMap(_.io.mapping.map(_.bits))
for (i <- validVec.indices) {
// XSDebug(p"mapping $i: valid ${validVec(i)} index ${indexVec(i)}\n")
}
/** /**
* Part 2: assign regfile read ports * Part 2: assign regfile read ports
*/ */
val intStaticIndex = Seq(1, 2, 3, 4) val intStaticIndex = Seq(3, 4, 5, 6)
val intDynamicIndex = Seq(0, 5, 6) val intDynamicIndex = Seq(0, 1, 2)
val intStaticMappedValid = intStaticIndex.map(i => validVec(i)) val intStaticMappedValid = intStaticIndex.map(i => validVec(i))
val intDynamicMappedValid = intDynamicIndex.map(i => validVec(i)) val intDynamicMappedValid = intDynamicIndex.map(i => validVec(i))
val (intReadPortSrc, intDynamicExuSrc) = RegfileReadPortGen(intStaticMappedValid, intDynamicMappedValid) val (intReadPortSrc, intDynamicExuSrc) = RegfileReadPortGen(intStaticMappedValid, intDynamicMappedValid)
...@@ -66,18 +69,18 @@ class Dispatch2Int extends XSModule { ...@@ -66,18 +69,18 @@ class Dispatch2Int extends XSModule {
* Part 3: dispatch to reservation stations * Part 3: dispatch to reservation stations
*/ */
val jmpReady = io.enqIQCtrl(0).ready val jmpReady = io.enqIQCtrl(0).ready
val aluReady = Cat(io.enqIQCtrl.take(exuParameters.JmpCnt + exuParameters.AluCnt).drop(exuParameters.JmpCnt).map(_.ready)).andR val mduReady = Cat(io.enqIQCtrl.slice(jmpCnt, jmpCnt + mduCnt).map(_.ready)).andR
val mduReady = Cat(io.enqIQCtrl.drop(exuParameters.JmpCnt + exuParameters.AluCnt).map(_.ready)).andR val aluReady = Cat(io.enqIQCtrl.drop(jmpCnt + mduCnt).map(_.ready)).andR
for (i <- 0 until exuParameters.IntExuCnt) { for (i <- 0 until exuParameters.IntExuCnt) {
val enq = io.enqIQCtrl(i) val enq = io.enqIQCtrl(i)
if (i < exuParameters.JmpCnt) { if (i < jmpCnt) {
enq.valid := jmpIndexGen.io.mapping(i).valid// && jmpReady enq.valid := jmpIndexGen.io.mapping(i).valid// && jmpReady
} }
else if (i < exuParameters.JmpCnt + exuParameters.AluCnt) { else if (i < jmpCnt + mduCnt) {
enq.valid := aluIndexGen.io.mapping(i - exuParameters.JmpCnt).valid && aluReady enq.valid := mduIndexGen.io.mapping(i - jmpCnt).valid && mduReady
} }
else { else { // alu
enq.valid := mduIndexGen.io.mapping(i - (exuParameters.JmpCnt + exuParameters.AluCnt)).valid && mduReady enq.valid := aluIndexGen.io.mapping(i - (jmpCnt + mduCnt)).valid && aluReady
} }
enq.bits := io.fromDq(indexVec(i)).bits enq.bits := io.fromDq(indexVec(i)).bits
......
...@@ -85,7 +85,7 @@ object RegfileReadPortGen { ...@@ -85,7 +85,7 @@ object RegfileReadPortGen {
val choiceCount = dynamicMappedValid.length + 1 val choiceCount = dynamicMappedValid.length + 1
val readPortSrc = Wire(Vec(staticMappedValid.length, UInt(log2Ceil(choiceCount).W))) val readPortSrc = Wire(Vec(staticMappedValid.length, UInt(log2Ceil(choiceCount).W)))
var hasAssigned = (0 until choiceCount).map(_ => false.B) var hasAssigned = (0 until choiceCount).map(_ => false.B)
for (i <- 0 until staticMappedValid.length) { for (i <- staticMappedValid.indices) {
val valid = staticMappedValid(i) +: dynamicMappedValid val valid = staticMappedValid(i) +: dynamicMappedValid
val wantReadPort = (0 until choiceCount).map(j => valid(j) && ((j == 0).asBool() || !hasAssigned(j))) val wantReadPort = (0 until choiceCount).map(j => valid(j) && ((j == 0).asBool() || !hasAssigned(j)))
readPortSrc(i) := PriorityEncoder(wantReadPort) readPortSrc(i) := PriorityEncoder(wantReadPort)
...@@ -93,8 +93,8 @@ object RegfileReadPortGen { ...@@ -93,8 +93,8 @@ object RegfileReadPortGen {
hasAssigned = (0 until choiceCount).map(i => hasAssigned(i) || onehot(i)) hasAssigned = (0 until choiceCount).map(i => hasAssigned(i) || onehot(i))
} }
val dynamicExuSrc = Wire(Vec(dynamicMappedValid.length, UInt(log2Ceil(staticMappedValid.length).W))) val dynamicExuSrc = Wire(Vec(dynamicMappedValid.length, UInt(log2Ceil(staticMappedValid.length).W)))
for (i <- 0 until dynamicMappedValid.length) { for (i <- dynamicMappedValid.indices) {
val targetMatch = (0 until staticMappedValid.length).map(j => readPortSrc(j) === (i + 1).U) val targetMatch = staticMappedValid.indices.map(j => readPortSrc(j) === (i + 1).U)
dynamicExuSrc(i) := PriorityEncoder(targetMatch) dynamicExuSrc(i) := PriorityEncoder(targetMatch)
} }
(readPortSrc, dynamicExuSrc) (readPortSrc, dynamicExuSrc)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册