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