xref: /XiangShan/src/main/scala/xiangshan/backend/fu/vector/VIAluFix.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 utils._
243ebdf758SXuan Hu//import yunsuan.vector.alu.VIntFixpAlu
253ebdf758SXuan Hu//import yunsuan.VialuFixType
263ebdf758SXuan Hu//import xiangshan.{XSCoreParamsKey, FuType}
273ebdf758SXuan Hu//import yunsuan.vector.{SewOH, MaskExtract}
283ebdf758SXuan Hu//
293ebdf758SXuan Hu//
303ebdf758SXuan Hu//
313ebdf758SXuan Hu//class VIAluFixWrapper(implicit p: Parameters)  extends VPUDataModule {
323ebdf758SXuan Hu//
333ebdf758SXuan Hu//  needReverse := VialuFixType.needReverse(ctrl.fuOpType)
343ebdf758SXuan Hu//  needClearMask := VialuFixType.needClearMask(ctrl.fuOpType)
353ebdf758SXuan Hu//
363ebdf758SXuan Hu//  // connect VIAlu
373ebdf758SXuan Hu//  val vIntFixpAlu = Module(new VIntFixpAlu)
383ebdf758SXuan Hu//  vIntFixpAlu.io.in.opcode := VialuFixType.getOpcode(in.uop.ctrl.fuOpType).asTypeOf(vIntFixpAlu.io.in.opcode)
393ebdf758SXuan Hu//  vIntFixpAlu.io.in.info.vm := in.uop.ctrl.vm
403ebdf758SXuan Hu//  vIntFixpAlu.io.in.info.ma := in.uop.ctrl.vconfig.vtype.vma
413ebdf758SXuan Hu//  vIntFixpAlu.io.in.info.ta := in.uop.ctrl.vconfig.vtype.vta
423ebdf758SXuan Hu//  vIntFixpAlu.io.in.info.vlmul := in.uop.ctrl.vconfig.vtype.vlmul
433ebdf758SXuan Hu//  vIntFixpAlu.io.in.info.vl := in.uop.ctrl.vconfig.vl
443ebdf758SXuan Hu//
453ebdf758SXuan Hu//  vIntFixpAlu.io.in.info.vstart := vstart // TODO :
463ebdf758SXuan Hu//  vIntFixpAlu.io.in.info.uopIdx := in.uop.ctrl.uopIdx
473ebdf758SXuan Hu//
483ebdf758SXuan Hu//  vIntFixpAlu.io.in.info.vxrm := vxrm
493ebdf758SXuan Hu//  val srcVdType = Wire(new Bundle{
503ebdf758SXuan Hu//    val srcType2 = UInt(4.W)
513ebdf758SXuan Hu//    val srcType1 = UInt(4.W)
523ebdf758SXuan Hu//    val vdType   = UInt(4.W)
533ebdf758SXuan Hu//  })
543ebdf758SXuan Hu//  srcVdType := VialuFixType.getSrcVdType(in.uop.ctrl.fuOpType, in.uop.ctrl.vconfig.vtype.vsew(1,0)).asTypeOf(srcVdType.cloneType)
553ebdf758SXuan Hu//  vIntFixpAlu.io.in.srcType(0) := srcVdType.srcType2
563ebdf758SXuan Hu//  vIntFixpAlu.io.in.srcType(1) := srcVdType.srcType1
573ebdf758SXuan Hu//  vIntFixpAlu.io.in.vdType := srcVdType.vdType
583ebdf758SXuan Hu//  vIntFixpAlu.io.in.vs1 := vs1
593ebdf758SXuan Hu//  vIntFixpAlu.io.in.vs2 := vs2
603ebdf758SXuan Hu//  vIntFixpAlu.io.in.old_vd := in.src(2)
613ebdf758SXuan Hu//
623ebdf758SXuan Hu//  val eewVs1 = SewOH(srcVdType.srcType1(1, 0))
633ebdf758SXuan Hu//  val eewVd = SewOH(srcVdType.vdType(1, 0))
643ebdf758SXuan Hu//  val uopIdx = in.uop.ctrl.uopIdx
653ebdf758SXuan Hu//  val narrow = srcVdType.srcType2(1, 0) === 3.U && srcVdType.vdType(1, 0) === 2.U ||
663ebdf758SXuan Hu//    srcVdType.srcType2(1, 0) === 2.U && srcVdType.vdType(1, 0) === 1.U ||
673ebdf758SXuan Hu//    srcVdType.srcType2(1, 0) === 1.U && srcVdType.vdType(1, 0) === 0.U
683ebdf758SXuan Hu//  val eewVm = Mux(srcVdType.vdType === 15.U, eewVs1, eewVd)
693ebdf758SXuan Hu//  val maskIdx = Mux(narrow, uopIdx >> 1, uopIdx)
703ebdf758SXuan Hu//  vIntFixpAlu.io.in.mask16b := MaskExtract(mask, maskIdx, eewVm)
713ebdf758SXuan Hu//  vIntFixpAlu.io.ctrl.narrow := narrow
723ebdf758SXuan Hu//  vIntFixpAlu.io.ctrl.vstart_gte_vl := vstart >= in.uop.ctrl.vconfig.vl
733ebdf758SXuan Hu//
743ebdf758SXuan Hu//  // connect io
753ebdf758SXuan Hu//  io.out.bits.data := vIntFixpAlu.io.out.vd
763ebdf758SXuan Hu//  vxsat := vIntFixpAlu.io.out.vxsat
773ebdf758SXuan Hu//  io.out.valid := RegNext(io.in.valid)
783ebdf758SXuan Hu//}
793ebdf758SXuan Hu//
803ebdf758SXuan Hu//
81