Fix FPU control bug for div/sqrt
I was examining a WB-stage control signal instead of a MEM-stage control signal. I refactored the code to group the signals together, so that this sort of bug is less likely going forward.
This commit is contained in:
parent
e69badb205
commit
76af15a6ff
@ -754,15 +754,10 @@ class FPU(cfg: FPUParams)(implicit p: Parameters) extends FPUModule()(p) {
|
|||||||
if (cfg.divSqrt) {
|
if (cfg.divSqrt) {
|
||||||
val divSqrt_killed = Reg(Bool())
|
val divSqrt_killed = Reg(Bool())
|
||||||
|
|
||||||
makeDivSqrt(FType.S, wb_ctrl.singleOut)
|
for (t <- floatTypes) {
|
||||||
fLen match {
|
val tag = !mem_ctrl.singleOut // TODO typeTag
|
||||||
case 32 =>
|
|
||||||
case 64 => makeDivSqrt(FType.D, !wb_ctrl.singleOut)
|
|
||||||
}
|
|
||||||
|
|
||||||
def makeDivSqrt(t: FType, en: Bool) = {
|
|
||||||
val divSqrt = Module(new hardfloat.DivSqrtRecFN_small(t.exp, t.sig, 0))
|
val divSqrt = Module(new hardfloat.DivSqrtRecFN_small(t.exp, t.sig, 0))
|
||||||
divSqrt.io.inValid := en && mem_reg_valid && (mem_ctrl.div || mem_ctrl.sqrt) && !divSqrt_inFlight
|
divSqrt.io.inValid := mem_reg_valid && tag === typeTag(t) && (mem_ctrl.div || mem_ctrl.sqrt) && !divSqrt_inFlight
|
||||||
divSqrt.io.sqrtOp := mem_ctrl.sqrt
|
divSqrt.io.sqrtOp := mem_ctrl.sqrt
|
||||||
divSqrt.io.a := maxType.unsafeConvert(fpiu.io.out.bits.in.in1, t)
|
divSqrt.io.a := maxType.unsafeConvert(fpiu.io.out.bits.in.in1, t)
|
||||||
divSqrt.io.b := maxType.unsafeConvert(fpiu.io.out.bits.in.in2, t)
|
divSqrt.io.b := maxType.unsafeConvert(fpiu.io.out.bits.in.in2, t)
|
||||||
|
Loading…
Reference in New Issue
Block a user