xref: /XiangShan/src/main/scala/xiangshan/backend/fu/vector/VPerm.scala (revision 65df1368ae17485cede8fee974d8d180a46c5c80)
1/****************************************************************************************
2 * Copyright (c) 2020-2021 Institute of Computing Technology, Chinese Academy of Sciences
3 * Copyright (c) 2020-2021 Peng Cheng Laboratory
4 *
5 * XiangShan is licensed under Mulan PSL v2.
6 * You can use this software according to the terms and conditions of the Mulan PSL v2.
7 * You may obtain a copy of Mulan PSL v2 at:
8 *          http://license.coscl.org.cn/MulanPSL2
9 *
10 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
11 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
12 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
13 *
14 * See the Mulan PSL v2 for more details.
15 ****************************************************************************************
16 */
17
18
19package xiangshan.backend.fu.vector
20
21import chipsalliance.rocketchip.config.Parameters
22import chisel3._
23import utils._
24import yunsuan.VpermType
25import xiangshan.{XSCoreParamsKey, FuType, SrcType}
26import yunsuan.vector.perm.Permutation
27import yunsuan.vector.{FToSModule, Vfslide1upModule}
28
29class VPPUWrapper(implicit p: Parameters)  extends VPUDataModule {
30
31  needReverse := false.B
32  needClearMask := false.B
33
34  // connect f2s
35  val f2s = Module(new FToSModule())
36  val vfslide1up= Module(new Vfslide1upModule())
37
38  f2s.io.in.valid := io.in.valid
39  f2s.io.in.src0 := vs1
40  f2s.io.in.src1 := io.in.bits.src(2)
41  f2s.io.in.vstart := 0.U(32.W) // TODO: when vstart >0 , how to solve the problem
42  f2s.io.in.vl := in.uop.ctrl.vconfig.vl
43  f2s.io.in.vsew := in.uop.ctrl.vconfig.vtype.vsew
44  f2s.io.in.vta := in.uop.ctrl.vconfig.vtype.vta
45  f2s.io.in.vma := in.uop.ctrl.vconfig.vtype.vma
46  f2s.io.in.vlmul := in.uop.ctrl.vconfig.vtype.vlmul
47  f2s.io.in.v0 := in.src(3)
48
49  vfslide1up.io.in.valid := io.in.valid
50  vfslide1up.io.in.src0 := vs1
51  vfslide1up.io.in.src1 := vs2
52  vfslide1up.io.in.vstart := 0.U(32.W) // TODO: when vstart >0 , how to solve the problem
53  vfslide1up.io.in.vl := in.uop.ctrl.vconfig.vl
54  vfslide1up.io.in.vsew := in.uop.ctrl.vconfig.vtype.vsew
55  vfslide1up.io.in.vta := in.uop.ctrl.vconfig.vtype.vta
56  vfslide1up.io.in.vma := in.uop.ctrl.vconfig.vtype.vma
57  vfslide1up.io.in.vlmul := in.uop.ctrl.vconfig.vtype.vlmul
58  vfslide1up.io.in.v0 := in.src(3)
59
60  io.out.bits.data := RegNext(Mux(in.uop.ctrl.fuOpType === VpermType.vfmv_s_f, f2s.io.out.vd,
61                      Mux(in.uop.ctrl.fuOpType === VpermType.vfslide1up, vfslide1up.io.out.vd, 0.U)))
62  vxsat := 0.U
63  io.out.valid := RegNext(io.in.valid)
64}
65
66class VPermWrapper(implicit p: Parameters)  extends VPUDataModule {
67
68  needReverse := false.B
69  needClearMask := false.B
70
71  // connect VPerm
72  val VPerm = Module(new Permutation)
73  VPerm.io.in.bits.opcode := VpermType.getOpcode(in.uop.ctrl.fuOpType).asTypeOf(VPerm.io.in.bits.opcode.cloneType)
74  VPerm.io.in.bits.info.vm := in.uop.ctrl.vm
75  VPerm.io.in.bits.info.ma := in.uop.ctrl.vconfig.vtype.vma
76  VPerm.io.in.bits.info.ta := in.uop.ctrl.vconfig.vtype.vta
77  VPerm.io.in.bits.info.vlmul := in.uop.ctrl.vconfig.vtype.vlmul
78  VPerm.io.in.bits.info.vl := in.uop.ctrl.vconfig.vl
79
80  VPerm.io.in.bits.info.vstart := vstart
81  VPerm.io.in.bits.info.uopIdx := in.uop.ctrl.uopIdx
82
83  VPerm.io.in.bits.info.vxrm := vxrm
84  val srcVdType = Wire(new Bundle{
85    val srcType2 = UInt(4.W)
86    val srcType1 = UInt(4.W)
87    val vdType = UInt(4.W)
88  })
89  srcVdType := VpermType.getSrcVdType(in.uop.ctrl.fuOpType, in.uop.ctrl.vconfig.vtype.vsew(1,0)).asTypeOf(srcVdType.cloneType)
90  VPerm.io.in.bits.srcType(0) := srcVdType.srcType2
91  src1Sew := srcVdType.srcType1(1,0)
92  VPerm.io.in.bits.srcType(1) := srcVdType.srcType1
93  VPerm.io.in.bits.vdType := srcVdType.vdType
94  // dirty code for VSLIDEUP_VX/VSLIDEDOWN_VX
95  val vs1Mux = Mux(VpermType.notNeedSew(in.uop.ctrl.fuOpType)&&(!SrcType.isVp(in.uop.ctrl.srcType(0))),
96                    Mux(SrcType.isFp(in.uop.ctrl.srcType(0)), in.src(0)(63,0), ctrl.imm(4,0)),
97                    vs1)
98  VPerm.io.in.bits.vs1 := vs1Mux
99  VPerm.io.in.bits.vs2 := vs2
100  VPerm.io.in.bits.old_vd := in.src(2)
101  VPerm.io.in.bits.mask := in.src(3)
102  VPerm.io.in.valid := io.in.valid
103
104  // connect io
105  io.out.bits.data := VPerm.io.out.vd
106  vxsat := VPerm.io.out.vxsat
107  io.out.valid := RegNext(io.in.valid)
108}
109
110class VPerm(implicit p: Parameters) extends VPUSubModule(p(XSCoreParamsKey).VLEN) {
111  XSError(io.in.valid && io.in.bits.uop.ctrl.fuOpType === VpermType.dummy, "VpermType OpType not supported")
112  override val dataModule = Seq(
113    Module(new VPPUWrapper),
114    Module(new VPermWrapper)
115  )
116  val select0 = io.in.bits.uop.ctrl.fuOpType === VpermType.vfmv_s_f
117  override val select = Seq(
118    io.in.bits.uop.ctrl.fuType === FuType.vppu && select0,
119    io.in.bits.uop.ctrl.fuType === FuType.vppu && !select0
120  )
121  connectDataModule
122}
123