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._ 243ebdf758SXuan Hu//import utils._ 253ebdf758SXuan Hu//import utility._ 263ebdf758SXuan Hu//import yunsuan.vector.alu.{VAluOpcode, VIAlu} 273ebdf758SXuan Hu//import yunsuan.{VectorElementFormat, VipuType} 283ebdf758SXuan Hu//import xiangshan.{SelImm, SrcType, UopSplitType, XSCoreParamsKey, XSModule,FuType} 293ebdf758SXuan Hu// 303ebdf758SXuan Hu//import scala.collection.Seq 313ebdf758SXuan Hu// 323ebdf758SXuan Hu//class VIAluDecodeResultBundle extends Bundle { 333ebdf758SXuan Hu// val opcode = UInt(6.W) 343ebdf758SXuan Hu// val srcType2 = UInt(4.W) 353ebdf758SXuan Hu// val srcType1 = UInt(4.W) 363ebdf758SXuan Hu// val vdType = UInt(4.W) 373ebdf758SXuan Hu//} 383ebdf758SXuan Hu// 393ebdf758SXuan Hu//class VIAluDecoder (implicit p: Parameters) extends XSModule { 403ebdf758SXuan Hu// val io = IO(new Bundle{ 413ebdf758SXuan Hu// val in = Input(new Bundle{ 423ebdf758SXuan Hu// val fuOpType = UInt(8.W) 433ebdf758SXuan Hu// val sew = UInt(2.W) 443ebdf758SXuan Hu// }) 453ebdf758SXuan Hu// val out = Output(new VIAluDecodeResultBundle) 463ebdf758SXuan Hu// }) 473ebdf758SXuan Hu// 483ebdf758SXuan Hu// // u 00 s 01 f 10 mask 1111 493ebdf758SXuan Hu// val uSew = Cat(0.U(2.W), io.in.sew) 503ebdf758SXuan Hu// val uSew2 = Cat(0.U(2.W), (io.in.sew+1.U)) 513ebdf758SXuan Hu// val uSewf2 = Cat(0.U(2.W), (io.in.sew-1.U)) 523ebdf758SXuan Hu// val uSewf4 = Cat(0.U(2.W), (io.in.sew-2.U)) 533ebdf758SXuan Hu// val uSewf8 = Cat(0.U(2.W), (io.in.sew-3.U)) 543ebdf758SXuan Hu// val sSew = Cat(1.U(2.W), io.in.sew) 553ebdf758SXuan Hu// val sSew2 = Cat(1.U(2.W), (io.in.sew+1.U)) 563ebdf758SXuan Hu// val sSewf2 = Cat(1.U(2.W), (io.in.sew - 1.U)) 573ebdf758SXuan Hu// val sSewf4 = Cat(1.U(2.W), (io.in.sew - 2.U)) 583ebdf758SXuan Hu// val sSewf8 = Cat(1.U(2.W), (io.in.sew - 3.U)) 593ebdf758SXuan Hu// val mask = "b1111".U(4.W) 603ebdf758SXuan Hu// 613ebdf758SXuan Hu// val out = LookupTree(io.in.fuOpType, List( 623ebdf758SXuan Hu// // --------------------- opcode srcType2 1 vdType 63*83ba63b3SXuan Hu// VipuType.vredsum_vs -> Cat(VAluOpcode.vredsum, uSew, uSew, uSew).asUInt, 64*83ba63b3SXuan Hu// VipuType.vredmaxu_vs -> Cat(VAluOpcode.vredmax, uSew, uSew, uSew).asUInt, 65*83ba63b3SXuan Hu// VipuType.vredmax_vs -> Cat(VAluOpcode.vredmax, sSew, sSew, sSew).asUInt, 66*83ba63b3SXuan Hu// VipuType.vredminu_vs -> Cat(VAluOpcode.vredmin, uSew, uSew, uSew).asUInt, 67*83ba63b3SXuan Hu// VipuType.vredmin_vs -> Cat(VAluOpcode.vredmin, sSew, sSew, sSew).asUInt, 68*83ba63b3SXuan Hu// VipuType.vredand_vs -> Cat(VAluOpcode.vredand, uSew, uSew, uSew).asUInt, 69*83ba63b3SXuan Hu// VipuType.vredor_vs -> Cat(VAluOpcode.vredor, uSew, uSew, uSew).asUInt, 70*83ba63b3SXuan Hu// VipuType.vredxor_vs -> Cat(VAluOpcode.vredxor, uSew, uSew, uSew).asUInt, 713ebdf758SXuan Hu// 72*83ba63b3SXuan Hu// VipuType.vwredsumu_vs -> Cat(VAluOpcode.vredsum, uSew, uSew, uSew2).asUInt, 73*83ba63b3SXuan Hu// VipuType.vwredsum_vs -> Cat(VAluOpcode.vredsum, sSew, sSew, sSew2).asUInt, 743ebdf758SXuan Hu// 75*83ba63b3SXuan Hu// VipuType.vcpop_m -> Cat(VAluOpcode.vcpop, mask, mask, uSew).asUInt, 76*83ba63b3SXuan Hu// VipuType.vfirst_m -> Cat(VAluOpcode.vfirst, mask, mask, uSew).asUInt, 77*83ba63b3SXuan Hu// VipuType.vmsbf_m -> Cat(VAluOpcode.vmsbf, mask, mask, mask).asUInt, 78*83ba63b3SXuan Hu// VipuType.vmsif_m -> Cat(VAluOpcode.vmsif, mask, mask, mask).asUInt, 79*83ba63b3SXuan Hu// VipuType.vmsof_m -> Cat(VAluOpcode.vmsof, mask, mask, mask).asUInt, 803ebdf758SXuan Hu// 81*83ba63b3SXuan Hu// VipuType.viota_m -> Cat(VAluOpcode.viota, uSew, uSew, uSew).asUInt, 82*83ba63b3SXuan Hu// VipuType.vid_v -> Cat(VAluOpcode.vid, uSew, uSew, uSew).asUInt 833ebdf758SXuan Hu// 843ebdf758SXuan Hu// )).asTypeOf(new VIAluDecodeResultBundle) 853ebdf758SXuan Hu// 863ebdf758SXuan Hu// io.out <> out 873ebdf758SXuan Hu//} 883ebdf758SXuan Hu// 893ebdf758SXuan Hu//class VIAluWrapper(implicit p: Parameters) extends VPUDataModule{ 903ebdf758SXuan Hu// 913ebdf758SXuan Hu// needReverse := false.B 923ebdf758SXuan Hu// needClearMask := false.B 933ebdf758SXuan Hu// 943ebdf758SXuan Hu// // connect VIAlu 953ebdf758SXuan Hu// val decoder = Module(new VIAluDecoder) 963ebdf758SXuan Hu// val vialu = Module(new VIAlu) 973ebdf758SXuan Hu// decoder.io.in.fuOpType := in.uop.ctrl.fuOpType 983ebdf758SXuan Hu// decoder.io.in.sew := in.uop.ctrl.vconfig.vtype.vsew(1,0) 993ebdf758SXuan Hu// 1003ebdf758SXuan Hu// vialu.io.in.bits.opcode := decoder.io.out.opcode.asTypeOf(vialu.io.in.bits.opcode.cloneType) 1013ebdf758SXuan Hu// vialu.io.in.bits.info.vm := in.uop.ctrl.vm 1023ebdf758SXuan Hu// vialu.io.in.bits.info.ma := in.uop.ctrl.vconfig.vtype.vma 1033ebdf758SXuan Hu// vialu.io.in.bits.info.ta := in.uop.ctrl.vconfig.vtype.vta 1043ebdf758SXuan Hu// vialu.io.in.bits.info.vlmul := in.uop.ctrl.vconfig.vtype.vlmul 1053ebdf758SXuan Hu// vialu.io.in.bits.info.vl := in.uop.ctrl.vconfig.vl 1063ebdf758SXuan Hu// 1073ebdf758SXuan Hu// vialu.io.in.bits.info.vstart := vstart // TODO : 1083ebdf758SXuan Hu// vialu.io.in.bits.info.uopIdx := in.uop.ctrl.uopIdx 1093ebdf758SXuan Hu// 1103ebdf758SXuan Hu// vialu.io.in.bits.info.vxrm := vxrm 1113ebdf758SXuan Hu// vialu.io.in.bits.srcType(0) := decoder.io.out.srcType2 1123ebdf758SXuan Hu// vialu.io.in.bits.srcType(1) := decoder.io.out.srcType1 1133ebdf758SXuan Hu// vialu.io.in.bits.vdType := decoder.io.out.vdType 1143ebdf758SXuan Hu// val lmul = MuxLookup(in.uop.ctrl.vconfig.vtype.vlmul , 1.U(4.W), Array( 1153ebdf758SXuan Hu// "b001".U -> 2.U, 1163ebdf758SXuan Hu// "b010".U -> 4.U, 1173ebdf758SXuan Hu// "b011".U -> 8.U 1183ebdf758SXuan Hu// )) 1193ebdf758SXuan Hu// val needClearVs1 = (VipuType.vcpop_m === in.uop.ctrl.fuOpType && in.uop.ctrl.uopIdx === 0.U) || 1203ebdf758SXuan Hu// (VipuType.viota_m === in.uop.ctrl.fuOpType && in.uop.ctrl.uopIdx(log2Up(MaxUopSize)-1,1) === 0.U) || 1213ebdf758SXuan Hu// (VipuType.vid_v === in.uop.ctrl.fuOpType && in.uop.ctrl.uopIdx(log2Up(MaxUopSize)-1,1) === 0.U) // dirty code TODO: inset into IAlu 1223ebdf758SXuan Hu// val needShiftVs1 = (VipuType.vwredsumu_vs === in.uop.ctrl.fuOpType || VipuType.vwredsum_vs === in.uop.ctrl.fuOpType) && 1233ebdf758SXuan Hu// in.uop.ctrl.uopIdx < lmul 1243ebdf758SXuan Hu// vialu.io.in.bits.vs1 := Mux1H(Seq( 1253ebdf758SXuan Hu// needClearVs1 -> 0.U, 1263ebdf758SXuan Hu// needShiftVs1 -> SignExt(vs1(127,64), 128), 1273ebdf758SXuan Hu// ((!needClearVs1)&&(!needShiftVs1)) -> vs1 1283ebdf758SXuan Hu// )) 1293ebdf758SXuan Hu// vialu.io.in.bits.vs2 := vs2 1303ebdf758SXuan Hu// vialu.io.in.bits.old_vd := in.src(2) 1313ebdf758SXuan Hu// vialu.io.in.bits.mask := mask 1323ebdf758SXuan Hu// 1333ebdf758SXuan Hu// vialu.io.in.valid := io.in.valid 1343ebdf758SXuan Hu// 1353ebdf758SXuan Hu// // connect io 1363ebdf758SXuan Hu// io.out.bits.data := vialu.io.out.bits.vd 1373ebdf758SXuan Hu// vxsat := vialu.io.out.bits.vxsat 1383ebdf758SXuan Hu// io.out.valid := vialu.io.out.valid 1393ebdf758SXuan Hu//} 1403ebdf758SXuan Hu// 1413ebdf758SXuan Hu//class VIPU(implicit p: Parameters) extends VPUSubModule(p(XSCoreParamsKey).VLEN) { 1423ebdf758SXuan Hu// XSError(io.in.valid && io.in.bits.uop.ctrl.fuOpType === VipuType.dummy, "VIPU OpType not supported") 1433ebdf758SXuan Hu// override val dataModule = Seq(Module(new VIAluWrapper)) 1443ebdf758SXuan Hu// override val select = Seq( 1453ebdf758SXuan Hu// io.in.bits.uop.ctrl.fuType === FuType.vipu 1463ebdf758SXuan Hu// ) 1473ebdf758SXuan Hu// connectDataModule 1483ebdf758SXuan Hu//} 149