xref: /XiangShan/src/main/scala/xiangshan/backend/decode/FPDecoder.scala (revision 2ce29ed68b5bea36bd81331f10ad40cb8d41df6b)
1*2ce29ed6SLinJiaweipackage xiangshan.backend.decode
2*2ce29ed6SLinJiawei
3*2ce29ed6SLinJiaweiimport chisel3._
4*2ce29ed6SLinJiaweiimport chisel3.util._
5*2ce29ed6SLinJiaweiimport freechips.rocketchip.rocket.DecodeLogic
6*2ce29ed6SLinJiaweiimport xiangshan.{FPUCtrlSignals, XSModule}
7*2ce29ed6SLinJiaweiimport xiangshan.backend.decode.isa.RVFInstr._
8*2ce29ed6SLinJiawei
9*2ce29ed6SLinJiaweiclass FPDecoder extends XSModule{
10*2ce29ed6SLinJiawei  val io = IO(new Bundle() {
11*2ce29ed6SLinJiawei    val instr = Input(UInt(32.W))
12*2ce29ed6SLinJiawei    val fpCtrl = Output(new FPUCtrlSignals)
13*2ce29ed6SLinJiawei  })
14*2ce29ed6SLinJiawei
15*2ce29ed6SLinJiawei  def X = BitPat("b?")
16*2ce29ed6SLinJiawei  def N = BitPat("b0")
17*2ce29ed6SLinJiawei  def Y = BitPat("b1")
18*2ce29ed6SLinJiawei  val s = BitPat(S)
19*2ce29ed6SLinJiawei  val d = BitPat(D)
20*2ce29ed6SLinJiawei
21*2ce29ed6SLinJiawei  val default = List(X,X,X,X,X,X,X,X,X)
22*2ce29ed6SLinJiawei
23*2ce29ed6SLinJiawei  // isAddSub tagIn tagOut fromInt wflags fpWen div sqrt fcvt
24*2ce29ed6SLinJiawei  val single: Array[(BitPat, List[BitPat])] = Array(
25*2ce29ed6SLinJiawei    FMV_W_X  -> List(N,s,d,Y,N,Y,N,N,N),
26*2ce29ed6SLinJiawei    FCVT_S_W -> List(N,s,s,Y,Y,Y,N,N,Y),
27*2ce29ed6SLinJiawei    FCVT_S_WU-> List(N,s,s,Y,Y,Y,N,N,Y),
28*2ce29ed6SLinJiawei    FCVT_S_L -> List(N,s,s,Y,Y,Y,N,N,Y),
29*2ce29ed6SLinJiawei    FCVT_S_LU-> List(N,s,s,Y,Y,Y,N,N,Y),
30*2ce29ed6SLinJiawei    FMV_X_W  -> List(N,s,X,N,N,N,N,N,N),
31*2ce29ed6SLinJiawei    FCLASS_S -> List(N,s,X,N,N,N,N,N,N),
32*2ce29ed6SLinJiawei    FCVT_W_S -> List(N,s,X,N,Y,N,N,N,Y),
33*2ce29ed6SLinJiawei    FCVT_WU_S-> List(N,s,X,N,Y,N,N,N,Y),
34*2ce29ed6SLinJiawei    FCVT_L_S -> List(N,s,X,N,Y,N,N,N,Y),
35*2ce29ed6SLinJiawei    FCVT_LU_S-> List(N,s,X,N,Y,N,N,N,Y),
36*2ce29ed6SLinJiawei    FEQ_S    -> List(N,s,X,N,Y,N,N,N,N),
37*2ce29ed6SLinJiawei    FLT_S    -> List(N,s,X,N,Y,N,N,N,N),
38*2ce29ed6SLinJiawei    FLE_S    -> List(N,s,X,N,Y,N,N,N,N),
39*2ce29ed6SLinJiawei    FSGNJ_S  -> List(N,s,s,N,N,Y,N,N,N),
40*2ce29ed6SLinJiawei    FSGNJN_S -> List(N,s,s,N,N,Y,N,N,N),
41*2ce29ed6SLinJiawei    FSGNJX_S -> List(N,s,s,N,N,Y,N,N,N),
42*2ce29ed6SLinJiawei    FMIN_S   -> List(N,s,s,N,Y,Y,N,N,N),
43*2ce29ed6SLinJiawei    FMAX_S   -> List(N,s,s,N,Y,Y,N,N,N),
44*2ce29ed6SLinJiawei    FADD_S   -> List(Y,s,s,N,Y,Y,N,N,N),
45*2ce29ed6SLinJiawei    FSUB_S   -> List(Y,s,s,N,Y,Y,N,N,N),
46*2ce29ed6SLinJiawei    FMUL_S   -> List(N,s,s,N,Y,Y,N,N,N),
47*2ce29ed6SLinJiawei    FMADD_S  -> List(N,s,s,N,Y,Y,N,N,N),
48*2ce29ed6SLinJiawei    FMSUB_S  -> List(N,s,s,N,Y,Y,N,N,N),
49*2ce29ed6SLinJiawei    FNMADD_S -> List(N,s,s,N,Y,Y,N,N,N),
50*2ce29ed6SLinJiawei    FNMSUB_S -> List(N,s,s,N,Y,Y,N,N,N),
51*2ce29ed6SLinJiawei    FDIV_S   -> List(N,s,s,N,Y,Y,Y,N,N),
52*2ce29ed6SLinJiawei    FSQRT_S  -> List(N,s,s,N,Y,Y,N,Y,N)
53*2ce29ed6SLinJiawei  )
54*2ce29ed6SLinJiawei
55*2ce29ed6SLinJiawei  val table = single
56*2ce29ed6SLinJiawei
57*2ce29ed6SLinJiawei  val decoder = DecodeLogic(io.instr, default, table)
58*2ce29ed6SLinJiawei
59*2ce29ed6SLinJiawei  val ctrl = io.fpCtrl
60*2ce29ed6SLinJiawei  val sigs = Seq(
61*2ce29ed6SLinJiawei    ctrl.isAddSub, ctrl.typeTagIn, ctrl.typeTagOut,
62*2ce29ed6SLinJiawei    ctrl.fromInt, ctrl.wflags, ctrl.fpWen,
63*2ce29ed6SLinJiawei    ctrl.div, ctrl.sqrt, ctrl.fcvt
64*2ce29ed6SLinJiawei  )
65*2ce29ed6SLinJiawei  sigs.zip(decoder).foreach({case (s, d) => s := d})
66*2ce29ed6SLinJiawei  ctrl.typ := io.instr(21,20)
67*2ce29ed6SLinJiawei  ctrl.fmt := io.instr(26,25)
68*2ce29ed6SLinJiawei
69*2ce29ed6SLinJiawei  val fmaTable: Array[(BitPat, List[BitPat])] = Array(
70*2ce29ed6SLinJiawei    FADD_S  -> List(BitPat("b00"),N,Y),
71*2ce29ed6SLinJiawei    FSUB_S  -> List(BitPat("b01"),N,Y),
72*2ce29ed6SLinJiawei    FMUL_S  -> List(BitPat("b00"),N,Y),
73*2ce29ed6SLinJiawei    FMADD_S -> List(BitPat("b00"),Y,Y),
74*2ce29ed6SLinJiawei    FMSUB_S -> List(BitPat("b01"),Y,Y),
75*2ce29ed6SLinJiawei    FNMADD_S-> List(BitPat("b11"),Y,Y),
76*2ce29ed6SLinJiawei    FNMSUB_S-> List(BitPat("b10"),Y,Y)
77*2ce29ed6SLinJiawei  )
78*2ce29ed6SLinJiawei  val fmaDefault = List(BitPat("b??"), N, N)
79*2ce29ed6SLinJiawei  Seq(ctrl.fmaCmd, ctrl.ren3, ctrl.fma).zip(
80*2ce29ed6SLinJiawei    DecodeLogic(io.instr, fmaDefault, fmaTable)
81*2ce29ed6SLinJiawei  ).foreach({
82*2ce29ed6SLinJiawei    case (s, d) => s := d
83*2ce29ed6SLinJiawei  })
84*2ce29ed6SLinJiawei}
85