12ce29ed6SLinJiaweipackage xiangshan.backend.decode 22ce29ed6SLinJiawei 32ce29ed6SLinJiaweiimport chisel3._ 42ce29ed6SLinJiaweiimport chisel3.util._ 52ce29ed6SLinJiaweiimport freechips.rocketchip.rocket.DecodeLogic 6*a1fd7de4SLinJiaweiimport 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) 202ce29ed6SLinJiawei 212ce29ed6SLinJiawei val default = List(X,X,X,X,X,X,X,X,X) 222ce29ed6SLinJiawei 232ce29ed6SLinJiawei // isAddSub tagIn tagOut fromInt wflags fpWen div sqrt fcvt 242ce29ed6SLinJiawei val single: Array[(BitPat, List[BitPat])] = Array( 252ce29ed6SLinJiawei FMV_W_X -> List(N,s,d,Y,N,Y,N,N,N), 262ce29ed6SLinJiawei FCVT_S_W -> List(N,s,s,Y,Y,Y,N,N,Y), 272ce29ed6SLinJiawei FCVT_S_WU-> List(N,s,s,Y,Y,Y,N,N,Y), 282ce29ed6SLinJiawei FCVT_S_L -> List(N,s,s,Y,Y,Y,N,N,Y), 292ce29ed6SLinJiawei FCVT_S_LU-> List(N,s,s,Y,Y,Y,N,N,Y), 302ce29ed6SLinJiawei FMV_X_W -> List(N,s,X,N,N,N,N,N,N), 312ce29ed6SLinJiawei FCLASS_S -> List(N,s,X,N,N,N,N,N,N), 322ce29ed6SLinJiawei FCVT_W_S -> List(N,s,X,N,Y,N,N,N,Y), 332ce29ed6SLinJiawei FCVT_WU_S-> List(N,s,X,N,Y,N,N,N,Y), 342ce29ed6SLinJiawei FCVT_L_S -> List(N,s,X,N,Y,N,N,N,Y), 352ce29ed6SLinJiawei FCVT_LU_S-> List(N,s,X,N,Y,N,N,N,Y), 362ce29ed6SLinJiawei FEQ_S -> List(N,s,X,N,Y,N,N,N,N), 372ce29ed6SLinJiawei FLT_S -> List(N,s,X,N,Y,N,N,N,N), 382ce29ed6SLinJiawei FLE_S -> List(N,s,X,N,Y,N,N,N,N), 392ce29ed6SLinJiawei FSGNJ_S -> List(N,s,s,N,N,Y,N,N,N), 402ce29ed6SLinJiawei FSGNJN_S -> List(N,s,s,N,N,Y,N,N,N), 412ce29ed6SLinJiawei FSGNJX_S -> List(N,s,s,N,N,Y,N,N,N), 422ce29ed6SLinJiawei FMIN_S -> List(N,s,s,N,Y,Y,N,N,N), 432ce29ed6SLinJiawei FMAX_S -> List(N,s,s,N,Y,Y,N,N,N), 442ce29ed6SLinJiawei FADD_S -> List(Y,s,s,N,Y,Y,N,N,N), 452ce29ed6SLinJiawei FSUB_S -> List(Y,s,s,N,Y,Y,N,N,N), 462ce29ed6SLinJiawei FMUL_S -> List(N,s,s,N,Y,Y,N,N,N), 472ce29ed6SLinJiawei FMADD_S -> List(N,s,s,N,Y,Y,N,N,N), 482ce29ed6SLinJiawei FMSUB_S -> List(N,s,s,N,Y,Y,N,N,N), 492ce29ed6SLinJiawei FNMADD_S -> List(N,s,s,N,Y,Y,N,N,N), 502ce29ed6SLinJiawei FNMSUB_S -> List(N,s,s,N,Y,Y,N,N,N), 512ce29ed6SLinJiawei FDIV_S -> List(N,s,s,N,Y,Y,Y,N,N), 522ce29ed6SLinJiawei FSQRT_S -> List(N,s,s,N,Y,Y,N,Y,N) 532ce29ed6SLinJiawei ) 542ce29ed6SLinJiawei 552ce29ed6SLinJiawei val table = single 562ce29ed6SLinJiawei 572ce29ed6SLinJiawei val decoder = DecodeLogic(io.instr, default, table) 582ce29ed6SLinJiawei 592ce29ed6SLinJiawei val ctrl = io.fpCtrl 602ce29ed6SLinJiawei val sigs = Seq( 612ce29ed6SLinJiawei ctrl.isAddSub, ctrl.typeTagIn, ctrl.typeTagOut, 622ce29ed6SLinJiawei ctrl.fromInt, ctrl.wflags, ctrl.fpWen, 632ce29ed6SLinJiawei ctrl.div, ctrl.sqrt, ctrl.fcvt 642ce29ed6SLinJiawei ) 652ce29ed6SLinJiawei sigs.zip(decoder).foreach({case (s, d) => s := d}) 662ce29ed6SLinJiawei ctrl.typ := io.instr(21,20) 672ce29ed6SLinJiawei ctrl.fmt := io.instr(26,25) 682ce29ed6SLinJiawei 692ce29ed6SLinJiawei val fmaTable: Array[(BitPat, List[BitPat])] = Array( 702ce29ed6SLinJiawei FADD_S -> List(BitPat("b00"),N,Y), 712ce29ed6SLinJiawei FSUB_S -> List(BitPat("b01"),N,Y), 722ce29ed6SLinJiawei FMUL_S -> List(BitPat("b00"),N,Y), 732ce29ed6SLinJiawei FMADD_S -> List(BitPat("b00"),Y,Y), 742ce29ed6SLinJiawei FMSUB_S -> List(BitPat("b01"),Y,Y), 752ce29ed6SLinJiawei FNMADD_S-> List(BitPat("b11"),Y,Y), 762ce29ed6SLinJiawei FNMSUB_S-> List(BitPat("b10"),Y,Y) 772ce29ed6SLinJiawei ) 782ce29ed6SLinJiawei val fmaDefault = List(BitPat("b??"), N, N) 792ce29ed6SLinJiawei Seq(ctrl.fmaCmd, ctrl.ren3, ctrl.fma).zip( 802ce29ed6SLinJiawei DecodeLogic(io.instr, fmaDefault, fmaTable) 812ce29ed6SLinJiawei ).foreach({ 822ce29ed6SLinJiawei case (s, d) => s := d 832ce29ed6SLinJiawei }) 842ce29ed6SLinJiawei} 85