1517544cdSsinsanctionpackage xiangshan.backend.fu.wrapper 2517544cdSsinsanction 3517544cdSsinsanctionimport org.chipsalliance.cde.config.Parameters 4517544cdSsinsanctionimport chisel3._ 5517544cdSsinsanctionimport chisel3.util._ 6bb2f3f51STang Haojinimport utility.XSError 7517544cdSsinsanctionimport xiangshan.backend.fu.FuConfig 8517544cdSsinsanctionimport xiangshan.backend.fu.vector.Bundles.VSew 9517544cdSsinsanctionimport xiangshan.backend.fu.fpu.FpPipedFuncUnit 1046414505Sxiaofeibaoimport yunsuan.{VfmaType, VfpuType} 1190ae5a7fSlewislzhimport yunsuan.fpu.FloatFMA 12517544cdSsinsanction 13517544cdSsinsanctionclass FMA(cfg: FuConfig)(implicit p: Parameters) extends FpPipedFuncUnit(cfg) { 14517544cdSsinsanction XSError(io.in.valid && io.in.bits.ctrl.fuOpType === VfpuType.dummy, "fma OpType not supported") 15517544cdSsinsanction 16517544cdSsinsanction // io alias 17517544cdSsinsanction private val opcode = fuOpType(3, 0) 18517544cdSsinsanction private val src0 = inData.src(0) 19517544cdSsinsanction private val src1 = inData.src(1) 20517544cdSsinsanction private val src2 = inData.src(2) 21517544cdSsinsanction 22517544cdSsinsanction // modules 237b7f869dSxiaofeibao private val fma = Module(new FloatFMA) 24517544cdSsinsanction 25*39be24bcSxiaofeibao val fp_aIsFpCanonicalNAN = fp_fmt === VSew.e32 && !src0.head(32).andR || 26517544cdSsinsanction fp_fmt === VSew.e16 && !src0.head(48).andR 27*39be24bcSxiaofeibao val fp_bIsFpCanonicalNAN = fp_fmt === VSew.e32 && !src1.head(32).andR || 28*39be24bcSxiaofeibao fp_fmt === VSew.e16 && !src1.head(48).andR 2946414505Sxiaofeibao val fp_cIsFpCanonicalNAN = !(opcode === VfmaType.vfmul) && (fp_fmt === VSew.e32 && !src2.head(32).andR || 3046414505Sxiaofeibao fp_fmt === VSew.e16 && !src2.head(48).andR) 31517544cdSsinsanction 32517544cdSsinsanction fma.io.fire := io.in.valid 33*39be24bcSxiaofeibao fma.io.fp_a := src0 34*39be24bcSxiaofeibao fma.io.fp_b := src1 35517544cdSsinsanction fma.io.fp_c := src2 36517544cdSsinsanction fma.io.round_mode := rm 37517544cdSsinsanction fma.io.fp_format := fp_fmt 38517544cdSsinsanction fma.io.op_code := opcode 39517544cdSsinsanction fma.io.fp_aIsFpCanonicalNAN := fp_aIsFpCanonicalNAN 40517544cdSsinsanction fma.io.fp_bIsFpCanonicalNAN := fp_bIsFpCanonicalNAN 41517544cdSsinsanction fma.io.fp_cIsFpCanonicalNAN := fp_cIsFpCanonicalNAN 42517544cdSsinsanction 43517544cdSsinsanction private val resultData = fma.io.fp_result 44517544cdSsinsanction private val fflagsData = fma.io.fflags 45517544cdSsinsanction 46517544cdSsinsanction io.out.bits.res.fflags.get := fflagsData 47517544cdSsinsanction io.out.bits.res.data := resultData 48517544cdSsinsanction} 49