xref: /XiangShan/src/main/scala/xiangshan/backend/decode/FPDecoder.scala (revision 8cc1ac81c8bf7d61b32394a426fe449f0bef5cb1)
12ce29ed6SLinJiaweipackage xiangshan.backend.decode
22ce29ed6SLinJiawei
32ce29ed6SLinJiaweiimport chisel3._
42ce29ed6SLinJiaweiimport chisel3.util._
52ce29ed6SLinJiaweiimport freechips.rocketchip.rocket.DecodeLogic
6a1fd7de4SLinJiaweiimport xiangshan.backend.decode.Instructions._
72ce29ed6SLinJiaweiimport xiangshan.{FPUCtrlSignals, XSModule}
82ce29ed6SLinJiawei
92ce29ed6SLinJiaweiclass FPDecoder extends XSModule{
102ce29ed6SLinJiawei  val io = IO(new Bundle() {
112ce29ed6SLinJiawei    val instr = Input(UInt(32.W))
122ce29ed6SLinJiawei    val fpCtrl = Output(new FPUCtrlSignals)
132ce29ed6SLinJiawei  })
142ce29ed6SLinJiawei
152ce29ed6SLinJiawei  def X = BitPat("b?")
162ce29ed6SLinJiawei  def N = BitPat("b0")
172ce29ed6SLinJiawei  def Y = BitPat("b1")
182ce29ed6SLinJiawei  val s = BitPat(S)
192ce29ed6SLinJiawei  val d = BitPat(D)
20*8cc1ac81SLinJiawei  val i = BitPat(I)
212ce29ed6SLinJiawei
22fe73f692SLinJiawei  val default = List(X,X,X,N,N,N,X,X,X)
232ce29ed6SLinJiawei
242ce29ed6SLinJiawei  // isAddSub tagIn tagOut fromInt wflags fpWen div sqrt fcvt
252ce29ed6SLinJiawei  val single: Array[(BitPat, List[BitPat])] = Array(
262ce29ed6SLinJiawei    FMV_W_X  -> List(N,s,d,Y,N,Y,N,N,N),
272ce29ed6SLinJiawei    FCVT_S_W -> List(N,s,s,Y,Y,Y,N,N,Y),
282ce29ed6SLinJiawei    FCVT_S_WU-> List(N,s,s,Y,Y,Y,N,N,Y),
292ce29ed6SLinJiawei    FCVT_S_L -> List(N,s,s,Y,Y,Y,N,N,Y),
302ce29ed6SLinJiawei    FCVT_S_LU-> List(N,s,s,Y,Y,Y,N,N,Y),
31*8cc1ac81SLinJiawei    FMV_X_W  -> List(N,d,i,N,N,N,N,N,N),
32*8cc1ac81SLinJiawei    FCLASS_S -> List(N,s,i,N,N,N,N,N,N),
33*8cc1ac81SLinJiawei    FCVT_W_S -> List(N,s,i,N,Y,N,N,N,Y),
34*8cc1ac81SLinJiawei    FCVT_WU_S-> List(N,s,i,N,Y,N,N,N,Y),
35*8cc1ac81SLinJiawei    FCVT_L_S -> List(N,s,i,N,Y,N,N,N,Y),
36*8cc1ac81SLinJiawei    FCVT_LU_S-> List(N,s,i,N,Y,N,N,N,Y),
37*8cc1ac81SLinJiawei    FEQ_S    -> List(N,s,i,N,Y,N,N,N,N),
38*8cc1ac81SLinJiawei    FLT_S    -> List(N,s,i,N,Y,N,N,N,N),
39*8cc1ac81SLinJiawei    FLE_S    -> List(N,s,i,N,Y,N,N,N,N),
402ce29ed6SLinJiawei    FSGNJ_S  -> List(N,s,s,N,N,Y,N,N,N),
412ce29ed6SLinJiawei    FSGNJN_S -> List(N,s,s,N,N,Y,N,N,N),
422ce29ed6SLinJiawei    FSGNJX_S -> List(N,s,s,N,N,Y,N,N,N),
432ce29ed6SLinJiawei    FMIN_S   -> List(N,s,s,N,Y,Y,N,N,N),
442ce29ed6SLinJiawei    FMAX_S   -> List(N,s,s,N,Y,Y,N,N,N),
452ce29ed6SLinJiawei    FADD_S   -> List(Y,s,s,N,Y,Y,N,N,N),
462ce29ed6SLinJiawei    FSUB_S   -> List(Y,s,s,N,Y,Y,N,N,N),
472ce29ed6SLinJiawei    FMUL_S   -> List(N,s,s,N,Y,Y,N,N,N),
482ce29ed6SLinJiawei    FMADD_S  -> List(N,s,s,N,Y,Y,N,N,N),
492ce29ed6SLinJiawei    FMSUB_S  -> List(N,s,s,N,Y,Y,N,N,N),
502ce29ed6SLinJiawei    FNMADD_S -> List(N,s,s,N,Y,Y,N,N,N),
512ce29ed6SLinJiawei    FNMSUB_S -> List(N,s,s,N,Y,Y,N,N,N),
522ce29ed6SLinJiawei    FDIV_S   -> List(N,s,s,N,Y,Y,Y,N,N),
532ce29ed6SLinJiawei    FSQRT_S  -> List(N,s,s,N,Y,Y,N,Y,N)
542ce29ed6SLinJiawei  )
552ce29ed6SLinJiawei
56e50fb2d7SLinJiawei
57e50fb2d7SLinJiawei  // isAddSub tagIn tagOut fromInt wflags fpWen div sqrt fcvt
58e50fb2d7SLinJiawei  val double: Array[(BitPat, List[BitPat])] = Array(
59e50fb2d7SLinJiawei    FMV_D_X  -> List(N,d,d,Y,N,Y,N,N,N),
60e50fb2d7SLinJiawei    FCVT_D_W -> List(N,d,d,Y,Y,Y,N,N,Y),
61e50fb2d7SLinJiawei    FCVT_D_WU-> List(N,d,d,Y,Y,Y,N,N,Y),
62e50fb2d7SLinJiawei    FCVT_D_L -> List(N,d,d,Y,Y,Y,N,N,Y),
63e50fb2d7SLinJiawei    FCVT_D_LU-> List(N,d,d,Y,Y,Y,N,N,Y),
64*8cc1ac81SLinJiawei    FMV_X_D  -> List(N,d,i,N,N,N,N,N,N),
65*8cc1ac81SLinJiawei    FCLASS_D -> List(N,d,i,N,N,N,N,N,N),
66*8cc1ac81SLinJiawei    FCVT_W_D -> List(N,d,i,N,Y,N,N,N,Y),
67*8cc1ac81SLinJiawei    FCVT_WU_D-> List(N,d,i,N,Y,N,N,N,Y),
68*8cc1ac81SLinJiawei    FCVT_L_D -> List(N,d,i,N,Y,N,N,N,Y),
69*8cc1ac81SLinJiawei    FCVT_LU_D-> List(N,d,i,N,Y,N,N,N,Y),
70e50fb2d7SLinJiawei    FCVT_S_D -> List(N,d,s,N,Y,Y,N,N,Y),
71e50fb2d7SLinJiawei    FCVT_D_S -> List(N,s,d,N,Y,Y,N,N,Y),
72*8cc1ac81SLinJiawei    FEQ_D    -> List(N,d,i,N,Y,N,N,N,N),
73*8cc1ac81SLinJiawei    FLT_D    -> List(N,d,i,N,Y,N,N,N,N),
74*8cc1ac81SLinJiawei    FLE_D    -> List(N,d,i,N,Y,N,N,N,N),
75e50fb2d7SLinJiawei    FSGNJ_D  -> List(N,d,d,N,N,Y,N,N,N),
76e50fb2d7SLinJiawei    FSGNJN_D -> List(N,d,d,N,N,Y,N,N,N),
77e50fb2d7SLinJiawei    FSGNJX_D -> List(N,d,d,N,N,Y,N,N,N),
78e50fb2d7SLinJiawei    FMIN_D   -> List(N,d,d,N,Y,Y,N,N,N),
79e50fb2d7SLinJiawei    FMAX_D   -> List(N,d,d,N,Y,Y,N,N,N),
80e50fb2d7SLinJiawei    FADD_D   -> List(Y,d,d,N,Y,Y,N,N,N),
81e50fb2d7SLinJiawei    FSUB_D   -> List(Y,d,d,N,Y,Y,N,N,N),
82e50fb2d7SLinJiawei    FMUL_D   -> List(N,d,d,N,Y,Y,N,N,N),
83e50fb2d7SLinJiawei    FMADD_D  -> List(N,d,d,N,Y,Y,N,N,N),
84e50fb2d7SLinJiawei    FMSUB_D  -> List(N,d,d,N,Y,Y,N,N,N),
85e50fb2d7SLinJiawei    FNMADD_D -> List(N,d,d,N,Y,Y,N,N,N),
86e50fb2d7SLinJiawei    FNMSUB_D -> List(N,d,d,N,Y,Y,N,N,N),
87e50fb2d7SLinJiawei    FDIV_D   -> List(N,d,d,N,Y,Y,Y,N,N),
88e50fb2d7SLinJiawei    FSQRT_D  -> List(N,d,d,N,Y,Y,N,Y,N)
89e50fb2d7SLinJiawei  )
90e50fb2d7SLinJiawei
91e50fb2d7SLinJiawei  val table = single ++ double
922ce29ed6SLinJiawei
932ce29ed6SLinJiawei  val decoder = DecodeLogic(io.instr, default, table)
942ce29ed6SLinJiawei
952ce29ed6SLinJiawei  val ctrl = io.fpCtrl
962ce29ed6SLinJiawei  val sigs = Seq(
972ce29ed6SLinJiawei    ctrl.isAddSub, ctrl.typeTagIn, ctrl.typeTagOut,
982ce29ed6SLinJiawei    ctrl.fromInt, ctrl.wflags, ctrl.fpWen,
992ce29ed6SLinJiawei    ctrl.div, ctrl.sqrt, ctrl.fcvt
1002ce29ed6SLinJiawei  )
1012ce29ed6SLinJiawei  sigs.zip(decoder).foreach({case (s, d) => s := d})
1022ce29ed6SLinJiawei  ctrl.typ := io.instr(21, 20)
1032ce29ed6SLinJiawei  ctrl.fmt := io.instr(26, 25)
104e6c6b64fSLinJiawei  ctrl.rm := io.instr(14, 12)
1052ce29ed6SLinJiawei
1062ce29ed6SLinJiawei  val fmaTable: Array[(BitPat, List[BitPat])] = Array(
107e50fb2d7SLinJiawei    FADD_S  -> List(BitPat("b00"),N),
108e50fb2d7SLinJiawei    FADD_D  -> List(BitPat("b00"),N),
109e50fb2d7SLinJiawei    FSUB_S  -> List(BitPat("b01"),N),
110e50fb2d7SLinJiawei    FSUB_D  -> List(BitPat("b01"),N),
111e50fb2d7SLinJiawei    FMUL_S  -> List(BitPat("b00"),N),
112e50fb2d7SLinJiawei    FMUL_D  -> List(BitPat("b00"),N),
113e50fb2d7SLinJiawei    FMADD_S -> List(BitPat("b00"),Y),
114e50fb2d7SLinJiawei    FMADD_D -> List(BitPat("b00"),Y),
115e50fb2d7SLinJiawei    FMSUB_S -> List(BitPat("b01"),Y),
116e50fb2d7SLinJiawei    FMSUB_D -> List(BitPat("b01"),Y),
117e50fb2d7SLinJiawei    FNMADD_S-> List(BitPat("b11"),Y),
118e50fb2d7SLinJiawei    FNMADD_D-> List(BitPat("b11"),Y),
119e50fb2d7SLinJiawei    FNMSUB_S-> List(BitPat("b10"),Y),
120e50fb2d7SLinJiawei    FNMSUB_D-> List(BitPat("b10"),Y)
1212ce29ed6SLinJiawei  )
122e50fb2d7SLinJiawei  val fmaDefault = List(BitPat("b??"), N)
123e50fb2d7SLinJiawei  Seq(ctrl.fmaCmd, ctrl.ren3).zip(
1242ce29ed6SLinJiawei    DecodeLogic(io.instr, fmaDefault, fmaTable)
1252ce29ed6SLinJiawei  ).foreach({
1262ce29ed6SLinJiawei    case (s, d) => s := d
1272ce29ed6SLinJiawei  })
1282ce29ed6SLinJiawei}
129