xref: /XiangShan/src/main/scala/xiangshan/backend/fu/vector/VIPU.scala (revision 83ba63b34cf09b33c0a9e1b3203138e51af4491b)
13ebdf758SXuan Hu///****************************************************************************************
23ebdf758SXuan Hu// * Copyright (c) 2020-2021 Institute of Computing Technology, Chinese Academy of Sciences
33ebdf758SXuan Hu// * Copyright (c) 2020-2021 Peng Cheng Laboratory
43ebdf758SXuan Hu// *
53ebdf758SXuan Hu// * XiangShan is licensed under Mulan PSL v2.
63ebdf758SXuan Hu// * You can use this software according to the terms and conditions of the Mulan PSL v2.
73ebdf758SXuan Hu// * You may obtain a copy of Mulan PSL v2 at:
83ebdf758SXuan Hu// *          http://license.coscl.org.cn/MulanPSL2
93ebdf758SXuan Hu// *
103ebdf758SXuan Hu// * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
113ebdf758SXuan Hu// * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
123ebdf758SXuan Hu// * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
133ebdf758SXuan Hu// *
143ebdf758SXuan Hu// * See the Mulan PSL v2 for more details.
153ebdf758SXuan Hu// ****************************************************************************************
163ebdf758SXuan Hu// */
173ebdf758SXuan Hu//
183ebdf758SXuan Hu//
193ebdf758SXuan Hu//package xiangshan.backend.fu.vector
203ebdf758SXuan Hu//
21*83ba63b3SXuan Hu//import org.chipsalliance.cde.config.Parameters
223ebdf758SXuan Hu//import chisel3._
233ebdf758SXuan Hu//import chisel3.util._
243ebdf758SXuan Hu//import utils._
253ebdf758SXuan Hu//import utility._
263ebdf758SXuan Hu//import yunsuan.vector.alu.{VAluOpcode, VIAlu}
273ebdf758SXuan Hu//import yunsuan.{VectorElementFormat, VipuType}
283ebdf758SXuan Hu//import xiangshan.{SelImm, SrcType, UopSplitType, XSCoreParamsKey, XSModule,FuType}
293ebdf758SXuan Hu//
303ebdf758SXuan Hu//import scala.collection.Seq
313ebdf758SXuan Hu//
323ebdf758SXuan Hu//class VIAluDecodeResultBundle extends Bundle {
333ebdf758SXuan Hu//  val opcode = UInt(6.W)
343ebdf758SXuan Hu//  val srcType2 = UInt(4.W)
353ebdf758SXuan Hu//  val srcType1 = UInt(4.W)
363ebdf758SXuan Hu//  val vdType = UInt(4.W)
373ebdf758SXuan Hu//}
383ebdf758SXuan Hu//
393ebdf758SXuan Hu//class VIAluDecoder (implicit p: Parameters) extends XSModule {
403ebdf758SXuan Hu//  val io = IO(new Bundle{
413ebdf758SXuan Hu//    val in = Input(new Bundle{
423ebdf758SXuan Hu//      val fuOpType = UInt(8.W)
433ebdf758SXuan Hu//      val sew = UInt(2.W)
443ebdf758SXuan Hu//    })
453ebdf758SXuan Hu//    val out = Output(new VIAluDecodeResultBundle)
463ebdf758SXuan Hu//  })
473ebdf758SXuan Hu//
483ebdf758SXuan Hu//  // u 00 s 01 f 10 mask 1111
493ebdf758SXuan Hu//  val uSew = Cat(0.U(2.W), io.in.sew)
503ebdf758SXuan Hu//  val uSew2 = Cat(0.U(2.W), (io.in.sew+1.U))
513ebdf758SXuan Hu//  val uSewf2 = Cat(0.U(2.W), (io.in.sew-1.U))
523ebdf758SXuan Hu//  val uSewf4 = Cat(0.U(2.W), (io.in.sew-2.U))
533ebdf758SXuan Hu//  val uSewf8 = Cat(0.U(2.W), (io.in.sew-3.U))
543ebdf758SXuan Hu//  val sSew = Cat(1.U(2.W), io.in.sew)
553ebdf758SXuan Hu//  val sSew2 = Cat(1.U(2.W), (io.in.sew+1.U))
563ebdf758SXuan Hu//  val sSewf2 = Cat(1.U(2.W), (io.in.sew - 1.U))
573ebdf758SXuan Hu//  val sSewf4 = Cat(1.U(2.W), (io.in.sew - 2.U))
583ebdf758SXuan Hu//  val sSewf8 = Cat(1.U(2.W), (io.in.sew - 3.U))
593ebdf758SXuan Hu//  val mask = "b1111".U(4.W)
603ebdf758SXuan Hu//
613ebdf758SXuan Hu//  val out = LookupTree(io.in.fuOpType, List(
623ebdf758SXuan Hu//    // --------------------- opcode       srcType2 1 vdType
63*83ba63b3SXuan Hu//    VipuType.vredsum_vs -> Cat(VAluOpcode.vredsum, uSew, uSew, uSew).asUInt,
64*83ba63b3SXuan Hu//    VipuType.vredmaxu_vs -> Cat(VAluOpcode.vredmax, uSew, uSew, uSew).asUInt,
65*83ba63b3SXuan Hu//    VipuType.vredmax_vs -> Cat(VAluOpcode.vredmax, sSew, sSew, sSew).asUInt,
66*83ba63b3SXuan Hu//    VipuType.vredminu_vs -> Cat(VAluOpcode.vredmin, uSew, uSew, uSew).asUInt,
67*83ba63b3SXuan Hu//    VipuType.vredmin_vs -> Cat(VAluOpcode.vredmin, sSew, sSew, sSew).asUInt,
68*83ba63b3SXuan Hu//    VipuType.vredand_vs -> Cat(VAluOpcode.vredand, uSew, uSew, uSew).asUInt,
69*83ba63b3SXuan Hu//    VipuType.vredor_vs -> Cat(VAluOpcode.vredor, uSew, uSew, uSew).asUInt,
70*83ba63b3SXuan Hu//    VipuType.vredxor_vs -> Cat(VAluOpcode.vredxor, uSew, uSew, uSew).asUInt,
713ebdf758SXuan Hu//
72*83ba63b3SXuan Hu//    VipuType.vwredsumu_vs -> Cat(VAluOpcode.vredsum, uSew, uSew, uSew2).asUInt,
73*83ba63b3SXuan Hu//    VipuType.vwredsum_vs -> Cat(VAluOpcode.vredsum, sSew, sSew, sSew2).asUInt,
743ebdf758SXuan Hu//
75*83ba63b3SXuan Hu//    VipuType.vcpop_m -> Cat(VAluOpcode.vcpop, mask, mask, uSew).asUInt,
76*83ba63b3SXuan Hu//    VipuType.vfirst_m -> Cat(VAluOpcode.vfirst, mask, mask, uSew).asUInt,
77*83ba63b3SXuan Hu//    VipuType.vmsbf_m -> Cat(VAluOpcode.vmsbf, mask, mask, mask).asUInt,
78*83ba63b3SXuan Hu//    VipuType.vmsif_m -> Cat(VAluOpcode.vmsif, mask, mask, mask).asUInt,
79*83ba63b3SXuan Hu//    VipuType.vmsof_m -> Cat(VAluOpcode.vmsof, mask, mask, mask).asUInt,
803ebdf758SXuan Hu//
81*83ba63b3SXuan Hu//    VipuType.viota_m -> Cat(VAluOpcode.viota, uSew, uSew, uSew).asUInt,
82*83ba63b3SXuan Hu//    VipuType.vid_v -> Cat(VAluOpcode.vid, uSew, uSew, uSew).asUInt
833ebdf758SXuan Hu//
843ebdf758SXuan Hu//  )).asTypeOf(new VIAluDecodeResultBundle)
853ebdf758SXuan Hu//
863ebdf758SXuan Hu//  io.out <> out
873ebdf758SXuan Hu//}
883ebdf758SXuan Hu//
893ebdf758SXuan Hu//class VIAluWrapper(implicit p: Parameters)  extends VPUDataModule{
903ebdf758SXuan Hu//
913ebdf758SXuan Hu//  needReverse := false.B
923ebdf758SXuan Hu//  needClearMask := false.B
933ebdf758SXuan Hu//
943ebdf758SXuan Hu//  // connect VIAlu
953ebdf758SXuan Hu//  val decoder = Module(new VIAluDecoder)
963ebdf758SXuan Hu//  val vialu = Module(new VIAlu)
973ebdf758SXuan Hu//  decoder.io.in.fuOpType := in.uop.ctrl.fuOpType
983ebdf758SXuan Hu//  decoder.io.in.sew := in.uop.ctrl.vconfig.vtype.vsew(1,0)
993ebdf758SXuan Hu//
1003ebdf758SXuan Hu//  vialu.io.in.bits.opcode := decoder.io.out.opcode.asTypeOf(vialu.io.in.bits.opcode.cloneType)
1013ebdf758SXuan Hu//  vialu.io.in.bits.info.vm := in.uop.ctrl.vm
1023ebdf758SXuan Hu//  vialu.io.in.bits.info.ma := in.uop.ctrl.vconfig.vtype.vma
1033ebdf758SXuan Hu//  vialu.io.in.bits.info.ta := in.uop.ctrl.vconfig.vtype.vta
1043ebdf758SXuan Hu//  vialu.io.in.bits.info.vlmul := in.uop.ctrl.vconfig.vtype.vlmul
1053ebdf758SXuan Hu//  vialu.io.in.bits.info.vl := in.uop.ctrl.vconfig.vl
1063ebdf758SXuan Hu//
1073ebdf758SXuan Hu//  vialu.io.in.bits.info.vstart := vstart // TODO :
1083ebdf758SXuan Hu//  vialu.io.in.bits.info.uopIdx := in.uop.ctrl.uopIdx
1093ebdf758SXuan Hu//
1103ebdf758SXuan Hu//  vialu.io.in.bits.info.vxrm := vxrm
1113ebdf758SXuan Hu//  vialu.io.in.bits.srcType(0) := decoder.io.out.srcType2
1123ebdf758SXuan Hu//  vialu.io.in.bits.srcType(1) := decoder.io.out.srcType1
1133ebdf758SXuan Hu//  vialu.io.in.bits.vdType := decoder.io.out.vdType
1143ebdf758SXuan Hu//  val lmul = MuxLookup(in.uop.ctrl.vconfig.vtype.vlmul , 1.U(4.W), Array(
1153ebdf758SXuan Hu//    "b001".U -> 2.U,
1163ebdf758SXuan Hu//    "b010".U -> 4.U,
1173ebdf758SXuan Hu//    "b011".U -> 8.U
1183ebdf758SXuan Hu//  ))
1193ebdf758SXuan Hu//  val needClearVs1 = (VipuType.vcpop_m === in.uop.ctrl.fuOpType && in.uop.ctrl.uopIdx === 0.U) ||
1203ebdf758SXuan Hu//                     (VipuType.viota_m === in.uop.ctrl.fuOpType && in.uop.ctrl.uopIdx(log2Up(MaxUopSize)-1,1) === 0.U) ||
1213ebdf758SXuan Hu//                     (VipuType.vid_v   === in.uop.ctrl.fuOpType && in.uop.ctrl.uopIdx(log2Up(MaxUopSize)-1,1) === 0.U)     // dirty code TODO:  inset into IAlu
1223ebdf758SXuan Hu//  val needShiftVs1 = (VipuType.vwredsumu_vs === in.uop.ctrl.fuOpType || VipuType.vwredsum_vs === in.uop.ctrl.fuOpType) &&
1233ebdf758SXuan Hu//                     in.uop.ctrl.uopIdx < lmul
1243ebdf758SXuan Hu//  vialu.io.in.bits.vs1 := Mux1H(Seq(
1253ebdf758SXuan Hu//    needClearVs1 -> 0.U,
1263ebdf758SXuan Hu//    needShiftVs1 -> SignExt(vs1(127,64), 128),
1273ebdf758SXuan Hu//    ((!needClearVs1)&&(!needShiftVs1)) -> vs1
1283ebdf758SXuan Hu//  ))
1293ebdf758SXuan Hu//  vialu.io.in.bits.vs2 := vs2
1303ebdf758SXuan Hu//  vialu.io.in.bits.old_vd := in.src(2)
1313ebdf758SXuan Hu//  vialu.io.in.bits.mask := mask
1323ebdf758SXuan Hu//
1333ebdf758SXuan Hu//  vialu.io.in.valid := io.in.valid
1343ebdf758SXuan Hu//
1353ebdf758SXuan Hu//  // connect io
1363ebdf758SXuan Hu//  io.out.bits.data := vialu.io.out.bits.vd
1373ebdf758SXuan Hu//  vxsat := vialu.io.out.bits.vxsat
1383ebdf758SXuan Hu//  io.out.valid := vialu.io.out.valid
1393ebdf758SXuan Hu//}
1403ebdf758SXuan Hu//
1413ebdf758SXuan Hu//class VIPU(implicit p: Parameters) extends VPUSubModule(p(XSCoreParamsKey).VLEN) {
1423ebdf758SXuan Hu//  XSError(io.in.valid && io.in.bits.uop.ctrl.fuOpType === VipuType.dummy, "VIPU OpType not supported")
1433ebdf758SXuan Hu//  override val dataModule = Seq(Module(new VIAluWrapper))
1443ebdf758SXuan Hu//  override val select = Seq(
1453ebdf758SXuan Hu//    io.in.bits.uop.ctrl.fuType === FuType.vipu
1463ebdf758SXuan Hu//  )
1473ebdf758SXuan Hu//  connectDataModule
1483ebdf758SXuan Hu//}
149