xref: /XiangShan/src/main/scala/xiangshan/backend/decode/FPDecoder.scala (revision 361e6d51461bbf6ef3b0db256413b55e43c0fc38)
1c6d43980SLemover/***************************************************************************************
2c6d43980SLemover* Copyright (c) 2020-2021 Institute of Computing Technology, Chinese Academy of Sciences
3f320e0f0SYinan Xu* Copyright (c) 2020-2021 Peng Cheng Laboratory
4c6d43980SLemover*
5c6d43980SLemover* XiangShan is licensed under Mulan PSL v2.
6c6d43980SLemover* You can use this software according to the terms and conditions of the Mulan PSL v2.
7c6d43980SLemover* You may obtain a copy of Mulan PSL v2 at:
8c6d43980SLemover*          http://license.coscl.org.cn/MulanPSL2
9c6d43980SLemover*
10c6d43980SLemover* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
11c6d43980SLemover* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
12c6d43980SLemover* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
13c6d43980SLemover*
14c6d43980SLemover* See the Mulan PSL v2 for more details.
15c6d43980SLemover***************************************************************************************/
16c6d43980SLemover
172ce29ed6SLinJiaweipackage xiangshan.backend.decode
182ce29ed6SLinJiawei
192225d46eSJiawei Linimport chipsalliance.rocketchip.config.Parameters
202ce29ed6SLinJiaweiimport chisel3._
212ce29ed6SLinJiaweiimport chisel3.util._
222ce29ed6SLinJiaweiimport freechips.rocketchip.rocket.DecodeLogic
23*361e6d51SJiuyang Liuimport freechips.rocketchip.rocket.Instructions._
24dc597826SJiawei Linimport xiangshan.backend.fu.fpu.FPU
252ce29ed6SLinJiaweiimport xiangshan.{FPUCtrlSignals, XSModule}
262ce29ed6SLinJiawei
272225d46eSJiawei Linclass FPDecoder(implicit p: Parameters) extends XSModule{
282ce29ed6SLinJiawei  val io = IO(new Bundle() {
292ce29ed6SLinJiawei    val instr = Input(UInt(32.W))
302ce29ed6SLinJiawei    val fpCtrl = Output(new FPUCtrlSignals)
312ce29ed6SLinJiawei  })
322ce29ed6SLinJiawei
332ce29ed6SLinJiawei  def X = BitPat("b?")
342ce29ed6SLinJiawei  def N = BitPat("b0")
352ce29ed6SLinJiawei  def Y = BitPat("b1")
36dc597826SJiawei Lin  val s = BitPat(FPU.S)
37dc597826SJiawei Lin  val d = BitPat(FPU.D)
38dc597826SJiawei Lin  val i = BitPat(FPU.D)
392ce29ed6SLinJiawei
40fe73f692SLinJiawei  val default = List(X,X,X,N,N,N,X,X,X)
412ce29ed6SLinJiawei
422ce29ed6SLinJiawei  // isAddSub tagIn tagOut fromInt wflags fpWen div sqrt fcvt
432ce29ed6SLinJiawei  val single: Array[(BitPat, List[BitPat])] = Array(
44dc597826SJiawei Lin    // IntToFP
45dc597826SJiawei Lin    FMV_W_X  -> List(N,i,s,Y,N,Y,N,N,N),
46dc597826SJiawei Lin    FCVT_S_W -> List(N,i,s,Y,Y,Y,N,N,Y),
47dc597826SJiawei Lin    FCVT_S_WU-> List(N,i,s,Y,Y,Y,N,N,Y),
48dc597826SJiawei Lin    FCVT_S_L -> List(N,i,s,Y,Y,Y,N,N,Y),
49dc597826SJiawei Lin    FCVT_S_LU-> List(N,i,s,Y,Y,Y,N,N,Y),
50dc597826SJiawei Lin    // FPToInt
51dc597826SJiawei Lin    FMV_X_W  -> List(N,d,i,N,N,N,N,N,N), // dont box result of fmv.fp.int
528cc1ac81SLinJiawei    FCLASS_S -> List(N,s,i,N,N,N,N,N,N),
538cc1ac81SLinJiawei    FCVT_W_S -> List(N,s,i,N,Y,N,N,N,Y),
548cc1ac81SLinJiawei    FCVT_WU_S-> List(N,s,i,N,Y,N,N,N,Y),
558cc1ac81SLinJiawei    FCVT_L_S -> List(N,s,i,N,Y,N,N,N,Y),
568cc1ac81SLinJiawei    FCVT_LU_S-> List(N,s,i,N,Y,N,N,N,Y),
578cc1ac81SLinJiawei    FEQ_S    -> List(N,s,i,N,Y,N,N,N,N),
588cc1ac81SLinJiawei    FLT_S    -> List(N,s,i,N,Y,N,N,N,N),
598cc1ac81SLinJiawei    FLE_S    -> List(N,s,i,N,Y,N,N,N,N),
60dc597826SJiawei Lin    // FPToFP
612ce29ed6SLinJiawei    FSGNJ_S  -> List(N,s,s,N,N,Y,N,N,N),
622ce29ed6SLinJiawei    FSGNJN_S -> List(N,s,s,N,N,Y,N,N,N),
632ce29ed6SLinJiawei    FSGNJX_S -> List(N,s,s,N,N,Y,N,N,N),
642ce29ed6SLinJiawei    FMIN_S   -> List(N,s,s,N,Y,Y,N,N,N),
652ce29ed6SLinJiawei    FMAX_S   -> List(N,s,s,N,Y,Y,N,N,N),
662ce29ed6SLinJiawei    FADD_S   -> List(Y,s,s,N,Y,Y,N,N,N),
672ce29ed6SLinJiawei    FSUB_S   -> List(Y,s,s,N,Y,Y,N,N,N),
682ce29ed6SLinJiawei    FMUL_S   -> List(N,s,s,N,Y,Y,N,N,N),
692ce29ed6SLinJiawei    FMADD_S  -> List(N,s,s,N,Y,Y,N,N,N),
702ce29ed6SLinJiawei    FMSUB_S  -> List(N,s,s,N,Y,Y,N,N,N),
712ce29ed6SLinJiawei    FNMADD_S -> List(N,s,s,N,Y,Y,N,N,N),
722ce29ed6SLinJiawei    FNMSUB_S -> List(N,s,s,N,Y,Y,N,N,N),
732ce29ed6SLinJiawei    FDIV_S   -> List(N,s,s,N,Y,Y,Y,N,N),
742ce29ed6SLinJiawei    FSQRT_S  -> List(N,s,s,N,Y,Y,N,Y,N)
752ce29ed6SLinJiawei  )
762ce29ed6SLinJiawei
77e50fb2d7SLinJiawei
78e50fb2d7SLinJiawei  // isAddSub tagIn tagOut fromInt wflags fpWen div sqrt fcvt
79e50fb2d7SLinJiawei  val double: Array[(BitPat, List[BitPat])] = Array(
80dc597826SJiawei Lin    FMV_D_X  -> List(N,i,d,Y,N,Y,N,N,N),
81dc597826SJiawei Lin    FCVT_D_W -> List(N,i,d,Y,Y,Y,N,N,Y),
82dc597826SJiawei Lin    FCVT_D_WU-> List(N,i,d,Y,Y,Y,N,N,Y),
83dc597826SJiawei Lin    FCVT_D_L -> List(N,i,d,Y,Y,Y,N,N,Y),
84dc597826SJiawei Lin    FCVT_D_LU-> List(N,i,d,Y,Y,Y,N,N,Y),
858cc1ac81SLinJiawei    FMV_X_D  -> List(N,d,i,N,N,N,N,N,N),
868cc1ac81SLinJiawei    FCLASS_D -> List(N,d,i,N,N,N,N,N,N),
878cc1ac81SLinJiawei    FCVT_W_D -> List(N,d,i,N,Y,N,N,N,Y),
888cc1ac81SLinJiawei    FCVT_WU_D-> List(N,d,i,N,Y,N,N,N,Y),
898cc1ac81SLinJiawei    FCVT_L_D -> List(N,d,i,N,Y,N,N,N,Y),
908cc1ac81SLinJiawei    FCVT_LU_D-> List(N,d,i,N,Y,N,N,N,Y),
91e50fb2d7SLinJiawei    FCVT_S_D -> List(N,d,s,N,Y,Y,N,N,Y),
92e50fb2d7SLinJiawei    FCVT_D_S -> List(N,s,d,N,Y,Y,N,N,Y),
938cc1ac81SLinJiawei    FEQ_D    -> List(N,d,i,N,Y,N,N,N,N),
948cc1ac81SLinJiawei    FLT_D    -> List(N,d,i,N,Y,N,N,N,N),
958cc1ac81SLinJiawei    FLE_D    -> List(N,d,i,N,Y,N,N,N,N),
96e50fb2d7SLinJiawei    FSGNJ_D  -> List(N,d,d,N,N,Y,N,N,N),
97e50fb2d7SLinJiawei    FSGNJN_D -> List(N,d,d,N,N,Y,N,N,N),
98e50fb2d7SLinJiawei    FSGNJX_D -> List(N,d,d,N,N,Y,N,N,N),
99e50fb2d7SLinJiawei    FMIN_D   -> List(N,d,d,N,Y,Y,N,N,N),
100e50fb2d7SLinJiawei    FMAX_D   -> List(N,d,d,N,Y,Y,N,N,N),
101e50fb2d7SLinJiawei    FADD_D   -> List(Y,d,d,N,Y,Y,N,N,N),
102e50fb2d7SLinJiawei    FSUB_D   -> List(Y,d,d,N,Y,Y,N,N,N),
103e50fb2d7SLinJiawei    FMUL_D   -> List(N,d,d,N,Y,Y,N,N,N),
104e50fb2d7SLinJiawei    FMADD_D  -> List(N,d,d,N,Y,Y,N,N,N),
105e50fb2d7SLinJiawei    FMSUB_D  -> List(N,d,d,N,Y,Y,N,N,N),
106e50fb2d7SLinJiawei    FNMADD_D -> List(N,d,d,N,Y,Y,N,N,N),
107e50fb2d7SLinJiawei    FNMSUB_D -> List(N,d,d,N,Y,Y,N,N,N),
108e50fb2d7SLinJiawei    FDIV_D   -> List(N,d,d,N,Y,Y,Y,N,N),
109e50fb2d7SLinJiawei    FSQRT_D  -> List(N,d,d,N,Y,Y,N,Y,N)
110e50fb2d7SLinJiawei  )
111e50fb2d7SLinJiawei
112e50fb2d7SLinJiawei  val table = single ++ double
1132ce29ed6SLinJiawei
1142ce29ed6SLinJiawei  val decoder = DecodeLogic(io.instr, default, table)
1152ce29ed6SLinJiawei
1162ce29ed6SLinJiawei  val ctrl = io.fpCtrl
1172ce29ed6SLinJiawei  val sigs = Seq(
1182ce29ed6SLinJiawei    ctrl.isAddSub, ctrl.typeTagIn, ctrl.typeTagOut,
1192ce29ed6SLinJiawei    ctrl.fromInt, ctrl.wflags, ctrl.fpWen,
1202ce29ed6SLinJiawei    ctrl.div, ctrl.sqrt, ctrl.fcvt
1212ce29ed6SLinJiawei  )
1222ce29ed6SLinJiawei  sigs.zip(decoder).foreach({case (s, d) => s := d})
1232ce29ed6SLinJiawei  ctrl.typ := io.instr(21, 20)
1242ce29ed6SLinJiawei  ctrl.fmt := io.instr(26, 25)
125e6c6b64fSLinJiawei  ctrl.rm := io.instr(14, 12)
1262ce29ed6SLinJiawei
1272ce29ed6SLinJiawei  val fmaTable: Array[(BitPat, List[BitPat])] = Array(
128e50fb2d7SLinJiawei    FADD_S  -> List(BitPat("b00"),N),
129e50fb2d7SLinJiawei    FADD_D  -> List(BitPat("b00"),N),
130e50fb2d7SLinJiawei    FSUB_S  -> List(BitPat("b01"),N),
131e50fb2d7SLinJiawei    FSUB_D  -> List(BitPat("b01"),N),
132e50fb2d7SLinJiawei    FMUL_S  -> List(BitPat("b00"),N),
133e50fb2d7SLinJiawei    FMUL_D  -> List(BitPat("b00"),N),
134e50fb2d7SLinJiawei    FMADD_S -> List(BitPat("b00"),Y),
135e50fb2d7SLinJiawei    FMADD_D -> List(BitPat("b00"),Y),
136e50fb2d7SLinJiawei    FMSUB_S -> List(BitPat("b01"),Y),
137e50fb2d7SLinJiawei    FMSUB_D -> List(BitPat("b01"),Y),
138e50fb2d7SLinJiawei    FNMADD_S-> List(BitPat("b11"),Y),
139e50fb2d7SLinJiawei    FNMADD_D-> List(BitPat("b11"),Y),
140e50fb2d7SLinJiawei    FNMSUB_S-> List(BitPat("b10"),Y),
141e50fb2d7SLinJiawei    FNMSUB_D-> List(BitPat("b10"),Y)
1422ce29ed6SLinJiawei  )
143e50fb2d7SLinJiawei  val fmaDefault = List(BitPat("b??"), N)
144e50fb2d7SLinJiawei  Seq(ctrl.fmaCmd, ctrl.ren3).zip(
1452ce29ed6SLinJiawei    DecodeLogic(io.instr, fmaDefault, fmaTable)
1462ce29ed6SLinJiawei  ).foreach({
1472ce29ed6SLinJiawei    case (s, d) => s := d
1482ce29ed6SLinJiawei  })
1492ce29ed6SLinJiawei}
150