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