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