FmiscExeUnit.scala 2.3 KB
Newer Older
1 2 3
package xiangshan.backend.exu

import chisel3._
L
LinJiawei 已提交
4
import chisel3.util._
L
linjiawei 已提交
5
import utils._
L
LinJiawei 已提交
6 7
import xiangshan.backend.fu.FunctionUnit
import xiangshan.backend.fu.FunctionUnit.fmiscSel
L
LinJiawei 已提交
8
import xiangshan.backend.fu.fpu.FPUOpType._
L
linjiawei 已提交
9
import xiangshan.backend.fu.fpu._
10

L
LinJiawei 已提交
11 12 13 14 15 16 17 18 19 20 21 22 23 24
class FmiscExeUnit extends Exu(
  exuName = "FmiscExeUnit",
  fuGen = {
    Seq[(() => FPUSubModule, FPUSubModule => Bool)](
      (FunctionUnit.fcmp _, fmiscSel(FU_FCMP)),
      (FunctionUnit.fmv _, fmiscSel(FU_FMV)),
      (FunctionUnit.f2i _, fmiscSel(FU_F2I)),
      (FunctionUnit.f32toF64 _, fmiscSel(FU_S2D)),
      (FunctionUnit.f64toF32 _, fmiscSel(FU_D2S)),
      (FunctionUnit.fdivSqrt _, fmiscSel(FU_DIVSQRT))
    )
  },
  wbIntPriority = Int.MaxValue,
  wbFpPriority = 1
25
) {
L
LinJiawei 已提交
26

L
LinJiawei 已提交
27 28
  val frm = IO(Input(UInt(3.W)))

L
LinJiawei 已提交
29
  val fcmp :: fmv :: f2i :: f32toF64 :: f64toF32 :: fdivSqrt :: Nil = supportedFunctionUnits
30 31
  val toFpUnits = Seq(fcmp, f32toF64, f64toF32, fdivSqrt)
  val toIntUnits = Seq(fmv, f2i)
L
LinJiawei 已提交
32

33 34
  val input = io.fromFp
  val fuOp = input.bits.uop.ctrl.fuOpType
L
linjiawei 已提交
35 36 37
  assert(fuOp.getWidth == 7) // when fuOp's WIDTH change, here must change too
  val fu = fuOp.head(4)
  val op = fuOp.tail(4)
38 39 40
  val isRVF = input.bits.uop.ctrl.isRVF
  val instr_rm = input.bits.uop.cf.instr(14, 12)
  val (src1, src2) = (input.bits.src1, input.bits.src2)
L
LinJiawei 已提交
41

42
  supportedFunctionUnits.foreach { module =>
L
LinJiawei 已提交
43
    module.io.in.bits.src(0) := Mux(
44
      (isRVF && fuOp =/= d2s && fuOp =/= fmv_f2i) || fuOp === s2d,
L
LinJiawei 已提交
45 46 47
      unboxF64ToF32(src1),
      src1
    )
48
    if (module.cfg.srcCnt > 1) {
L
linjiawei 已提交
49
      module.io.in.bits.src(1) := Mux(isRVF, unboxF64ToF32(src2), src2)
L
LinJiawei 已提交
50 51
    }
    module.rm := Mux(instr_rm =/= 7.U, instr_rm, frm)
L
LinJiawei 已提交
52 53
  }

54
  io.toFp.bits.fflags := Mux1H(fpArb.io.in.zip(toFpUnits).map(
L
LinJiawei 已提交
55 56
    x => x._1.fire() -> x._2.fflags
  ))
57 58 59 60
  val fpOutCtrl = io.toFp.bits.uop.ctrl
  io.toFp.bits.data := Mux(fpOutCtrl.isRVF,
    boxF32ToF64(fpArb.io.out.bits.data),
    fpArb.io.out.bits.data
L
linjiawei 已提交
61
  )
62 63 64 65 66 67 68 69 70 71 72
  val intOutCtrl = io.toInt.bits.uop.ctrl
  io.toInt.bits.data := Mux(
    (intOutCtrl.isRVF && intOutCtrl.fuOpType === fmv_i2f) ||
      intOutCtrl.fuOpType === f2w ||
      intOutCtrl.fuOpType === f2wu,
    SignExt(intArb.io.out.bits.data(31, 0), XLEN),
    intArb.io.out.bits.data
  )
  io.toInt.bits.fflags := Mux1H(intArb.io.in.zip(toIntUnits).map(
    x => x._1.fire() -> x._2.fflags
  ))
73
}