xref: /XiangShan/src/main/scala/xiangshan/backend/fu/vector/VPerm.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.log2Up
243ebdf758SXuan Hu//import utils._
253ebdf758SXuan Hu//import yunsuan.VpermType
263ebdf758SXuan Hu//import xiangshan.{FuType, SrcType, XSCoreParamsKey}
273ebdf758SXuan Hu//import yunsuan.vector.perm.Permutation
283ebdf758SXuan Hu//import yunsuan.vector.{FToSModule, Vfslide1upModule}
293ebdf758SXuan Hu//import chisel3.dontTouch
303ebdf758SXuan Hu//
313ebdf758SXuan Hu//class VPPUWrapper(implicit p: Parameters)  extends VPUDataModule {
323ebdf758SXuan Hu//
333ebdf758SXuan Hu//  needReverse := false.B
343ebdf758SXuan Hu//  needClearMask := false.B
353ebdf758SXuan Hu//
363ebdf758SXuan Hu//  // connect f2s
373ebdf758SXuan Hu//  val f2s = Module(new FToSModule())
383ebdf758SXuan Hu//  val vfslide1up= Module(new Vfslide1upModule())
393ebdf758SXuan Hu//
403ebdf758SXuan Hu//  f2s.io.in.valid := io.in.valid
413ebdf758SXuan Hu//  f2s.io.in.src0 := vs1
423ebdf758SXuan Hu//  f2s.io.in.src1 := io.in.bits.src(2)
433ebdf758SXuan Hu//  f2s.io.in.vstart := 0.U(32.W) // TODO: when vstart >0 , how to solve the problem
443ebdf758SXuan Hu//  f2s.io.in.vl := in.uop.ctrl.vconfig.vl
453ebdf758SXuan Hu//  f2s.io.in.vsew := in.uop.ctrl.vconfig.vtype.vsew
463ebdf758SXuan Hu//  f2s.io.in.vta := in.uop.ctrl.vconfig.vtype.vta
473ebdf758SXuan Hu//  f2s.io.in.vma := in.uop.ctrl.vconfig.vtype.vma
483ebdf758SXuan Hu//  f2s.io.in.vlmul := in.uop.ctrl.vconfig.vtype.vlmul
493ebdf758SXuan Hu//  f2s.io.in.v0 := mask
503ebdf758SXuan Hu//
513ebdf758SXuan Hu//  vfslide1up.io.in.valid := io.in.valid
523ebdf758SXuan Hu//  vfslide1up.io.in.src0 := vs1
533ebdf758SXuan Hu//  vfslide1up.io.in.src1 := vs2
543ebdf758SXuan Hu//  vfslide1up.io.in.vstart := 0.U(32.W) // TODO: when vstart >0 , how to solve the problem
553ebdf758SXuan Hu//  vfslide1up.io.in.vl := in.uop.ctrl.vconfig.vl
563ebdf758SXuan Hu//  vfslide1up.io.in.vsew := in.uop.ctrl.vconfig.vtype.vsew
573ebdf758SXuan Hu//  vfslide1up.io.in.vta := in.uop.ctrl.vconfig.vtype.vta
583ebdf758SXuan Hu//  vfslide1up.io.in.vma := in.uop.ctrl.vconfig.vtype.vma
593ebdf758SXuan Hu//  vfslide1up.io.in.vlmul := in.uop.ctrl.vconfig.vtype.vlmul
603ebdf758SXuan Hu//  vfslide1up.io.in.v0 := mask
613ebdf758SXuan Hu//
623ebdf758SXuan Hu//  io.out.bits.data := RegNext(Mux(in.uop.ctrl.fuOpType === VpermType.vfmv_s_f, f2s.io.out.vd,
633ebdf758SXuan Hu//                      Mux(in.uop.ctrl.fuOpType === VpermType.vfslide1up, vfslide1up.io.out.vd, 0.U)))
643ebdf758SXuan Hu//  vxsat := 0.U
653ebdf758SXuan Hu//  io.out.valid := RegNext(io.in.valid)
663ebdf758SXuan Hu//}
673ebdf758SXuan Hu//
683ebdf758SXuan Hu//class VPermWrapper(implicit p: Parameters)  extends VPUDataModule {
693ebdf758SXuan Hu//
703ebdf758SXuan Hu//  needReverse := false.B
713ebdf758SXuan Hu//  needClearMask := (VpermType.vcompress === in.uop.ctrl.fuOpType) && (in.uop.ctrl.uopIdx(log2Up(MaxUopSize)-1,1) === 0.U)
723ebdf758SXuan Hu//
733ebdf758SXuan Hu//  // connect VPerm
743ebdf758SXuan Hu//  val VPerm = Module(new Permutation)
753ebdf758SXuan Hu//  VPerm.io.in.bits.opcode := VpermType.getOpcode(in.uop.ctrl.fuOpType).asTypeOf(VPerm.io.in.bits.opcode.cloneType)
763ebdf758SXuan Hu//  VPerm.io.in.bits.info.vm := in.uop.ctrl.vm
773ebdf758SXuan Hu//  VPerm.io.in.bits.info.ma := in.uop.ctrl.vconfig.vtype.vma
783ebdf758SXuan Hu//  VPerm.io.in.bits.info.ta := in.uop.ctrl.vconfig.vtype.vta
793ebdf758SXuan Hu//  VPerm.io.in.bits.info.vlmul := in.uop.ctrl.vconfig.vtype.vlmul
803ebdf758SXuan Hu//  VPerm.io.in.bits.info.vl := in.uop.ctrl.vconfig.vl
813ebdf758SXuan Hu//
823ebdf758SXuan Hu//  VPerm.io.in.bits.info.vstart := vstart
833ebdf758SXuan Hu//  VPerm.io.in.bits.info.uopIdx := in.uop.ctrl.uopIdx
843ebdf758SXuan Hu//
853ebdf758SXuan Hu//  VPerm.io.in.bits.info.vxrm := vxrm
863ebdf758SXuan Hu//  val srcVdType = Wire(new Bundle{
873ebdf758SXuan Hu//    val srcType2 = UInt(4.W)
883ebdf758SXuan Hu//    val srcType1 = UInt(4.W)
893ebdf758SXuan Hu//    val vdType = UInt(4.W)
903ebdf758SXuan Hu//  })
913ebdf758SXuan Hu//  srcVdType := VpermType.getSrcVdType(in.uop.ctrl.fuOpType, in.uop.ctrl.vconfig.vtype.vsew(1,0)).asTypeOf(srcVdType.cloneType)
923ebdf758SXuan Hu//  VPerm.io.in.bits.srcType(0) := srcVdType.srcType2
933ebdf758SXuan Hu//  src1Sew := srcVdType.srcType1(1,0)
943ebdf758SXuan Hu//  src1NeedSew := !VpermType.notNeedSew(in.uop.ctrl.fuOpType)
953ebdf758SXuan Hu//  VPerm.io.in.bits.srcType(1) := srcVdType.srcType1
963ebdf758SXuan Hu//  VPerm.io.in.bits.vdType := srcVdType.vdType
973ebdf758SXuan Hu//  // dirty code for VSLIDEUP_VX/VSLIDEDOWN_VX
983ebdf758SXuan Hu//  VPerm.io.in.bits.vs1 := vs1
993ebdf758SXuan Hu//  VPerm.io.in.bits.vs2 := vs2
1003ebdf758SXuan Hu//  VPerm.io.in.bits.old_vd := in.src(2)
1013ebdf758SXuan Hu//  VPerm.io.in.bits.mask := mask
1023ebdf758SXuan Hu//  VPerm.io.in.valid := io.in.valid
1033ebdf758SXuan Hu//
1043ebdf758SXuan Hu//  // connect io
1053ebdf758SXuan Hu//  io.out.bits.data := VPerm.io.out.vd
1063ebdf758SXuan Hu//  vxsat := VPerm.io.out.vxsat
1073ebdf758SXuan Hu//  io.out.valid := RegNext(io.in.valid)
1083ebdf758SXuan Hu//}
1093ebdf758SXuan Hu//
1103ebdf758SXuan Hu//class VPerm(implicit p: Parameters) extends VPUSubModule(p(XSCoreParamsKey).VLEN) {
1113ebdf758SXuan Hu//  XSError(io.in.valid && io.in.bits.uop.ctrl.fuOpType === VpermType.dummy, "VpermType OpType not supported")
1123ebdf758SXuan Hu//  override val dataModule = Seq(
1133ebdf758SXuan Hu//    Module(new VPPUWrapper),
1143ebdf758SXuan Hu//    Module(new VPermWrapper)
1153ebdf758SXuan Hu//  )
1163ebdf758SXuan Hu//  val select0 = io.in.bits.uop.ctrl.fuOpType === VpermType.vfmv_s_f
1173ebdf758SXuan Hu//  override val select = Seq(
1183ebdf758SXuan Hu//    io.in.bits.uop.ctrl.fuType === FuType.vppu && select0,
1193ebdf758SXuan Hu//    io.in.bits.uop.ctrl.fuType === FuType.vppu && !select0
1203ebdf758SXuan Hu//  )
1213ebdf758SXuan Hu//  connectDataModule
1223ebdf758SXuan Hu//}
123