提交 2d366136 编写于 作者: L LinJiawei

Decode: split 'noSpecExec' and 'blockBackward'

noSpecExec can only enq roq when roq is empty
blockBackward should block roq when the instruction is not commited
上级 eeb99218
......@@ -143,8 +143,8 @@ class CtrlSignals extends XSBundle {
val rfWen = Bool()
val fpWen = Bool()
val isXSTrap = Bool()
val noSpecExec = Bool() // This inst can not be speculated
val isBlocked = Bool() // This inst requires pipeline to be blocked
val noSpecExec = Bool() // wait forward
val blockBackward = Bool() // block backward
val flushPipe = Bool() // This inst will flush all the pipe when commit, like exception but can commit
val isRVF = Bool()
val imm = UInt(XLEN.W)
......
......@@ -182,7 +182,21 @@ class Decoder extends XSModule with HasInstrType {
when(io.out.ctrl.isXSTrap){
io.out.ctrl.lsrc1 := 10.U // a0
}
io.out.ctrl.noSpecExec := io.out.ctrl.isXSTrap || io.out.ctrl.fuType===FuType.csr || io.out.ctrl.fuType===FuType.mou || io.out.ctrl.fuType===FuType.fence/*noSpecExec make it sent to alu0,for roq is empty*/
/*noSpecExec make it sent to alu0,for roq is empty*/
io.out.ctrl.noSpecExec := io.out.ctrl.isXSTrap ||
io.out.ctrl.fuType===FuType.csr ||
io.out.ctrl.fuType===FuType.mou ||
io.out.ctrl.fuType===FuType.fence
// fflags zero csrrs rd csr
val isFrflags = BitPat("b000000000001_00000_010_?????_1110011") === io.in.instr
io.out.ctrl.blockBackward := io.out.ctrl.isXSTrap ||
(io.out.ctrl.fuType===FuType.csr && !isFrflags) ||
io.out.ctrl.fuType===FuType.mou ||
io.out.ctrl.fuType===FuType.fence
io.out.ctrl.flushPipe := io.out.ctrl.fuType===FuType.fence
io.out.ctrl.isRVF := instr(26, 25) === 0.U
......@@ -193,5 +207,5 @@ class Decoder extends XSModule with HasInstrType {
XSDebug("out: src1Type=%b src2Type=%b src3Type=%b lsrc1=%d lsrc2=%d lsrc3=%d ldest=%d fuType=%b fuOpType=%b\n",
io.out.ctrl.src1Type, io.out.ctrl.src2Type, io.out.ctrl.src3Type, io.out.ctrl.lsrc1, io.out.ctrl.lsrc2, io.out.ctrl.lsrc3, io.out.ctrl.ldest, io.out.ctrl.fuType, io.out.ctrl.fuOpType)
XSDebug("out: rfWen=%d fpWen=%d isXSTrap=%d noSpecExec=%d isBlocked=%d flushPipe=%d isRVF=%d imm=%x\n",
io.out.ctrl.rfWen, io.out.ctrl.fpWen, io.out.ctrl.isXSTrap, io.out.ctrl.noSpecExec, io.out.ctrl.isBlocked, io.out.ctrl.flushPipe, io.out.ctrl.isRVF, io.out.ctrl.imm)
io.out.ctrl.rfWen, io.out.ctrl.fpWen, io.out.ctrl.isXSTrap, io.out.ctrl.noSpecExec, io.out.ctrl.blockBackward, io.out.ctrl.flushPipe, io.out.ctrl.isRVF, io.out.ctrl.imm)
}
......@@ -81,7 +81,7 @@ class Roq(numWbPorts: Int) extends XSModule with HasCircularQueuePtrHelper {
io.roqDeqPtr := deqPtrExt
// Dispatch
val noSpecEnq = io.dp1Req.map(i => i.bits.ctrl.noSpecExec)
val noSpecEnq = io.dp1Req.map(i => i.bits.ctrl.blockBackward)
val hasNoSpec = RegInit(false.B)
when(isEmpty){ hasNoSpec:= false.B }
val validDispatch = io.dp1Req.map(_.valid)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册