xref: /XiangShan/src/main/scala/xiangshan/backend/fu/wrapper/FMA.scala (revision 39be24bce97876599cf209a1e8a822f27651258c)
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