提交 e1800f18 编写于 作者: Z Zihao Yu

noop: move pipelineConnect under utils

上级 13356f3f
......@@ -45,26 +45,15 @@ class NOOP(hasPerfCnt: Boolean = false) extends Module with NOOPConfig with HasC
icache.io.out
} else { ifu.io.imem.toAXI4() })
def pipelineConnect[T <: Data](left: DecoupledIO[T], right: DecoupledIO[T], rightOutFire: Bool, isFlush: Bool) = {
val valid = RegInit(false.B)
when (rightOutFire) { valid := false.B }
when (left.valid && right.ready) { valid := true.B }
when (isFlush) { valid := false.B }
left.ready := right.ready
right.bits <> RegEnable(left.bits, left.valid && right.ready)
right.valid := valid && !isFlush
}
def pipelineConnect2[T <: Data](left: DecoupledIO[T], right: DecoupledIO[T],
isFlush: Bool, entries: Int = 2, pipe: Boolean = false) = {
right <> FlushableQueue(left, isFlush, entries = entries, pipe = pipe)
}
pipelineConnect2(ifu.io.out, idu.io.in, ifu.io.flushVec(0))
pipelineConnect(idu.io.out, isu.io.in, isu.io.out.fire(), ifu.io.flushVec(1))
pipelineConnect(isu.io.out, exu.io.in, exu.io.out.fire(), ifu.io.flushVec(2))
pipelineConnect(exu.io.out, wbu.io.in, true.B, ifu.io.flushVec(3))
PipelineConnect(idu.io.out, isu.io.in, isu.io.out.fire(), ifu.io.flushVec(1))
PipelineConnect(isu.io.out, exu.io.in, exu.io.out.fire(), ifu.io.flushVec(2))
PipelineConnect(exu.io.out, wbu.io.in, true.B, ifu.io.flushVec(3))
isu.io.flush := ifu.io.flushVec(2)
exu.io.flush := ifu.io.flushVec(3)
......
package utils
import chisel3._
import chisel3.util._
object PipelineConnect {
def apply[T <: Data](left: DecoupledIO[T], right: DecoupledIO[T], rightOutFire: Bool, isFlush: Bool) = {
val valid = RegInit(false.B)
when (rightOutFire) { valid := false.B }
when (left.valid && right.ready) { valid := true.B }
when (isFlush) { valid := false.B }
left.ready := right.ready
right.bits <> RegEnable(left.bits, left.valid && right.ready)
right.valid := valid //&& !isFlush
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册