xref: /XiangShan/src/main/scala/xiangshan/backend/fu/vector/VIMacU.scala (revision adf68ff35dc385804f293aa9189a95e612170c74)
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.vector.mac.VIMac
25import yunsuan.VimacType
26import xiangshan.{XSCoreParamsKey, FuType}
27
28
29
30class VIMacWrapper(implicit p: Parameters)  extends VPUDataModule {
31
32  needReverse := false.B
33  needClearMask := false.B
34
35  // connect VIMac
36  val vImac = Module(new VIMac)
37  vImac.io.in.valid := io.in.valid
38  vImac.io.in.bits.opcode := VimacType.getOpcode(in.uop.ctrl.fuOpType).asTypeOf(vImac.io.in.bits.opcode)
39  vImac.io.in.bits.info.vm := in.uop.ctrl.vm
40  vImac.io.in.bits.info.ma := in.uop.ctrl.vconfig.vtype.vma
41  vImac.io.in.bits.info.ta := in.uop.ctrl.vconfig.vtype.vta
42  vImac.io.in.bits.info.vlmul := in.uop.ctrl.vconfig.vtype.vlmul
43  vImac.io.in.bits.info.vl := in.uop.ctrl.vconfig.vl
44  vImac.io.in.bits.info.vstart := vstart // TODO :
45  vImac.io.in.bits.info.uopIdx := in.uop.ctrl.uopIdx
46  vImac.io.in.bits.info.vxrm := vxrm
47
48  val srcVdType = Wire(new Bundle{
49    val srcType2 = UInt(4.W)
50    val srcType1 = UInt(4.W)
51    val vdType = UInt(4.W)
52  })
53  srcVdType := VimacType.getSrcVdType(in.uop.ctrl.fuOpType, in.uop.ctrl.vconfig.vtype.vsew(1,0)).asTypeOf(srcVdType.cloneType)
54  vImac.io.in.bits.srcType(0) := srcVdType.srcType2
55  vImac.io.in.bits.srcType(1) := srcVdType.srcType1
56  vImac.io.in.bits.vdType := srcVdType.vdType
57  vImac.io.in.bits.vs1 := vs1
58  vImac.io.in.bits.vs2 := vs2
59  vImac.io.in.bits.old_vd := in.src(2)
60  vImac.io.in.bits.mask := mask
61
62  // connect io
63  io.out.bits.data := vImac.io.out.bits.vd
64  vxsat := vImac.io.out.bits.vxsat
65  io.out.valid := vImac.io.out.valid
66}
67
68class VIMacU(implicit p: Parameters) extends VPUSubModule(p(XSCoreParamsKey).VLEN) {
69  XSError(io.in.valid && io.in.bits.uop.ctrl.fuOpType === VimacType.dummy, "Vimac OpType not supported")
70  override val dataModule = Seq(Module(new VIMacWrapper))
71  override val select = Seq(
72    io.in.bits.uop.ctrl.fuType === FuType.vimac
73  )
74  connectDataModule
75}
76