1d91483a6Sfdy/*************************************************************************************** 2d91483a6Sfdy * Copyright (c) 2020-2021 Institute of Computing Technology, Chinese Academy of Sciences 3d91483a6Sfdy * Copyright (c) 2020-2021 Peng Cheng Laboratory 4d91483a6Sfdy * 5d91483a6Sfdy * XiangShan is licensed under Mulan PSL v2. 6d91483a6Sfdy * You can use this software according to the terms and conditions of the Mulan PSL v2. 7d91483a6Sfdy * You may obtain a copy of Mulan PSL v2 at: 8d91483a6Sfdy * http://license.coscl.org.cn/MulanPSL2 9d91483a6Sfdy * 10d91483a6Sfdy * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, 11d91483a6Sfdy * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, 12d91483a6Sfdy * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. 13d91483a6Sfdy * 14d91483a6Sfdy * See the Mulan PSL v2 for more details. 15d91483a6Sfdy ***************************************************************************************/ 16d91483a6Sfdy 17d91483a6Sfdypackage xiangshan.backend.decode 18d91483a6Sfdy 19d91483a6Sfdyimport chipsalliance.rocketchip.config.Parameters 20d91483a6Sfdyimport chisel3._ 21d91483a6Sfdyimport chisel3.util._ 22d91483a6Sfdyimport freechips.rocketchip.rocket.Instructions 23d91483a6Sfdyimport freechips.rocketchip.util.uintToBitPat 24d91483a6Sfdyimport utils._ 25d91483a6Sfdyimport utility._ 26d91483a6Sfdyimport xiangshan.ExceptionNO.illegalInstr 27d91483a6Sfdyimport xiangshan._ 28d91483a6Sfdyimport xiangshan.backend.fu.fpu.FPU 29d91483a6Sfdyimport xiangshan.backend.fu.FuType 30d91483a6Sfdyimport freechips.rocketchip.rocket.Instructions._ 31d91483a6Sfdyimport xiangshan.backend.Bundles.{DecodedInst, StaticInst} 3298cfe81bSxgkiriimport xiangshan.backend.decode.isa.bitfield.XSInstBitFields 33b52d4755SXuan Huimport xiangshan.backend.fu.vector.Bundles.VType 34d91483a6Sfdyimport yunsuan.VpermType 35d91483a6Sfdy 36d91483a6Sfdyimport scala.collection.Seq 37d91483a6Sfdy 38d91483a6Sfdytrait VectorConstants { 39d91483a6Sfdy val MAX_VLMUL = 8 40d91483a6Sfdy val FP_TMP_REG_MV = 32 41*189ec863SzhanglyGit val VECTOR_TMP_REG_LMUL = 33 // 33~47 -> 15 42d91483a6Sfdy} 43d91483a6Sfdy 44d91483a6Sfdyclass DecodeUnitCompIO(implicit p: Parameters) extends XSBundle { 45d91483a6Sfdy val enq = new Bundle { val staticInst = Input(new StaticInst) } 46d91483a6Sfdy val vtype = Input(new VType) 47d91483a6Sfdy val isComplex = Input(Vec(DecodeWidth - 1, Bool())) 48d91483a6Sfdy val validFromIBuf = Input(Vec(DecodeWidth, Bool())) 49d91483a6Sfdy val readyFromRename = Input(Vec(RenameWidth, Bool())) 50d91483a6Sfdy val deq = new Bundle { 51d91483a6Sfdy val decodedInsts = Output(Vec(RenameWidth, new DecodedInst)) 52d91483a6Sfdy val isVset = Output(Bool()) 53d91483a6Sfdy val readyToIBuf = Output(Vec(DecodeWidth, Bool())) 54d91483a6Sfdy val validToRename = Output(Vec(RenameWidth, Bool())) 55d91483a6Sfdy val complexNum = Output(UInt(3.W)) 56d91483a6Sfdy } 57d91483a6Sfdy val csrCtrl = Input(new CustomCSRCtrlIO) 58d91483a6Sfdy} 5917ec87f2SXuan Hu 60d91483a6Sfdy/** 61d91483a6Sfdy * @author zly 62d91483a6Sfdy */ 63d91483a6Sfdyclass DecodeUnitComp()(implicit p : Parameters) extends XSModule with DecodeUnitConstants with VectorConstants { 64d91483a6Sfdy val io = IO(new DecodeUnitCompIO) 65d91483a6Sfdy 66d91483a6Sfdy val maxUopSize = MaxUopSize 67d91483a6Sfdy //input bits 68d91483a6Sfdy val staticInst = Wire(new StaticInst) 6998cfe81bSxgkiri private val inst: XSInstBitFields = staticInst.asTypeOf(new XSInstBitFields) 70d91483a6Sfdy 71d91483a6Sfdy staticInst := io.enq.staticInst 72d91483a6Sfdy 7398cfe81bSxgkiri val src1 = Cat(0.U(1.W), inst.RS1) 7498cfe81bSxgkiri val src2 = Cat(0.U(1.W), inst.RS2) 7598cfe81bSxgkiri val dest = Cat(0.U(1.W), inst.RD) 7698cfe81bSxgkiri val width = inst.RM //Vector LS eew 774ee69032SzhanglyGit val eew = Cat(0.U(1.W), width(1, 0)) 78d91483a6Sfdy 79d91483a6Sfdy //output bits 80d91483a6Sfdy val decodedInsts = Wire(Vec(RenameWidth, new DecodedInst)) 81d91483a6Sfdy val validToRename = Wire(Vec(RenameWidth, Bool())) 82d91483a6Sfdy val readyToIBuf = Wire(Vec(DecodeWidth, Bool())) 83d91483a6Sfdy val complexNum = Wire(UInt(3.W)) 84d91483a6Sfdy 85d91483a6Sfdy //output of DecodeUnit 86*189ec863SzhanglyGit val decodedInstsSimple = Wire(new DecodedInst) 87*189ec863SzhanglyGit val isVsetSimple = Wire(Bool()) 88d91483a6Sfdy 89d91483a6Sfdy //pre decode 90d91483a6Sfdy val simple = Module(new DecodeUnit) 91d91483a6Sfdy simple.io.enq.ctrlFlow := staticInst 92d91483a6Sfdy simple.io.enq.vtype := io.vtype 93d91483a6Sfdy simple.io.csrCtrl := io.csrCtrl 94*189ec863SzhanglyGit decodedInstsSimple := simple.io.deq.decodedInst 95*189ec863SzhanglyGit isVsetSimple := simple.io.deq.decodedInst.isVset 96*189ec863SzhanglyGit when(isVsetSimple) { 97d91483a6Sfdy when(dest === 0.U && src1 === 0.U) { 98*189ec863SzhanglyGit decodedInstsSimple.fuOpType := VSETOpType.keepVl(simple.io.deq.decodedInst.fuOpType) 99d91483a6Sfdy }.elsewhen(src1 === 0.U) { 100*189ec863SzhanglyGit decodedInstsSimple.fuOpType := VSETOpType.setVlmax(simple.io.deq.decodedInst.fuOpType) 101a8db15d8Sfdy } 102a8db15d8Sfdy when(io.vtype.illegal){ 103*189ec863SzhanglyGit decodedInstsSimple.flushPipe := true.B 104d91483a6Sfdy } 105d91483a6Sfdy } 106d91483a6Sfdy //Type of uop Div 107*189ec863SzhanglyGit val typeOfSplit = decodedInstsSimple.uopSplitType 108d91483a6Sfdy 1094ee69032SzhanglyGit val sew = Cat(0.U(1.W), simple.io.enq.vtype.vsew) 1104ee69032SzhanglyGit val vlmul = simple.io.enq.vtype.vlmul 1114ee69032SzhanglyGit 112d91483a6Sfdy //LMUL 113d91483a6Sfdy val lmul = MuxLookup(simple.io.enq.vtype.vlmul, 1.U(4.W), Array( 114d91483a6Sfdy "b001".U -> 2.U, 115d91483a6Sfdy "b010".U -> 4.U, 116d91483a6Sfdy "b011".U -> 8.U 117d91483a6Sfdy )) 118d91483a6Sfdy val numOfUopVslide = MuxLookup(simple.io.enq.vtype.vlmul, 1.U(log2Up(maxUopSize+1).W), Array( 119d91483a6Sfdy "b001".U -> 3.U, 120d91483a6Sfdy "b010".U -> 10.U, 121d91483a6Sfdy "b011".U -> 36.U 122d91483a6Sfdy )) 123*189ec863SzhanglyGit val numOfUopVrgather = MuxLookup(simple.io.enq.vtype.vlmul, 1.U(log2Up(maxUopSize + 1).W), Array( 124*189ec863SzhanglyGit "b001".U -> 4.U, 125*189ec863SzhanglyGit "b010".U -> 16.U, 126*189ec863SzhanglyGit "b011".U -> 64.U 127*189ec863SzhanglyGit )) 128*189ec863SzhanglyGit val numOfUopVrgatherei16 = Mux((!simple.io.enq.vtype.vsew.orR) && (simple.io.enq.vtype.vlmul =/= "b011".U), 129*189ec863SzhanglyGit Cat(numOfUopVrgather, 0.U(1.W)), 130*189ec863SzhanglyGit numOfUopVrgather 131*189ec863SzhanglyGit ) 132*189ec863SzhanglyGit val numOfUopVcompress = MuxLookup(simple.io.enq.vtype.vlmul, 1.U(4.W), Array( 133*189ec863SzhanglyGit "b001".U -> 4.U, 134*189ec863SzhanglyGit "b010".U -> 13.U, 135*189ec863SzhanglyGit "b011".U -> 43.U 136*189ec863SzhanglyGit )) 1374ee69032SzhanglyGit val vemul : UInt = eew.asUInt + 1.U + vlmul.asUInt + ~sew.asUInt 1384ee69032SzhanglyGit val emul = MuxLookup(vemul, 1.U(4.W), Array( 1394ee69032SzhanglyGit "b001".U -> 2.U, 1404ee69032SzhanglyGit "b010".U -> 4.U, 1414ee69032SzhanglyGit "b011".U -> 8.U 1424ee69032SzhanglyGit )) //TODO : eew and emul illegal exception need to be handled 1434ee69032SzhanglyGit 144d91483a6Sfdy //number of uop 145*189ec863SzhanglyGit val numOfUop = MuxLookup(typeOfSplit, 1.U(log2Up(maxUopSize+1).W), Array( 14617ec87f2SXuan Hu UopSplitType.VEC_0XV -> 2.U, 14717ec87f2SXuan Hu UopSplitType.DIR -> Mux(dest =/= 0.U, 2.U, 148d91483a6Sfdy Mux(src1 =/= 0.U, 1.U, 149*189ec863SzhanglyGit Mux(VSETOpType.isVsetvl(decodedInstsSimple.fuOpType), 2.U, 1.U))), 15017ec87f2SXuan Hu UopSplitType.VEC_VVV -> lmul, 15117ec87f2SXuan Hu UopSplitType.VEC_EXT2 -> lmul, 15217ec87f2SXuan Hu UopSplitType.VEC_EXT4 -> lmul, 15317ec87f2SXuan Hu UopSplitType.VEC_EXT8 -> lmul, 15417ec87f2SXuan Hu UopSplitType.VEC_VVM -> lmul, 15517ec87f2SXuan Hu UopSplitType.VEC_VXM -> (lmul +& 1.U), 15617ec87f2SXuan Hu UopSplitType.VEC_VXV -> (lmul +& 1.U), 15717ec87f2SXuan Hu UopSplitType.VEC_VVW -> Cat(lmul, 0.U(1.W)), // lmul <= 4 15817ec87f2SXuan Hu UopSplitType.VEC_WVW -> Cat(lmul, 0.U(1.W)), // lmul <= 4 15917ec87f2SXuan Hu UopSplitType.VEC_VXW -> Cat(lmul, 1.U(1.W)), // lmul <= 4 16017ec87f2SXuan Hu UopSplitType.VEC_WXW -> Cat(lmul, 1.U(1.W)), // lmul <= 4 16117ec87f2SXuan Hu UopSplitType.VEC_WVV -> Cat(lmul, 0.U(1.W)), // lmul <= 4 16217ec87f2SXuan Hu UopSplitType.VEC_WXV -> Cat(lmul, 1.U(1.W)), // lmul <= 4 16317ec87f2SXuan Hu UopSplitType.VEC_SLIDE1UP -> (lmul +& 1.U), 16417ec87f2SXuan Hu UopSplitType.VEC_FSLIDE1UP -> lmul, 16517ec87f2SXuan Hu UopSplitType.VEC_SLIDE1DOWN -> Cat(lmul, 0.U(1.W)), 16617ec87f2SXuan Hu UopSplitType.VEC_FSLIDE1DOWN -> (Cat(lmul, 0.U(1.W)) -1.U), 16717ec87f2SXuan Hu UopSplitType.VEC_VRED -> lmul, 16817ec87f2SXuan Hu UopSplitType.VEC_SLIDEUP -> (numOfUopVslide + 1.U), 16917ec87f2SXuan Hu UopSplitType.VEC_ISLIDEUP -> numOfUopVslide, 17017ec87f2SXuan Hu UopSplitType.VEC_SLIDEDOWN -> (numOfUopVslide + 1.U), 17117ec87f2SXuan Hu UopSplitType.VEC_ISLIDEDOWN -> numOfUopVslide, 17217ec87f2SXuan Hu UopSplitType.VEC_M0X -> (lmul +& 1.U), 17317ec87f2SXuan Hu UopSplitType.VEC_MVV -> (Cat(lmul, 0.U(1.W)) -1.U), 17417ec87f2SXuan Hu UopSplitType.VEC_M0X_VFIRST -> 2.U, 175*189ec863SzhanglyGit UopSplitType.VEC_VWW -> Cat(lmul, 0.U(1.W)), 176*189ec863SzhanglyGit UopSplitType.VEC_RGATHER -> numOfUopVrgather, 177*189ec863SzhanglyGit UopSplitType.VEC_RGATHER_VX -> (numOfUopVrgather +& 1.U), 178*189ec863SzhanglyGit UopSplitType.VEC_RGATHEREI16 -> numOfUopVrgatherei16, 1794ee69032SzhanglyGit UopSplitType.VEC_US_LD -> (emul +& 1.U), 180d91483a6Sfdy )) 181d91483a6Sfdy 182d91483a6Sfdy //uop div up to maxUopSize 183d91483a6Sfdy val csBundle = Wire(Vec(maxUopSize, new DecodedInst)) 184d91483a6Sfdy csBundle.map { case dst => 185*189ec863SzhanglyGit dst := decodedInstsSimple 186d91483a6Sfdy dst.firstUop := false.B 187d91483a6Sfdy dst.lastUop := false.B 188d91483a6Sfdy } 189d91483a6Sfdy 190f1e8fcb2SXuan Hu csBundle(0).numUops := numOfUop 191d91483a6Sfdy csBundle(0).firstUop := true.B 192d91483a6Sfdy csBundle(numOfUop - 1.U).lastUop := true.B 193d91483a6Sfdy 194*189ec863SzhanglyGit switch(typeOfSplit) { 19517ec87f2SXuan Hu is(UopSplitType.DIR) { 196*189ec863SzhanglyGit when(isVsetSimple) { 197d91483a6Sfdy when(dest =/= 0.U) { 198d91483a6Sfdy csBundle(0).fuType := FuType.vsetiwi.U 199*189ec863SzhanglyGit csBundle(0).fuOpType := VSETOpType.switchDest(decodedInstsSimple.fuOpType) 200d91483a6Sfdy csBundle(0).flushPipe := false.B 201d91483a6Sfdy csBundle(0).rfWen := true.B 202d91483a6Sfdy csBundle(0).vecWen := false.B 203cb10a55bSXuan Hu csBundle(1).ldest := VCONFIG_IDX.U 204fe60541bSXuan Hu csBundle(1).rfWen := false.B 205fe60541bSXuan Hu csBundle(1).vecWen := true.B 206d91483a6Sfdy }.elsewhen(src1 =/= 0.U) { 207cb10a55bSXuan Hu csBundle(0).ldest := VCONFIG_IDX.U 208*189ec863SzhanglyGit }.elsewhen(VSETOpType.isVsetvli(decodedInstsSimple.fuOpType)) { 209d91483a6Sfdy csBundle(0).fuType := FuType.vsetfwf.U 210d91483a6Sfdy csBundle(0).srcType(0) := SrcType.vp 211cb10a55bSXuan Hu csBundle(0).lsrc(0) := VCONFIG_IDX.U 212*189ec863SzhanglyGit }.elsewhen(VSETOpType.isVsetvl(decodedInstsSimple.fuOpType)) { 213d91483a6Sfdy csBundle(0).srcType(0) := SrcType.reg 214d91483a6Sfdy csBundle(0).srcType(1) := SrcType.imm 215d91483a6Sfdy csBundle(0).lsrc(1) := 0.U 216d91483a6Sfdy csBundle(0).ldest := FP_TMP_REG_MV.U 217d91483a6Sfdy csBundle(0).fuType := FuType.i2f.U 218d91483a6Sfdy csBundle(0).rfWen := false.B 219d91483a6Sfdy csBundle(0).fpWen := true.B 220d91483a6Sfdy csBundle(0).vecWen := false.B 221d91483a6Sfdy csBundle(0).fpu.isAddSub := false.B 222d91483a6Sfdy csBundle(0).fpu.typeTagIn := FPU.D 223d91483a6Sfdy csBundle(0).fpu.typeTagOut := FPU.D 224d91483a6Sfdy csBundle(0).fpu.fromInt := true.B 225d91483a6Sfdy csBundle(0).fpu.wflags := false.B 226d91483a6Sfdy csBundle(0).fpu.fpWen := true.B 227d91483a6Sfdy csBundle(0).fpu.div := false.B 228d91483a6Sfdy csBundle(0).fpu.sqrt := false.B 229d91483a6Sfdy csBundle(0).fpu.fcvt := false.B 230d91483a6Sfdy csBundle(0).flushPipe := false.B 231d91483a6Sfdy csBundle(1).fuType := FuType.vsetfwf.U 232d91483a6Sfdy csBundle(1).srcType(0) := SrcType.vp 233cb10a55bSXuan Hu csBundle(1).lsrc(0) := VCONFIG_IDX.U 234d91483a6Sfdy csBundle(1).srcType(1) := SrcType.fp 235d91483a6Sfdy csBundle(1).lsrc(1) := FP_TMP_REG_MV.U 236cb10a55bSXuan Hu csBundle(1).ldest := VCONFIG_IDX.U 237d91483a6Sfdy } 238d91483a6Sfdy } 239d91483a6Sfdy } 24017ec87f2SXuan Hu is(UopSplitType.VEC_VVV) { 241d91483a6Sfdy for (i <- 0 until MAX_VLMUL) { 242d91483a6Sfdy csBundle(i).lsrc(0) := src1 + i.U 243d91483a6Sfdy csBundle(i).lsrc(1) := src2 + i.U 244d91483a6Sfdy csBundle(i).lsrc(2) := dest + i.U 245d91483a6Sfdy csBundle(i).ldest := dest + i.U 246d91483a6Sfdy csBundle(i).uopIdx := i.U 247d91483a6Sfdy } 248d91483a6Sfdy } 24917ec87f2SXuan Hu is(UopSplitType.VEC_EXT2) { 250d91483a6Sfdy for (i <- 0 until MAX_VLMUL / 2) { 251d91483a6Sfdy csBundle(2 * i).lsrc(1) := src2 + i.U 252d91483a6Sfdy csBundle(2 * i).lsrc(2) := dest + (2 * i).U 253d91483a6Sfdy csBundle(2 * i).ldest := dest + (2 * i).U 254d91483a6Sfdy csBundle(2 * i).uopIdx := (2 * i).U 255d91483a6Sfdy csBundle(2 * i + 1).lsrc(1) := src2 + i.U 256d91483a6Sfdy csBundle(2 * i + 1).lsrc(2) := dest + (2 * i + 1).U 257d91483a6Sfdy csBundle(2 * i + 1).ldest := dest + (2 * i + 1).U 258d91483a6Sfdy csBundle(2 * i + 1).uopIdx := (2 * i + 1).U 259d91483a6Sfdy } 260d91483a6Sfdy } 26117ec87f2SXuan Hu is(UopSplitType.VEC_EXT4) { 262d91483a6Sfdy for (i <- 0 until MAX_VLMUL / 4) { 263d91483a6Sfdy csBundle(4 * i).lsrc(1) := src2 + i.U 264d91483a6Sfdy csBundle(4 * i).lsrc(2) := dest + (4 * i).U 265d91483a6Sfdy csBundle(4 * i).ldest := dest + (4 * i).U 266d91483a6Sfdy csBundle(4 * i).uopIdx := (4 * i).U 267d91483a6Sfdy csBundle(4 * i + 1).lsrc(1) := src2 + i.U 268d91483a6Sfdy csBundle(4 * i + 1).lsrc(2) := dest + (4 * i + 1).U 269d91483a6Sfdy csBundle(4 * i + 1).ldest := dest + (4 * i + 1).U 270d91483a6Sfdy csBundle(4 * i + 1).uopIdx := (4 * i + 1).U 271d91483a6Sfdy csBundle(4 * i + 2).lsrc(1) := src2 + i.U 272d91483a6Sfdy csBundle(4 * i + 2).lsrc(2) := dest + (4 * i + 2).U 273d91483a6Sfdy csBundle(4 * i + 2).ldest := dest + (4 * i + 2).U 274d91483a6Sfdy csBundle(4 * i + 2).uopIdx := (4 * i + 2).U 275d91483a6Sfdy csBundle(4 * i + 3).lsrc(1) := src2 + i.U 276d91483a6Sfdy csBundle(4 * i + 3).lsrc(2) := dest + (4 * i + 3).U 277d91483a6Sfdy csBundle(4 * i + 3).ldest := dest + (4 * i + 3).U 278d91483a6Sfdy csBundle(4 * i + 3).uopIdx := (4 * i + 3).U 279d91483a6Sfdy } 280d91483a6Sfdy } 28117ec87f2SXuan Hu is(UopSplitType.VEC_EXT8) { 282d91483a6Sfdy for (i <- 0 until MAX_VLMUL) { 283d91483a6Sfdy csBundle(i).lsrc(1) := src2 284d91483a6Sfdy csBundle(i).lsrc(2) := dest + i.U 285d91483a6Sfdy csBundle(i).ldest := dest + i.U 286d91483a6Sfdy csBundle(i).uopIdx := i.U 287d91483a6Sfdy } 288d91483a6Sfdy } 28917ec87f2SXuan Hu is(UopSplitType.VEC_0XV) { 290d91483a6Sfdy /* 291d91483a6Sfdy FMV.D.X 292d91483a6Sfdy */ 293d91483a6Sfdy csBundle(0).srcType(0) := SrcType.reg 294d91483a6Sfdy csBundle(0).srcType(1) := SrcType.imm 295d91483a6Sfdy csBundle(0).lsrc(1) := 0.U 296d91483a6Sfdy csBundle(0).ldest := FP_TMP_REG_MV.U 297d91483a6Sfdy csBundle(0).fuType := FuType.i2f.U 298d91483a6Sfdy csBundle(0).rfWen := false.B 299d91483a6Sfdy csBundle(0).fpWen := true.B 300d91483a6Sfdy csBundle(0).vecWen := false.B 301d91483a6Sfdy csBundle(0).fpu.isAddSub := false.B 302d91483a6Sfdy csBundle(0).fpu.typeTagIn := FPU.D 303d91483a6Sfdy csBundle(0).fpu.typeTagOut := FPU.D 304d91483a6Sfdy csBundle(0).fpu.fromInt := true.B 305d91483a6Sfdy csBundle(0).fpu.wflags := false.B 306d91483a6Sfdy csBundle(0).fpu.fpWen := true.B 307d91483a6Sfdy csBundle(0).fpu.div := false.B 308d91483a6Sfdy csBundle(0).fpu.sqrt := false.B 309d91483a6Sfdy csBundle(0).fpu.fcvt := false.B 310d91483a6Sfdy /* 311d91483a6Sfdy vfmv.s.f 312d91483a6Sfdy */ 313d91483a6Sfdy csBundle(1).srcType(0) := SrcType.fp 314d91483a6Sfdy csBundle(1).srcType(1) := SrcType.vp 315d91483a6Sfdy csBundle(1).srcType(2) := SrcType.vp 316d91483a6Sfdy csBundle(1).lsrc(0) := FP_TMP_REG_MV.U 317d91483a6Sfdy csBundle(1).lsrc(1) := 0.U 318d91483a6Sfdy csBundle(1).lsrc(2) := dest 319d91483a6Sfdy csBundle(1).ldest := dest 320d91483a6Sfdy csBundle(1).fuType := FuType.vppu.U 32117ec87f2SXuan Hu csBundle(1).fuOpType := VpermType.dummy 322d91483a6Sfdy csBundle(1).rfWen := false.B 323d91483a6Sfdy csBundle(1).fpWen := false.B 324d91483a6Sfdy csBundle(1).vecWen := true.B 325d91483a6Sfdy } 32617ec87f2SXuan Hu is(UopSplitType.VEC_VXV) { 327d91483a6Sfdy /* 328d91483a6Sfdy FMV.D.X 329d91483a6Sfdy */ 330d91483a6Sfdy csBundle(0).srcType(0) := SrcType.reg 331d91483a6Sfdy csBundle(0).srcType(1) := SrcType.imm 332d91483a6Sfdy csBundle(0).lsrc(1) := 0.U 333d91483a6Sfdy csBundle(0).ldest := FP_TMP_REG_MV.U 334d91483a6Sfdy csBundle(0).fuType := FuType.i2f.U 335d91483a6Sfdy csBundle(0).rfWen := false.B 336d91483a6Sfdy csBundle(0).fpWen := true.B 337d91483a6Sfdy csBundle(0).vecWen := false.B 338d91483a6Sfdy csBundle(0).fpu.isAddSub := false.B 339d91483a6Sfdy csBundle(0).fpu.typeTagIn := FPU.D 340d91483a6Sfdy csBundle(0).fpu.typeTagOut := FPU.D 341d91483a6Sfdy csBundle(0).fpu.fromInt := true.B 342d91483a6Sfdy csBundle(0).fpu.wflags := false.B 343d91483a6Sfdy csBundle(0).fpu.fpWen := true.B 344d91483a6Sfdy csBundle(0).fpu.div := false.B 345d91483a6Sfdy csBundle(0).fpu.sqrt := false.B 346d91483a6Sfdy csBundle(0).fpu.fcvt := false.B 347d91483a6Sfdy /* 348d91483a6Sfdy LMUL 349d91483a6Sfdy */ 350d91483a6Sfdy for (i <- 0 until MAX_VLMUL) { 351d91483a6Sfdy csBundle(i + 1).srcType(0) := SrcType.fp 352d91483a6Sfdy csBundle(i + 1).lsrc(0) := FP_TMP_REG_MV.U 353d91483a6Sfdy csBundle(i + 1).lsrc(1) := src2 + i.U 354d91483a6Sfdy csBundle(i + 1).lsrc(2) := dest + i.U 355d91483a6Sfdy csBundle(i + 1).ldest := dest + i.U 356d91483a6Sfdy csBundle(i + 1).uopIdx := i.U 357d91483a6Sfdy } 358d91483a6Sfdy } 35917ec87f2SXuan Hu is(UopSplitType.VEC_VVW) { 360d91483a6Sfdy for (i <- 0 until MAX_VLMUL / 2) { 361d91483a6Sfdy csBundle(2 * i).lsrc(0) := src1 + i.U 362d91483a6Sfdy csBundle(2 * i).lsrc(1) := src2 + i.U 363d91483a6Sfdy csBundle(2 * i).lsrc(2) := dest + (2 * i).U 364d91483a6Sfdy csBundle(2 * i).ldest := dest + (2 * i).U 365d91483a6Sfdy csBundle(2 * i).uopIdx := (2 * i).U 366d91483a6Sfdy csBundle(2 * i + 1).lsrc(0) := src1 + i.U 367d91483a6Sfdy csBundle(2 * i + 1).lsrc(1) := src2 + i.U 368d91483a6Sfdy csBundle(2 * i + 1).lsrc(2) := dest + (2 * i + 1).U 369d91483a6Sfdy csBundle(2 * i + 1).ldest := dest + (2 * i + 1).U 370d91483a6Sfdy csBundle(2 * i + 1).uopIdx := (2 * i + 1).U 371d91483a6Sfdy } 372d91483a6Sfdy } 37317ec87f2SXuan Hu is(UopSplitType.VEC_WVW) { 374d91483a6Sfdy for (i <- 0 until MAX_VLMUL / 2) { 375d91483a6Sfdy csBundle(2 * i).lsrc(0) := src1 + i.U 376d91483a6Sfdy csBundle(2 * i).lsrc(1) := src2 + (2 * i).U 377d91483a6Sfdy csBundle(2 * i).lsrc(2) := dest + (2 * i).U 378d91483a6Sfdy csBundle(2 * i).ldest := dest + (2 * i).U 379d91483a6Sfdy csBundle(2 * i).uopIdx := (2 * i).U 380d91483a6Sfdy csBundle(2 * i + 1).lsrc(0) := src1 + i.U 381d91483a6Sfdy csBundle(2 * i + 1).lsrc(1) := src2 + (2 * i + 1).U 382d91483a6Sfdy csBundle(2 * i + 1).lsrc(2) := dest + (2 * i + 1).U 383d91483a6Sfdy csBundle(2 * i + 1).ldest := dest + (2 * i + 1).U 384d91483a6Sfdy csBundle(2 * i + 1).uopIdx := (2 * i + 1).U 385d91483a6Sfdy } 386d91483a6Sfdy } 38717ec87f2SXuan Hu is(UopSplitType.VEC_VXW) { 388d91483a6Sfdy /* 389d91483a6Sfdy FMV.D.X 390d91483a6Sfdy */ 391d91483a6Sfdy csBundle(0).srcType(0) := SrcType.reg 392d91483a6Sfdy csBundle(0).srcType(1) := SrcType.imm 393d91483a6Sfdy csBundle(0).lsrc(1) := 0.U 394d91483a6Sfdy csBundle(0).ldest := FP_TMP_REG_MV.U 395d91483a6Sfdy csBundle(0).fuType := FuType.i2f.U 396d91483a6Sfdy csBundle(0).rfWen := false.B 397d91483a6Sfdy csBundle(0).fpWen := true.B 398d91483a6Sfdy csBundle(0).vecWen := false.B 399d91483a6Sfdy csBundle(0).fpu.isAddSub := false.B 400d91483a6Sfdy csBundle(0).fpu.typeTagIn := FPU.D 401d91483a6Sfdy csBundle(0).fpu.typeTagOut := FPU.D 402d91483a6Sfdy csBundle(0).fpu.fromInt := true.B 403d91483a6Sfdy csBundle(0).fpu.wflags := false.B 404d91483a6Sfdy csBundle(0).fpu.fpWen := true.B 405d91483a6Sfdy csBundle(0).fpu.div := false.B 406d91483a6Sfdy csBundle(0).fpu.sqrt := false.B 407d91483a6Sfdy csBundle(0).fpu.fcvt := false.B 408d91483a6Sfdy 409d91483a6Sfdy for (i <- 0 until MAX_VLMUL / 2) { 410d91483a6Sfdy csBundle(2 * i + 1).srcType(0) := SrcType.fp 411d91483a6Sfdy csBundle(2 * i + 1).lsrc(0) := FP_TMP_REG_MV.U 412d91483a6Sfdy csBundle(2 * i + 1).lsrc(1) := src2 + i.U 413d91483a6Sfdy csBundle(2 * i + 1).lsrc(2) := dest + (2 * i).U 414d91483a6Sfdy csBundle(2 * i + 1).ldest := dest + (2 * i).U 415d91483a6Sfdy csBundle(2 * i + 1).uopIdx := (2 * i).U 416d91483a6Sfdy csBundle(2 * i + 2).srcType(0) := SrcType.fp 417d91483a6Sfdy csBundle(2 * i + 2).lsrc(0) := FP_TMP_REG_MV.U 418d91483a6Sfdy csBundle(2 * i + 2).lsrc(1) := src2 + i.U 419d91483a6Sfdy csBundle(2 * i + 2).lsrc(2) := dest + (2 * i + 1).U 420d91483a6Sfdy csBundle(2 * i + 2).ldest := dest + (2 * i + 1).U 421d91483a6Sfdy csBundle(2 * i + 2).uopIdx := (2 * i + 1).U 422d91483a6Sfdy } 423d91483a6Sfdy } 42417ec87f2SXuan Hu is(UopSplitType.VEC_WXW) { 425d91483a6Sfdy /* 426d91483a6Sfdy FMV.D.X 427d91483a6Sfdy */ 428d91483a6Sfdy csBundle(0).srcType(0) := SrcType.reg 429d91483a6Sfdy csBundle(0).srcType(1) := SrcType.imm 430d91483a6Sfdy csBundle(0).lsrc(1) := 0.U 431d91483a6Sfdy csBundle(0).ldest := FP_TMP_REG_MV.U 432d91483a6Sfdy csBundle(0).fuType := FuType.i2f.U 433d91483a6Sfdy csBundle(0).rfWen := false.B 434d91483a6Sfdy csBundle(0).fpWen := true.B 435d91483a6Sfdy csBundle(0).vecWen := false.B 436d91483a6Sfdy csBundle(0).fpu.isAddSub := false.B 437d91483a6Sfdy csBundle(0).fpu.typeTagIn := FPU.D 438d91483a6Sfdy csBundle(0).fpu.typeTagOut := FPU.D 439d91483a6Sfdy csBundle(0).fpu.fromInt := true.B 440d91483a6Sfdy csBundle(0).fpu.wflags := false.B 441d91483a6Sfdy csBundle(0).fpu.fpWen := true.B 442d91483a6Sfdy csBundle(0).fpu.div := false.B 443d91483a6Sfdy csBundle(0).fpu.sqrt := false.B 444d91483a6Sfdy csBundle(0).fpu.fcvt := false.B 445d91483a6Sfdy 446d91483a6Sfdy for (i <- 0 until MAX_VLMUL / 2) { 447d91483a6Sfdy csBundle(2 * i + 1).srcType(0) := SrcType.fp 448d91483a6Sfdy csBundle(2 * i + 1).lsrc(0) := FP_TMP_REG_MV.U 449d91483a6Sfdy csBundle(2 * i + 1).lsrc(1) := src2 + (2 * i).U 450d91483a6Sfdy csBundle(2 * i + 1).lsrc(2) := dest + (2 * i).U 451d91483a6Sfdy csBundle(2 * i + 1).ldest := dest + (2 * i).U 452d91483a6Sfdy csBundle(2 * i + 1).uopIdx := (2 * i).U 453d91483a6Sfdy csBundle(2 * i + 2).srcType(0) := SrcType.fp 454d91483a6Sfdy csBundle(2 * i + 2).lsrc(0) := FP_TMP_REG_MV.U 455d91483a6Sfdy csBundle(2 * i + 2).lsrc(1) := src2 + (2 * i + 1).U 456d91483a6Sfdy csBundle(2 * i + 2).lsrc(2) := dest + (2 * i + 1).U 457d91483a6Sfdy csBundle(2 * i + 2).ldest := dest + (2 * i + 1).U 458d91483a6Sfdy csBundle(2 * i + 2).uopIdx := (2 * i + 1).U 459d91483a6Sfdy } 460d91483a6Sfdy } 46117ec87f2SXuan Hu is(UopSplitType.VEC_WVV) { 462d91483a6Sfdy for (i <- 0 until MAX_VLMUL / 2) { 463d91483a6Sfdy 464d91483a6Sfdy csBundle(2 * i).lsrc(0) := src1 + i.U 465d91483a6Sfdy csBundle(2 * i).lsrc(1) := src2 + (2 * i).U 466d91483a6Sfdy csBundle(2 * i).lsrc(2) := dest + i.U 467d6f9198fSXuan Hu csBundle(2 * i).ldest := dest + i.U 468d91483a6Sfdy csBundle(2 * i).uopIdx := (2 * i).U 469d91483a6Sfdy csBundle(2 * i + 1).lsrc(0) := src1 + i.U 470d91483a6Sfdy csBundle(2 * i + 1).lsrc(1) := src2 + (2 * i + 1).U 471d6f9198fSXuan Hu csBundle(2 * i + 1).lsrc(2) := dest + i.U 472d91483a6Sfdy csBundle(2 * i + 1).ldest := dest + i.U 473d91483a6Sfdy csBundle(2 * i + 1).uopIdx := (2 * i + 1).U 474d91483a6Sfdy } 475d91483a6Sfdy } 47617ec87f2SXuan Hu is(UopSplitType.VEC_WXV) { 477d91483a6Sfdy /* 478d91483a6Sfdy FMV.D.X 479d91483a6Sfdy */ 480d91483a6Sfdy csBundle(0).srcType(0) := SrcType.reg 481d91483a6Sfdy csBundle(0).srcType(1) := SrcType.imm 482d91483a6Sfdy csBundle(0).lsrc(1) := 0.U 483d91483a6Sfdy csBundle(0).ldest := FP_TMP_REG_MV.U 484d91483a6Sfdy csBundle(0).fuType := FuType.i2f.U 485d91483a6Sfdy csBundle(0).rfWen := false.B 486d91483a6Sfdy csBundle(0).fpWen := true.B 487d91483a6Sfdy csBundle(0).vecWen := false.B 488d91483a6Sfdy csBundle(0).fpu.isAddSub := false.B 489d91483a6Sfdy csBundle(0).fpu.typeTagIn := FPU.D 490d91483a6Sfdy csBundle(0).fpu.typeTagOut := FPU.D 491d91483a6Sfdy csBundle(0).fpu.fromInt := true.B 492d91483a6Sfdy csBundle(0).fpu.wflags := false.B 493d91483a6Sfdy csBundle(0).fpu.fpWen := true.B 494d91483a6Sfdy csBundle(0).fpu.div := false.B 495d91483a6Sfdy csBundle(0).fpu.sqrt := false.B 496d91483a6Sfdy csBundle(0).fpu.fcvt := false.B 497d91483a6Sfdy 498d91483a6Sfdy for (i <- 0 until MAX_VLMUL / 2) { 499d91483a6Sfdy csBundle(2 * i + 1).srcType(0) := SrcType.fp 500d91483a6Sfdy csBundle(2 * i + 1).lsrc(0) := FP_TMP_REG_MV.U 501d91483a6Sfdy csBundle(2 * i + 1).lsrc(1) := src2 + (2 * i).U 502d91483a6Sfdy csBundle(2 * i + 1).lsrc(2) := dest + i.U 503d6f9198fSXuan Hu csBundle(2 * i + 1).ldest := dest + i.U 504d91483a6Sfdy csBundle(2 * i + 1).uopIdx := (2 * i).U 505d91483a6Sfdy csBundle(2 * i + 2).srcType(0) := SrcType.fp 506d91483a6Sfdy csBundle(2 * i + 2).lsrc(0) := FP_TMP_REG_MV.U 507d91483a6Sfdy csBundle(2 * i + 2).lsrc(1) := src2 + (2 * i + 1).U 508d6f9198fSXuan Hu csBundle(2 * i + 2).lsrc(2) := dest + i.U 509d91483a6Sfdy csBundle(2 * i + 2).ldest := dest + i.U 510d91483a6Sfdy csBundle(2 * i + 2).uopIdx := (2 * i + 1).U 511d91483a6Sfdy } 512d91483a6Sfdy } 51317ec87f2SXuan Hu is(UopSplitType.VEC_VVM) { 514d91483a6Sfdy csBundle(0).lsrc(2) := dest 515d6f9198fSXuan Hu csBundle(0).ldest := dest 516d91483a6Sfdy csBundle(0).uopIdx := 0.U 517d91483a6Sfdy for (i <- 1 until MAX_VLMUL) { 518d91483a6Sfdy csBundle(i).lsrc(0) := src1 + i.U 519d91483a6Sfdy csBundle(i).lsrc(1) := src2 + i.U 520d6f9198fSXuan Hu csBundle(i).lsrc(2) := dest 521d6f9198fSXuan Hu csBundle(i).ldest := dest 522d91483a6Sfdy csBundle(i).uopIdx := i.U 523d91483a6Sfdy } 524d91483a6Sfdy csBundle(numOfUop - 1.U).ldest := dest 525d91483a6Sfdy } 52617ec87f2SXuan Hu is(UopSplitType.VEC_VXM) { 527d91483a6Sfdy /* 528d91483a6Sfdy FMV.D.X 529d91483a6Sfdy */ 530d91483a6Sfdy csBundle(0).srcType(0) := SrcType.reg 531d91483a6Sfdy csBundle(0).srcType(1) := SrcType.imm 532d91483a6Sfdy csBundle(0).lsrc(1) := 0.U 533d91483a6Sfdy csBundle(0).ldest := FP_TMP_REG_MV.U 534d91483a6Sfdy csBundle(0).fuType := FuType.i2f.U 535d91483a6Sfdy csBundle(0).rfWen := false.B 536d91483a6Sfdy csBundle(0).fpWen := true.B 537d91483a6Sfdy csBundle(0).vecWen := false.B 538d91483a6Sfdy csBundle(0).fpu.isAddSub := false.B 539d91483a6Sfdy csBundle(0).fpu.typeTagIn := FPU.D 540d91483a6Sfdy csBundle(0).fpu.typeTagOut := FPU.D 541d91483a6Sfdy csBundle(0).fpu.fromInt := true.B 542d91483a6Sfdy csBundle(0).fpu.wflags := false.B 543d91483a6Sfdy csBundle(0).fpu.fpWen := true.B 544d91483a6Sfdy csBundle(0).fpu.div := false.B 545d91483a6Sfdy csBundle(0).fpu.sqrt := false.B 546d91483a6Sfdy csBundle(0).fpu.fcvt := false.B 547d91483a6Sfdy //LMUL 548d91483a6Sfdy csBundle(1).srcType(0) := SrcType.fp 549d91483a6Sfdy csBundle(1).lsrc(0) := FP_TMP_REG_MV.U 550d91483a6Sfdy csBundle(1).lsrc(2) := dest 551d6f9198fSXuan Hu csBundle(1).ldest := dest 552d91483a6Sfdy csBundle(1).uopIdx := 0.U 553d91483a6Sfdy for (i <- 1 until MAX_VLMUL) { 554d91483a6Sfdy csBundle(i + 1).srcType(0) := SrcType.fp 555d91483a6Sfdy csBundle(i + 1).lsrc(0) := FP_TMP_REG_MV.U 556d91483a6Sfdy csBundle(i + 1).lsrc(1) := src2 + i.U 557d6f9198fSXuan Hu csBundle(i + 1).lsrc(2) := dest 558d6f9198fSXuan Hu csBundle(i + 1).ldest := dest 559d91483a6Sfdy csBundle(i + 1).uopIdx := i.U 560d91483a6Sfdy } 561d91483a6Sfdy csBundle(numOfUop - 1.U).ldest := dest 562d91483a6Sfdy } 56317ec87f2SXuan Hu is(UopSplitType.VEC_SLIDE1UP) { 564d91483a6Sfdy /* 565d91483a6Sfdy FMV.D.X 566d91483a6Sfdy */ 567d91483a6Sfdy csBundle(0).srcType(0) := SrcType.reg 568d91483a6Sfdy csBundle(0).srcType(1) := SrcType.imm 569d91483a6Sfdy csBundle(0).lsrc(1) := 0.U 570d91483a6Sfdy csBundle(0).ldest := FP_TMP_REG_MV.U 571d91483a6Sfdy csBundle(0).fuType := FuType.i2f.U 572d91483a6Sfdy csBundle(0).rfWen := false.B 573d91483a6Sfdy csBundle(0).fpWen := true.B 574d91483a6Sfdy csBundle(0).vecWen := false.B 575d91483a6Sfdy csBundle(0).fpu.isAddSub := false.B 576d91483a6Sfdy csBundle(0).fpu.typeTagIn := FPU.D 577d91483a6Sfdy csBundle(0).fpu.typeTagOut := FPU.D 578d91483a6Sfdy csBundle(0).fpu.fromInt := true.B 579d91483a6Sfdy csBundle(0).fpu.wflags := false.B 580d91483a6Sfdy csBundle(0).fpu.fpWen := true.B 581d91483a6Sfdy csBundle(0).fpu.div := false.B 582d91483a6Sfdy csBundle(0).fpu.sqrt := false.B 583d91483a6Sfdy csBundle(0).fpu.fcvt := false.B 584d91483a6Sfdy //LMUL 585d91483a6Sfdy csBundle(1).srcType(0) := SrcType.fp 586d91483a6Sfdy csBundle(1).lsrc(0) := FP_TMP_REG_MV.U 587d91483a6Sfdy csBundle(1).lsrc(2) := dest 588d91483a6Sfdy csBundle(1).ldest := dest 589d91483a6Sfdy csBundle(1).uopIdx := 0.U 590d91483a6Sfdy for (i <- 1 until MAX_VLMUL) { 591d91483a6Sfdy csBundle(i + 1).srcType(0) := SrcType.vp 592d91483a6Sfdy csBundle(i + 1).lsrc(0) := src2 + (i - 1).U 593d91483a6Sfdy csBundle(i + 1).lsrc(1) := src2 + i.U 594d91483a6Sfdy csBundle(i + 1).lsrc(2) := dest + i.U 595d91483a6Sfdy csBundle(i + 1).ldest := dest + i.U 596d91483a6Sfdy csBundle(i + 1).uopIdx := i.U 597d91483a6Sfdy } 598d91483a6Sfdy } 59917ec87f2SXuan Hu is(UopSplitType.VEC_FSLIDE1UP) { 600d91483a6Sfdy //LMUL 601d91483a6Sfdy csBundle(0).srcType(0) := SrcType.fp 602d91483a6Sfdy csBundle(0).lsrc(0) := src1 603d91483a6Sfdy csBundle(0).lsrc(1) := src2 604d91483a6Sfdy csBundle(0).lsrc(2) := dest 605d91483a6Sfdy csBundle(0).ldest := dest 606d91483a6Sfdy csBundle(0).uopIdx := 0.U 607d91483a6Sfdy for (i <- 1 until MAX_VLMUL) { 608d91483a6Sfdy csBundle(i).srcType(0) := SrcType.vp 609d91483a6Sfdy csBundle(i).lsrc(0) := src2 + (i - 1).U 610d91483a6Sfdy csBundle(i).lsrc(1) := src2 + i.U 611d91483a6Sfdy csBundle(i).lsrc(2) := dest + i.U 612d91483a6Sfdy csBundle(i).ldest := dest + i.U 613d91483a6Sfdy csBundle(i).uopIdx := i.U 614d91483a6Sfdy } 615d91483a6Sfdy } 61617ec87f2SXuan Hu is(UopSplitType.VEC_SLIDE1DOWN) { // lmul+lmul = 16 617d91483a6Sfdy /* 618d91483a6Sfdy FMV.D.X 619d91483a6Sfdy */ 620d91483a6Sfdy csBundle(0).srcType(0) := SrcType.reg 621d91483a6Sfdy csBundle(0).srcType(1) := SrcType.imm 622d91483a6Sfdy csBundle(0).lsrc(1) := 0.U 623d91483a6Sfdy csBundle(0).ldest := FP_TMP_REG_MV.U 624d91483a6Sfdy csBundle(0).fuType := FuType.i2f.U 625d91483a6Sfdy csBundle(0).rfWen := false.B 626d91483a6Sfdy csBundle(0).fpWen := true.B 627d91483a6Sfdy csBundle(0).vecWen := false.B 628d91483a6Sfdy csBundle(0).fpu.isAddSub := false.B 629d91483a6Sfdy csBundle(0).fpu.typeTagIn := FPU.D 630d91483a6Sfdy csBundle(0).fpu.typeTagOut := FPU.D 631d91483a6Sfdy csBundle(0).fpu.fromInt := true.B 632d91483a6Sfdy csBundle(0).fpu.wflags := false.B 633d91483a6Sfdy csBundle(0).fpu.fpWen := true.B 634d91483a6Sfdy csBundle(0).fpu.div := false.B 635d91483a6Sfdy csBundle(0).fpu.sqrt := false.B 636d91483a6Sfdy csBundle(0).fpu.fcvt := false.B 637d91483a6Sfdy //LMUL 638d91483a6Sfdy for (i <- 0 until MAX_VLMUL) { 639d91483a6Sfdy csBundle(2 * i + 1).srcType(0) := SrcType.vp 640d91483a6Sfdy csBundle(2 * i + 1).srcType(1) := SrcType.vp 641d91483a6Sfdy csBundle(2 * i + 1).lsrc(0) := src2 + (i + 1).U 642d91483a6Sfdy csBundle(2 * i + 1).lsrc(1) := src2 + i.U 643d91483a6Sfdy csBundle(2 * i + 1).lsrc(2) := dest + i.U 644d91483a6Sfdy csBundle(2 * i + 1).ldest := VECTOR_TMP_REG_LMUL.U 645d91483a6Sfdy csBundle(2 * i + 1).uopIdx := (2 * i).U 646d91483a6Sfdy if (2 * i + 2 < MAX_VLMUL * 2) { 647d91483a6Sfdy csBundle(2 * i + 2).srcType(0) := SrcType.fp 648d91483a6Sfdy csBundle(2 * i + 2).lsrc(0) := FP_TMP_REG_MV.U 649d91483a6Sfdy // csBundle(2 * i + 2).lsrc(1) := src2 + i.U // DontCare 650d91483a6Sfdy csBundle(2 * i + 2).lsrc(2) := VECTOR_TMP_REG_LMUL.U 651d91483a6Sfdy csBundle(2 * i + 2).ldest := dest + i.U 652d91483a6Sfdy csBundle(2 * i + 2).uopIdx := (2 * i + 1).U 653d91483a6Sfdy } 654d91483a6Sfdy } 655d91483a6Sfdy csBundle(numOfUop - 1.U).srcType(0) := SrcType.fp 656d91483a6Sfdy csBundle(numOfUop - 1.U).lsrc(0) := FP_TMP_REG_MV.U 657d91483a6Sfdy csBundle(numOfUop - 1.U).ldest := dest + lmul - 1.U 658d91483a6Sfdy } 65917ec87f2SXuan Hu is(UopSplitType.VEC_FSLIDE1DOWN) { 660d91483a6Sfdy //LMUL 661d91483a6Sfdy for (i <- 0 until MAX_VLMUL) { 662d91483a6Sfdy csBundle(2 * i).srcType(0) := SrcType.vp 663d91483a6Sfdy csBundle(2 * i).srcType(1) := SrcType.vp 664d91483a6Sfdy csBundle(2 * i).lsrc(0) := src2 + (i + 1).U 665d91483a6Sfdy csBundle(2 * i).lsrc(1) := src2 + i.U 666d91483a6Sfdy csBundle(2 * i).lsrc(2) := dest + i.U 667d91483a6Sfdy csBundle(2 * i).ldest := VECTOR_TMP_REG_LMUL.U 668d91483a6Sfdy csBundle(2 * i).uopIdx := (2 * i).U 669d91483a6Sfdy csBundle(2 * i + 1).srcType(0) := SrcType.fp 670d91483a6Sfdy csBundle(2 * i + 1).lsrc(0) := src1 671d91483a6Sfdy csBundle(2 * i + 1).lsrc(2) := VECTOR_TMP_REG_LMUL.U 672d91483a6Sfdy csBundle(2 * i + 1).ldest := dest + i.U 673d91483a6Sfdy csBundle(2 * i + 1).uopIdx := (2 * i + 1).U 674d91483a6Sfdy } 675d91483a6Sfdy csBundle(numOfUop - 1.U).srcType(0) := SrcType.fp 676d91483a6Sfdy csBundle(numOfUop - 1.U).lsrc(0) := src1 677d91483a6Sfdy csBundle(numOfUop - 1.U).ldest := dest + lmul - 1.U 678d91483a6Sfdy } 67917ec87f2SXuan Hu is(UopSplitType.VEC_VRED) { 680d91483a6Sfdy when(simple.io.enq.vtype.vlmul === "b001".U) { 681d91483a6Sfdy csBundle(0).srcType(2) := SrcType.DC 682d91483a6Sfdy csBundle(0).lsrc(0) := src2 + 1.U 683d91483a6Sfdy csBundle(0).lsrc(1) := src2 684d91483a6Sfdy csBundle(0).ldest := VECTOR_TMP_REG_LMUL.U 685d91483a6Sfdy csBundle(0).uopIdx := 0.U 686d91483a6Sfdy } 687d91483a6Sfdy when(simple.io.enq.vtype.vlmul === "b010".U) { 688d91483a6Sfdy csBundle(0).srcType(2) := SrcType.DC 689d91483a6Sfdy csBundle(0).lsrc(0) := src2 + 1.U 690d91483a6Sfdy csBundle(0).lsrc(1) := src2 691d91483a6Sfdy csBundle(0).ldest := VECTOR_TMP_REG_LMUL.U 692d91483a6Sfdy csBundle(0).uopIdx := 0.U 693d91483a6Sfdy 694d91483a6Sfdy csBundle(1).srcType(2) := SrcType.DC 695d91483a6Sfdy csBundle(1).lsrc(0) := src2 + 3.U 696d91483a6Sfdy csBundle(1).lsrc(1) := src2 + 2.U 697d91483a6Sfdy csBundle(1).ldest := (VECTOR_TMP_REG_LMUL + 1).U 698d91483a6Sfdy csBundle(1).uopIdx := 1.U 699d91483a6Sfdy 700d91483a6Sfdy csBundle(2).srcType(2) := SrcType.DC 701d91483a6Sfdy csBundle(2).lsrc(0) := (VECTOR_TMP_REG_LMUL + 1).U 702d91483a6Sfdy csBundle(2).lsrc(1) := VECTOR_TMP_REG_LMUL.U 703d91483a6Sfdy csBundle(2).ldest := (VECTOR_TMP_REG_LMUL + 2).U 704d91483a6Sfdy csBundle(2).uopIdx := 2.U 705d91483a6Sfdy } 706d91483a6Sfdy when(simple.io.enq.vtype.vlmul === "b011".U) { 707d91483a6Sfdy for (i <- 0 until MAX_VLMUL) { 708d91483a6Sfdy if (i < MAX_VLMUL - MAX_VLMUL / 2) { 709d91483a6Sfdy csBundle(i).lsrc(0) := src2 + (i * 2 + 1).U 710d91483a6Sfdy csBundle(i).lsrc(1) := src2 + (i * 2).U 711d91483a6Sfdy csBundle(i).ldest := (VECTOR_TMP_REG_LMUL + i).U 712d91483a6Sfdy } else if (i < MAX_VLMUL - MAX_VLMUL / 4) { 713d91483a6Sfdy csBundle(i).lsrc(0) := (VECTOR_TMP_REG_LMUL + (i - MAX_VLMUL / 2) * 2 + 1).U 714d91483a6Sfdy csBundle(i).lsrc(1) := (VECTOR_TMP_REG_LMUL + (i - MAX_VLMUL / 2) * 2).U 715d91483a6Sfdy csBundle(i).ldest := (VECTOR_TMP_REG_LMUL + i).U 716d91483a6Sfdy } else if (i < MAX_VLMUL - MAX_VLMUL / 8) { 717d91483a6Sfdy csBundle(6).lsrc(0) := (VECTOR_TMP_REG_LMUL + 5).U 718d91483a6Sfdy csBundle(6).lsrc(1) := (VECTOR_TMP_REG_LMUL + 4).U 719d91483a6Sfdy csBundle(6).ldest := (VECTOR_TMP_REG_LMUL + 6).U 720d91483a6Sfdy } 721d91483a6Sfdy csBundle(i).srcType(2) := SrcType.DC 722d91483a6Sfdy csBundle(i).uopIdx := i.U 723d91483a6Sfdy } 724d91483a6Sfdy } 725d91483a6Sfdy when(simple.io.enq.vtype.vlmul.orR()) { 726d91483a6Sfdy csBundle(numOfUop - 1.U).srcType(2) := SrcType.vp 727d91483a6Sfdy csBundle(numOfUop - 1.U).lsrc(0) := src1 728d91483a6Sfdy csBundle(numOfUop - 1.U).lsrc(1) := VECTOR_TMP_REG_LMUL.U + numOfUop - 2.U 729d91483a6Sfdy csBundle(numOfUop - 1.U).lsrc(2) := dest 730d91483a6Sfdy csBundle(numOfUop - 1.U).ldest := dest 731d91483a6Sfdy csBundle(numOfUop - 1.U).uopIdx := numOfUop - 1.U 732d91483a6Sfdy } 733d91483a6Sfdy } 734d91483a6Sfdy 73517ec87f2SXuan Hu is(UopSplitType.VEC_SLIDEUP) { 736d91483a6Sfdy // FMV.D.X 737d91483a6Sfdy csBundle(0).srcType(0) := SrcType.reg 738d91483a6Sfdy csBundle(0).srcType(1) := SrcType.imm 739d91483a6Sfdy csBundle(0).lsrc(1) := 0.U 740d91483a6Sfdy csBundle(0).ldest := FP_TMP_REG_MV.U 741d91483a6Sfdy csBundle(0).fuType := FuType.i2f.U 742d91483a6Sfdy csBundle(0).rfWen := false.B 743d91483a6Sfdy csBundle(0).fpWen := true.B 744d91483a6Sfdy csBundle(0).vecWen := false.B 745d91483a6Sfdy csBundle(0).fpu.isAddSub := false.B 746d91483a6Sfdy csBundle(0).fpu.typeTagIn := FPU.D 747d91483a6Sfdy csBundle(0).fpu.typeTagOut := FPU.D 748d91483a6Sfdy csBundle(0).fpu.fromInt := true.B 749d91483a6Sfdy csBundle(0).fpu.wflags := false.B 750d91483a6Sfdy csBundle(0).fpu.fpWen := true.B 751d91483a6Sfdy csBundle(0).fpu.div := false.B 752d91483a6Sfdy csBundle(0).fpu.sqrt := false.B 753d91483a6Sfdy csBundle(0).fpu.fcvt := false.B 754d91483a6Sfdy // LMUL 755d91483a6Sfdy for (i <- 0 until MAX_VLMUL) 756d91483a6Sfdy for (j <- 0 to i) { 7574ee69032SzhanglyGit val old_vd = if (j == 0) { 7584ee69032SzhanglyGit dest + i.U 7594ee69032SzhanglyGit } else (VECTOR_TMP_REG_LMUL + j - 1).U 7604ee69032SzhanglyGit val vd = if (j == i) { 7614ee69032SzhanglyGit dest + i.U 7624ee69032SzhanglyGit } else (VECTOR_TMP_REG_LMUL + j).U 763d91483a6Sfdy csBundle(i * (i + 1) / 2 + j + 1).srcType(0) := SrcType.fp 764d91483a6Sfdy csBundle(i * (i + 1) / 2 + j + 1).lsrc(0) := FP_TMP_REG_MV.U 765d91483a6Sfdy csBundle(i * (i + 1) / 2 + j + 1).lsrc(1) := src2 + j.U 766d91483a6Sfdy csBundle(i * (i + 1) / 2 + j + 1).lsrc(2) := old_vd 767d91483a6Sfdy csBundle(i * (i + 1) / 2 + j + 1).ldest := vd 768d91483a6Sfdy csBundle(i * (i + 1) / 2 + j + 1).uopIdx := (i * (i + 1) / 2 + j).U 769d91483a6Sfdy } 770d91483a6Sfdy } 771d91483a6Sfdy 77217ec87f2SXuan Hu is(UopSplitType.VEC_ISLIDEUP) { 773d91483a6Sfdy // LMUL 774d91483a6Sfdy for (i <- 0 until MAX_VLMUL) 775d91483a6Sfdy for (j <- 0 to i) { 7764ee69032SzhanglyGit val old_vd = if (j == 0) { 7774ee69032SzhanglyGit dest + i.U 7784ee69032SzhanglyGit } else (VECTOR_TMP_REG_LMUL + j - 1).U 7794ee69032SzhanglyGit val vd = if (j == i) { 7804ee69032SzhanglyGit dest + i.U 7814ee69032SzhanglyGit } else (VECTOR_TMP_REG_LMUL + j).U 782d91483a6Sfdy csBundle(i * (i + 1) / 2 + j).lsrc(1) := src2 + j.U 783d91483a6Sfdy csBundle(i * (i + 1) / 2 + j).lsrc(2) := old_vd 784d91483a6Sfdy csBundle(i * (i + 1) / 2 + j).ldest := vd 785d91483a6Sfdy csBundle(i * (i + 1) / 2 + j).uopIdx := (i * (i + 1) / 2 + j).U 786d91483a6Sfdy } 787d91483a6Sfdy } 788d91483a6Sfdy 78917ec87f2SXuan Hu is(UopSplitType.VEC_SLIDEDOWN) { 790d91483a6Sfdy // FMV.D.X 791d91483a6Sfdy csBundle(0).srcType(0) := SrcType.reg 792d91483a6Sfdy csBundle(0).srcType(1) := SrcType.imm 793d91483a6Sfdy csBundle(0).lsrc(1) := 0.U 794d91483a6Sfdy csBundle(0).ldest := FP_TMP_REG_MV.U 795d91483a6Sfdy csBundle(0).fuType := FuType.i2f.U 796d91483a6Sfdy csBundle(0).rfWen := false.B 797d91483a6Sfdy csBundle(0).fpWen := true.B 798d91483a6Sfdy csBundle(0).vecWen := false.B 799d91483a6Sfdy csBundle(0).fpu.isAddSub := false.B 800d91483a6Sfdy csBundle(0).fpu.typeTagIn := FPU.D 801d91483a6Sfdy csBundle(0).fpu.typeTagOut := FPU.D 802d91483a6Sfdy csBundle(0).fpu.fromInt := true.B 803d91483a6Sfdy csBundle(0).fpu.wflags := false.B 804d91483a6Sfdy csBundle(0).fpu.fpWen := true.B 805d91483a6Sfdy csBundle(0).fpu.div := false.B 806d91483a6Sfdy csBundle(0).fpu.sqrt := false.B 807d91483a6Sfdy csBundle(0).fpu.fcvt := false.B 808d91483a6Sfdy // LMUL 809d91483a6Sfdy for (i <- 0 until MAX_VLMUL) 810d91483a6Sfdy for (j <- (0 to i).reverse) { 811d91483a6Sfdy when(i.U < lmul) { 8124ee69032SzhanglyGit val old_vd = if (j == 0) { 8134ee69032SzhanglyGit dest + lmul - 1.U - i.U 8144ee69032SzhanglyGit } else (VECTOR_TMP_REG_LMUL + j - 1).U 8154ee69032SzhanglyGit val vd = if (j == i) { 8164ee69032SzhanglyGit dest + lmul - 1.U - i.U 8174ee69032SzhanglyGit } else (VECTOR_TMP_REG_LMUL + j).U 818d91483a6Sfdy csBundle(numOfUop - (i * (i + 1) / 2 + i - j + 1).U).srcType(0) := SrcType.fp 819d91483a6Sfdy csBundle(numOfUop - (i * (i + 1) / 2 + i - j + 1).U).lsrc(0) := FP_TMP_REG_MV.U 820d91483a6Sfdy csBundle(numOfUop - (i * (i + 1) / 2 + i - j + 1).U).lsrc(1) := src2 + lmul - 1.U - j.U 821d91483a6Sfdy csBundle(numOfUop - (i * (i + 1) / 2 + i - j + 1).U).lsrc(2) := old_vd 822d91483a6Sfdy csBundle(numOfUop - (i * (i + 1) / 2 + i - j + 1).U).ldest := vd 823d91483a6Sfdy csBundle(numOfUop - (i * (i + 1) / 2 + i - j + 1).U).uopIdx := numOfUop - (i * (i + 1) / 2 + i - j + 2).U 824d91483a6Sfdy } 825d91483a6Sfdy } 826d91483a6Sfdy } 827d91483a6Sfdy 82817ec87f2SXuan Hu is(UopSplitType.VEC_ISLIDEDOWN) { 829d91483a6Sfdy // LMUL 830d91483a6Sfdy for (i <- 0 until MAX_VLMUL) 831d91483a6Sfdy for (j <- (0 to i).reverse) { 832d91483a6Sfdy when(i.U < lmul) { 8334ee69032SzhanglyGit val old_vd = if (j == 0) { 8344ee69032SzhanglyGit dest + lmul - 1.U - i.U 8354ee69032SzhanglyGit } else (VECTOR_TMP_REG_LMUL + j - 1).U 8364ee69032SzhanglyGit val vd = if (j == i) { 8374ee69032SzhanglyGit dest + lmul - 1.U - i.U 8384ee69032SzhanglyGit } else (VECTOR_TMP_REG_LMUL + j).U 839d91483a6Sfdy csBundle(numOfUop - (i * (i + 1) / 2 + i - j + 1).U).lsrc(1) := src2 + lmul - 1.U - j.U 840d91483a6Sfdy csBundle(numOfUop - (i * (i + 1) / 2 + i - j + 1).U).lsrc(2) := old_vd 841d91483a6Sfdy csBundle(numOfUop - (i * (i + 1) / 2 + i - j + 1).U).ldest := vd 842d91483a6Sfdy csBundle(numOfUop - (i * (i + 1) / 2 + i - j + 1).U).uopIdx := numOfUop - (i * (i + 1) / 2 + i - j + 1).U 843d91483a6Sfdy } 844d91483a6Sfdy } 845d91483a6Sfdy } 846d91483a6Sfdy 84717ec87f2SXuan Hu is(UopSplitType.VEC_M0X) { 848d91483a6Sfdy // LMUL 849d91483a6Sfdy for (i <- 0 until MAX_VLMUL) { 850d91483a6Sfdy val srcType0 = if (i == 0) SrcType.DC else SrcType.vp 851d91483a6Sfdy val ldest = (VECTOR_TMP_REG_LMUL + i).U 852d91483a6Sfdy csBundle(i).srcType(0) := srcType0 853d91483a6Sfdy csBundle(i).srcType(1) := SrcType.vp 854d91483a6Sfdy csBundle(i).rfWen := false.B 855d91483a6Sfdy csBundle(i).vecWen := true.B 856d91483a6Sfdy csBundle(i).lsrc(0) := (VECTOR_TMP_REG_LMUL + i - 1).U 857d91483a6Sfdy csBundle(i).lsrc(1) := src2 858d91483a6Sfdy // csBundle(i).lsrc(2) := dest + i.U DontCare 859d91483a6Sfdy csBundle(i).ldest := ldest 860d91483a6Sfdy csBundle(i).uopIdx := i.U 861d91483a6Sfdy } 862d91483a6Sfdy csBundle(lmul - 1.U).vecWen := false.B 863d91483a6Sfdy csBundle(lmul - 1.U).fpWen := true.B 864d91483a6Sfdy csBundle(lmul - 1.U).ldest := FP_TMP_REG_MV.U 865d91483a6Sfdy // FMV_X_D 866d91483a6Sfdy csBundle(lmul).srcType(0) := SrcType.fp 867d91483a6Sfdy csBundle(lmul).srcType(1) := SrcType.imm 868d91483a6Sfdy csBundle(lmul).lsrc(0) := FP_TMP_REG_MV.U 869d91483a6Sfdy csBundle(lmul).lsrc(1) := 0.U 870d91483a6Sfdy csBundle(lmul).ldest := dest 871d91483a6Sfdy csBundle(lmul).fuType := FuType.fmisc.U 872d91483a6Sfdy csBundle(lmul).rfWen := true.B 873d91483a6Sfdy csBundle(lmul).fpWen := false.B 874d91483a6Sfdy csBundle(lmul).vecWen := false.B 875d91483a6Sfdy csBundle(lmul).fpu.isAddSub := false.B 876d91483a6Sfdy csBundle(lmul).fpu.typeTagIn := FPU.D 877d91483a6Sfdy csBundle(lmul).fpu.typeTagOut := FPU.D 878d91483a6Sfdy csBundle(lmul).fpu.fromInt := false.B 879d91483a6Sfdy csBundle(lmul).fpu.wflags := false.B 880d91483a6Sfdy csBundle(lmul).fpu.fpWen := false.B 881d91483a6Sfdy csBundle(lmul).fpu.div := false.B 882d91483a6Sfdy csBundle(lmul).fpu.sqrt := false.B 883d91483a6Sfdy csBundle(lmul).fpu.fcvt := false.B 884d91483a6Sfdy } 885d91483a6Sfdy 88617ec87f2SXuan Hu is(UopSplitType.VEC_MVV) { 887d91483a6Sfdy // LMUL 888d91483a6Sfdy for (i <- 0 until MAX_VLMUL) { 889d91483a6Sfdy val srcType0 = if (i == 0) SrcType.DC else SrcType.vp 890d91483a6Sfdy csBundle(i * 2 + 0).srcType(0) := srcType0 891d91483a6Sfdy csBundle(i * 2 + 0).srcType(1) := SrcType.vp 892d91483a6Sfdy csBundle(i * 2 + 0).lsrc(0) := (VECTOR_TMP_REG_LMUL + i - 1).U 893d91483a6Sfdy csBundle(i * 2 + 0).lsrc(1) := src2 894d91483a6Sfdy csBundle(i * 2 + 0).lsrc(2) := dest + i.U 895d91483a6Sfdy csBundle(i * 2 + 0).ldest := dest + i.U 896d91483a6Sfdy csBundle(i * 2 + 0).uopIdx := (i * 2 + 0).U 897d91483a6Sfdy 898d91483a6Sfdy csBundle(i * 2 + 1).srcType(0) := srcType0 899d91483a6Sfdy csBundle(i * 2 + 1).srcType(1) := SrcType.vp 900d91483a6Sfdy csBundle(i * 2 + 1).lsrc(0) := (VECTOR_TMP_REG_LMUL + i - 1).U 901d91483a6Sfdy csBundle(i * 2 + 1).lsrc(1) := src2 902d91483a6Sfdy // csBundle(i).lsrc(2) := dest + i.U DontCare 903d91483a6Sfdy csBundle(i * 2 + 1).ldest := (VECTOR_TMP_REG_LMUL + i).U 904d91483a6Sfdy csBundle(i * 2 + 1).uopIdx := (i * 2 + 1).U 905d91483a6Sfdy } 906d91483a6Sfdy } 907d91483a6Sfdy 90817ec87f2SXuan Hu is(UopSplitType.VEC_M0X_VFIRST) { 909d91483a6Sfdy // LMUL 910d91483a6Sfdy csBundle(0).rfWen := false.B 911d91483a6Sfdy csBundle(0).fpWen := true.B 912d91483a6Sfdy csBundle(0).ldest := FP_TMP_REG_MV.U 913d91483a6Sfdy // FMV_X_D 914d91483a6Sfdy csBundle(1).srcType(0) := SrcType.fp 915d91483a6Sfdy csBundle(1).srcType(1) := SrcType.imm 916d91483a6Sfdy csBundle(1).lsrc(0) := FP_TMP_REG_MV.U 917d91483a6Sfdy csBundle(1).lsrc(1) := 0.U 918d91483a6Sfdy csBundle(1).ldest := dest 919d91483a6Sfdy csBundle(1).fuType := FuType.fmisc.U 920d91483a6Sfdy csBundle(1).rfWen := true.B 921d91483a6Sfdy csBundle(1).fpWen := false.B 922d91483a6Sfdy csBundle(1).vecWen := false.B 923d91483a6Sfdy csBundle(1).fpu.isAddSub := false.B 924d91483a6Sfdy csBundle(1).fpu.typeTagIn := FPU.D 925d91483a6Sfdy csBundle(1).fpu.typeTagOut := FPU.D 926d91483a6Sfdy csBundle(1).fpu.fromInt := false.B 927d91483a6Sfdy csBundle(1).fpu.wflags := false.B 928d91483a6Sfdy csBundle(1).fpu.fpWen := false.B 929d91483a6Sfdy csBundle(1).fpu.div := false.B 930d91483a6Sfdy csBundle(1).fpu.sqrt := false.B 931d91483a6Sfdy csBundle(1).fpu.fcvt := false.B 932d91483a6Sfdy } 933*189ec863SzhanglyGit is(UopSplitType.VEC_VWW) { 934*189ec863SzhanglyGit for (i <- 0 until MAX_VLMUL*2) { 935*189ec863SzhanglyGit when(i.U < lmul){ 936*189ec863SzhanglyGit csBundle(i).srcType(2) := SrcType.DC 937*189ec863SzhanglyGit csBundle(i).lsrc(0) := src2 + i.U 938*189ec863SzhanglyGit csBundle(i).lsrc(1) := src2 + i.U 939*189ec863SzhanglyGit // csBundle(i).lsrc(2) := dest + (2 * i).U 940*189ec863SzhanglyGit csBundle(i).ldest := (VECTOR_TMP_REG_LMUL + i).U 941*189ec863SzhanglyGit csBundle(i).uopIdx := i.U 942*189ec863SzhanglyGit } otherwise { 943*189ec863SzhanglyGit csBundle(i).srcType(2) := SrcType.DC 944*189ec863SzhanglyGit csBundle(i).lsrc(0) := VECTOR_TMP_REG_LMUL.U + Cat((i.U-lmul),0.U(1.W)) + 1.U 945*189ec863SzhanglyGit csBundle(i).lsrc(1) := VECTOR_TMP_REG_LMUL.U + Cat((i.U-lmul),0.U(1.W)) 946*189ec863SzhanglyGit // csBundle(i).lsrc(2) := dest + (2 * i).U 947*189ec863SzhanglyGit csBundle(i).ldest := (VECTOR_TMP_REG_LMUL + i).U 948*189ec863SzhanglyGit csBundle(i).uopIdx := i.U 949*189ec863SzhanglyGit } 950*189ec863SzhanglyGit csBundle(numOfUop-1.U).srcType(2) := SrcType.vp 951*189ec863SzhanglyGit csBundle(numOfUop-1.U).lsrc(0) := src1 952*189ec863SzhanglyGit csBundle(numOfUop-1.U).lsrc(2) := dest 953*189ec863SzhanglyGit csBundle(numOfUop-1.U).ldest := dest 954*189ec863SzhanglyGit } 955*189ec863SzhanglyGit } 956*189ec863SzhanglyGit is(UopSplitType.VEC_RGATHER) { 957*189ec863SzhanglyGit def genCsBundle_VEC_RGATHER(len:Int): Unit ={ 958*189ec863SzhanglyGit for (i <- 0 until len) 959*189ec863SzhanglyGit for (j <- 0 until len) { 960*189ec863SzhanglyGit // csBundle(i * len + j).srcType(0) := SrcType.vp // SrcType.imm 961*189ec863SzhanglyGit // csBundle(i * len + j).srcType(1) := SrcType.vp 962*189ec863SzhanglyGit // csBundle(i * len + j).srcType(2) := SrcType.vp 963*189ec863SzhanglyGit csBundle(i * len + j).lsrc(0) := src1 + i.U 964*189ec863SzhanglyGit csBundle(i * len + j).lsrc(1) := src2 + j.U 965*189ec863SzhanglyGit val vd_old = if(j==0) (dest + i.U) else (VECTOR_TMP_REG_LMUL + j - 1).U 966*189ec863SzhanglyGit csBundle(i * len + j).lsrc(2) := vd_old 967*189ec863SzhanglyGit val vd = if(j==len-1) (dest + i.U) else (VECTOR_TMP_REG_LMUL + j).U 968*189ec863SzhanglyGit csBundle(i * len + j).ldest := vd 969*189ec863SzhanglyGit csBundle(i * len + j).uopIdx := (i * len + j).U 970*189ec863SzhanglyGit } 971*189ec863SzhanglyGit } 972*189ec863SzhanglyGit switch(simple.io.enq.vtype.vlmul) { 973*189ec863SzhanglyGit is("b001".U ){ 974*189ec863SzhanglyGit genCsBundle_VEC_RGATHER(2) 975*189ec863SzhanglyGit } 976*189ec863SzhanglyGit is("b010".U ){ 977*189ec863SzhanglyGit genCsBundle_VEC_RGATHER(4) 978*189ec863SzhanglyGit } 979*189ec863SzhanglyGit is("b011".U ){ 980*189ec863SzhanglyGit genCsBundle_VEC_RGATHER(8) 981*189ec863SzhanglyGit } 982*189ec863SzhanglyGit } 983*189ec863SzhanglyGit } 984*189ec863SzhanglyGit is(UopSplitType.VEC_RGATHER_VX) { 985*189ec863SzhanglyGit def genCsBundle_RGATHER_VX(len:Int): Unit ={ 986*189ec863SzhanglyGit for (i <- 0 until len) 987*189ec863SzhanglyGit for (j <- 0 until len) { 988*189ec863SzhanglyGit csBundle(i * len + j + 1).srcType(0) := SrcType.fp 989*189ec863SzhanglyGit // csBundle(i * len + j + 1).srcType(1) := SrcType.vp 990*189ec863SzhanglyGit // csBundle(i * len + j + 1).srcType(2) := SrcType.vp 991*189ec863SzhanglyGit csBundle(i * len + j + 1).lsrc(0) := FP_TMP_REG_MV.U 992*189ec863SzhanglyGit csBundle(i * len + j + 1).lsrc(1) := src2 + j.U 993*189ec863SzhanglyGit val vd_old = if(j==0) (dest + i.U) else (VECTOR_TMP_REG_LMUL + j - 1).U 994*189ec863SzhanglyGit csBundle(i * len + j + 1).lsrc(2) := vd_old 995*189ec863SzhanglyGit val vd = if(j==len-1) (dest + i.U) else (VECTOR_TMP_REG_LMUL + j).U 996*189ec863SzhanglyGit csBundle(i * len + j + 1).ldest := vd 997*189ec863SzhanglyGit csBundle(i * len + j + 1).uopIdx := (i * len + j).U 998*189ec863SzhanglyGit } 999*189ec863SzhanglyGit } 1000*189ec863SzhanglyGit // FMV.D.X 1001*189ec863SzhanglyGit csBundle(0).srcType(0) := SrcType.reg 1002*189ec863SzhanglyGit csBundle(0).srcType(1) := SrcType.imm 1003*189ec863SzhanglyGit csBundle(0).lsrc(1) := 0.U 1004*189ec863SzhanglyGit csBundle(0).ldest := FP_TMP_REG_MV.U 1005*189ec863SzhanglyGit csBundle(0).fuType := FuType.i2f.U 1006*189ec863SzhanglyGit csBundle(0).rfWen := false.B 1007*189ec863SzhanglyGit csBundle(0).fpWen := true.B 1008*189ec863SzhanglyGit csBundle(0).vecWen := false.B 1009*189ec863SzhanglyGit csBundle(0).fpu.isAddSub := false.B 1010*189ec863SzhanglyGit csBundle(0).fpu.typeTagIn := FPU.D 1011*189ec863SzhanglyGit csBundle(0).fpu.typeTagOut := FPU.D 1012*189ec863SzhanglyGit csBundle(0).fpu.fromInt := true.B 1013*189ec863SzhanglyGit csBundle(0).fpu.wflags := false.B 1014*189ec863SzhanglyGit csBundle(0).fpu.fpWen := true.B 1015*189ec863SzhanglyGit csBundle(0).fpu.div := false.B 1016*189ec863SzhanglyGit csBundle(0).fpu.sqrt := false.B 1017*189ec863SzhanglyGit csBundle(0).fpu.fcvt := false.B 1018*189ec863SzhanglyGit switch(simple.io.enq.vtype.vlmul) { 1019*189ec863SzhanglyGit is("b000".U ){ 1020*189ec863SzhanglyGit genCsBundle_RGATHER_VX(1) 1021*189ec863SzhanglyGit } 1022*189ec863SzhanglyGit is("b001".U ){ 1023*189ec863SzhanglyGit genCsBundle_RGATHER_VX(2) 1024*189ec863SzhanglyGit } 1025*189ec863SzhanglyGit is("b010".U ){ 1026*189ec863SzhanglyGit genCsBundle_RGATHER_VX(4) 1027*189ec863SzhanglyGit } 1028*189ec863SzhanglyGit is("b011".U ){ 1029*189ec863SzhanglyGit genCsBundle_RGATHER_VX(8) 1030*189ec863SzhanglyGit } 1031*189ec863SzhanglyGit } 1032*189ec863SzhanglyGit } 1033*189ec863SzhanglyGit is(UopSplitType.VEC_RGATHEREI16) { 1034*189ec863SzhanglyGit def genCsBundle_VEC_RGATHEREI16_SEW8(len:Int): Unit ={ 1035*189ec863SzhanglyGit for (i <- 0 until len) 1036*189ec863SzhanglyGit for (j <- 0 until len) { 1037*189ec863SzhanglyGit val vd_old0 = if(j==0) (dest + i.U) else (VECTOR_TMP_REG_LMUL + j*2-1).U 1038*189ec863SzhanglyGit val vd0 = (VECTOR_TMP_REG_LMUL + j*2 ).U 1039*189ec863SzhanglyGit // csBundle(i * len + j).srcType(0) := SrcType.vp // SrcType.imm 1040*189ec863SzhanglyGit // csBundle(i * len + j).srcType(1) := SrcType.vp 1041*189ec863SzhanglyGit // csBundle(i * len + j).srcType(2) := SrcType.vp 1042*189ec863SzhanglyGit csBundle((i * len + j)*2+0).lsrc(0) := src1 + (i*2+0).U 1043*189ec863SzhanglyGit csBundle((i * len + j)*2+0).lsrc(1) := src2 + j.U 1044*189ec863SzhanglyGit csBundle((i * len + j)*2+0).lsrc(2) := vd_old0 1045*189ec863SzhanglyGit csBundle((i * len + j)*2+0).ldest := vd0 1046*189ec863SzhanglyGit csBundle((i * len + j)*2+0).uopIdx := ((i * len + j)*2+0).U 1047*189ec863SzhanglyGit val vd_old1 = (VECTOR_TMP_REG_LMUL + j*2).U 1048*189ec863SzhanglyGit val vd1 = if(j==len-1) (dest + i.U) else (VECTOR_TMP_REG_LMUL + j*2+1 ).U 1049*189ec863SzhanglyGit csBundle((i * len + j)*2+1).lsrc(0) := src1 + (i*2+1).U 1050*189ec863SzhanglyGit csBundle((i * len + j)*2+1).lsrc(1) := src2 + j.U 1051*189ec863SzhanglyGit csBundle((i * len + j)*2+1).lsrc(2) := vd_old1 1052*189ec863SzhanglyGit csBundle((i * len + j)*2+1).ldest := vd1 1053*189ec863SzhanglyGit csBundle((i * len + j)*2+1).uopIdx := ((i * len + j)*2+1).U 1054*189ec863SzhanglyGit } 1055*189ec863SzhanglyGit } 1056*189ec863SzhanglyGit def genCsBundle_VEC_RGATHEREI16(len:Int): Unit ={ 1057*189ec863SzhanglyGit for (i <- 0 until len) 1058*189ec863SzhanglyGit for (j <- 0 until len) { 1059*189ec863SzhanglyGit val vd_old = if(j==0) (dest + i.U) else (VECTOR_TMP_REG_LMUL + j-1).U 1060*189ec863SzhanglyGit val vd = if(j==len-1) (dest + i.U) else (VECTOR_TMP_REG_LMUL + j).U 1061*189ec863SzhanglyGit // csBundle(i * len + j).srcType(0) := SrcType.vp // SrcType.imm 1062*189ec863SzhanglyGit // csBundle(i * len + j).srcType(1) := SrcType.vp 1063*189ec863SzhanglyGit // csBundle(i * len + j).srcType(2) := SrcType.vp 1064*189ec863SzhanglyGit csBundle(i * len + j).lsrc(0) := src1 + i.U 1065*189ec863SzhanglyGit csBundle(i * len + j).lsrc(1) := src2 + j.U 1066*189ec863SzhanglyGit csBundle(i * len + j).lsrc(2) := vd_old 1067*189ec863SzhanglyGit csBundle(i * len + j).ldest := vd 1068*189ec863SzhanglyGit csBundle(i * len + j).uopIdx := (i * len + j).U 1069*189ec863SzhanglyGit } 1070*189ec863SzhanglyGit } 1071*189ec863SzhanglyGit switch(simple.io.enq.vtype.vlmul) { 1072*189ec863SzhanglyGit is("b000".U ){ 1073*189ec863SzhanglyGit when(!simple.io.enq.vtype.vsew.orR){ 1074*189ec863SzhanglyGit genCsBundle_VEC_RGATHEREI16_SEW8(1) 1075*189ec863SzhanglyGit } .otherwise{ 1076*189ec863SzhanglyGit genCsBundle_VEC_RGATHEREI16(1) 1077*189ec863SzhanglyGit } 1078*189ec863SzhanglyGit } 1079*189ec863SzhanglyGit is("b001".U) { 1080*189ec863SzhanglyGit when(!simple.io.enq.vtype.vsew.orR) { 1081*189ec863SzhanglyGit genCsBundle_VEC_RGATHEREI16_SEW8(2) 1082*189ec863SzhanglyGit }.otherwise { 1083*189ec863SzhanglyGit genCsBundle_VEC_RGATHEREI16(2) 1084*189ec863SzhanglyGit } 1085*189ec863SzhanglyGit } 1086*189ec863SzhanglyGit is("b010".U) { 1087*189ec863SzhanglyGit when(!simple.io.enq.vtype.vsew.orR) { 1088*189ec863SzhanglyGit genCsBundle_VEC_RGATHEREI16_SEW8(4) 1089*189ec863SzhanglyGit }.otherwise { 1090*189ec863SzhanglyGit genCsBundle_VEC_RGATHEREI16(4) 1091*189ec863SzhanglyGit } 1092*189ec863SzhanglyGit } 1093*189ec863SzhanglyGit is("b011".U) { 1094*189ec863SzhanglyGit genCsBundle_VEC_RGATHEREI16(8) 1095*189ec863SzhanglyGit } 1096*189ec863SzhanglyGit } 1097*189ec863SzhanglyGit } 1098*189ec863SzhanglyGit is(UopSplitType.VEC_COMPRESS) { 1099*189ec863SzhanglyGit def genCsBundle_VEC_COMPRESS(len:Int): Unit ={ 1100*189ec863SzhanglyGit for (i <- 0 until len){ 1101*189ec863SzhanglyGit val jlen = if (i == len-1) i+1 else i+2 1102*189ec863SzhanglyGit for (j <- 0 until jlen) { 1103*189ec863SzhanglyGit val vd_old = if(i==j) (dest + i.U) else (VECTOR_TMP_REG_LMUL + j + 1).U 1104*189ec863SzhanglyGit val vd = if(i==len-1) (dest + j.U) else{ 1105*189ec863SzhanglyGit if (j == i+1) VECTOR_TMP_REG_LMUL.U else (VECTOR_TMP_REG_LMUL + j + 1).U 1106*189ec863SzhanglyGit } 1107*189ec863SzhanglyGit val src23Type = if (j == i+1) DontCare else SrcType.vp 1108*189ec863SzhanglyGit csBundle(i*(i+3)/2 + j).srcType(0) := SrcType.vp 1109*189ec863SzhanglyGit csBundle(i*(i+3)/2 + j).srcType(1) := src23Type 1110*189ec863SzhanglyGit csBundle(i*(i+3)/2 + j).srcType(2) := src23Type 1111*189ec863SzhanglyGit csBundle(i*(i+3)/2 + j).lsrc(0) := src1 1112*189ec863SzhanglyGit csBundle(i*(i+3)/2 + j).lsrc(1) := src2 + i.U 1113*189ec863SzhanglyGit csBundle(i*(i+3)/2 + j).lsrc(2) := vd_old 1114*189ec863SzhanglyGit // csBundle(i*(i+3)/2 + j).lsrc(3) := VECTOR_TMP_REG_LMUL.U 1115*189ec863SzhanglyGit csBundle(i*(i+3)/2 + j).ldest := vd 1116*189ec863SzhanglyGit csBundle(i*(i+3)/2 + j).uopIdx := (i*(i+3)/2 + j).U 1117*189ec863SzhanglyGit } 1118*189ec863SzhanglyGit } 1119*189ec863SzhanglyGit } 1120*189ec863SzhanglyGit switch(simple.io.enq.vtype.vlmul) { 1121*189ec863SzhanglyGit is("b001".U ){ 1122*189ec863SzhanglyGit genCsBundle_VEC_COMPRESS(2) 1123*189ec863SzhanglyGit } 1124*189ec863SzhanglyGit is("b010".U ){ 1125*189ec863SzhanglyGit genCsBundle_VEC_COMPRESS(4) 1126*189ec863SzhanglyGit } 1127*189ec863SzhanglyGit is("b011".U ){ 1128*189ec863SzhanglyGit genCsBundle_VEC_COMPRESS(8) 1129*189ec863SzhanglyGit } 1130*189ec863SzhanglyGit } 1131*189ec863SzhanglyGit } 11324ee69032SzhanglyGit is(UopSplitType.VEC_US_LD) { 11334ee69032SzhanglyGit /* 11344ee69032SzhanglyGit FMV.D.X 11354ee69032SzhanglyGit */ 11364ee69032SzhanglyGit csBundle(0).srcType(0) := SrcType.reg 11374ee69032SzhanglyGit csBundle(0).srcType(1) := SrcType.imm 11384ee69032SzhanglyGit csBundle(0).lsrc(1) := 0.U 11394ee69032SzhanglyGit csBundle(0).ldest := FP_TMP_REG_MV.U 11404ee69032SzhanglyGit csBundle(0).fuType := FuType.i2f.U 11414ee69032SzhanglyGit csBundle(0).rfWen := false.B 11424ee69032SzhanglyGit csBundle(0).fpWen := true.B 11434ee69032SzhanglyGit csBundle(0).vecWen := false.B 11444ee69032SzhanglyGit csBundle(0).fpu.isAddSub := false.B 11454ee69032SzhanglyGit csBundle(0).fpu.typeTagIn := FPU.D 11464ee69032SzhanglyGit csBundle(0).fpu.typeTagOut := FPU.D 11474ee69032SzhanglyGit csBundle(0).fpu.fromInt := true.B 11484ee69032SzhanglyGit csBundle(0).fpu.wflags := false.B 11494ee69032SzhanglyGit csBundle(0).fpu.fpWen := true.B 11504ee69032SzhanglyGit csBundle(0).fpu.div := false.B 11514ee69032SzhanglyGit csBundle(0).fpu.sqrt := false.B 11524ee69032SzhanglyGit csBundle(0).fpu.fcvt := false.B 11534ee69032SzhanglyGit //LMUL 11544ee69032SzhanglyGit for (i <- 0 until MAX_VLMUL) { 11554ee69032SzhanglyGit csBundle(i + 1).srcType(0) := SrcType.fp 11564ee69032SzhanglyGit csBundle(i + 1).lsrc(0) := FP_TMP_REG_MV.U 11574ee69032SzhanglyGit csBundle(i + 1).ldest := dest + i.U 11584ee69032SzhanglyGit csBundle(i + 1).uopIdx := i.U 11594ee69032SzhanglyGit } 11604ee69032SzhanglyGit } 1161d91483a6Sfdy } 1162d91483a6Sfdy 1163d91483a6Sfdy //uops dispatch 1164*189ec863SzhanglyGit val s_normal :: s_ext :: Nil = Enum(2) 1165*189ec863SzhanglyGit val state = RegInit(s_normal) 1166*189ec863SzhanglyGit val state_next = WireDefault(state) 1167d91483a6Sfdy val uopRes = RegInit(0.U) 1168d91483a6Sfdy 1169d91483a6Sfdy //readyFromRename Counter 1170d91483a6Sfdy val readyCounter = PriorityMuxDefault(io.readyFromRename.map(x => !x).zip((0 to (RenameWidth - 1)).map(_.U)), RenameWidth.U) 1171d91483a6Sfdy 1172*189ec863SzhanglyGit switch(state) { 1173*189ec863SzhanglyGit is(s_normal) { 1174*189ec863SzhanglyGit state_next := Mux(io.validFromIBuf(0) && (numOfUop > readyCounter) && (readyCounter =/= 0.U), s_ext, s_normal) 1175d91483a6Sfdy } 1176*189ec863SzhanglyGit is(s_ext) { 1177*189ec863SzhanglyGit state_next := Mux(io.validFromIBuf(0) && (uopRes > readyCounter), s_ext, s_normal) 1178d91483a6Sfdy } 1179d91483a6Sfdy } 1180d91483a6Sfdy 1181*189ec863SzhanglyGit state := state_next 1182*189ec863SzhanglyGit 1183*189ec863SzhanglyGit val uopRes0 = Mux(state === s_normal, numOfUop, uopRes) 1184*189ec863SzhanglyGit val uopResJudge = Mux(state === s_normal, 1185d91483a6Sfdy io.validFromIBuf(0) && (readyCounter =/= 0.U) && (uopRes0 > readyCounter), 1186d91483a6Sfdy io.validFromIBuf(0) && (uopRes0 > readyCounter)) 1187d91483a6Sfdy uopRes := Mux(uopResJudge, uopRes0 - readyCounter, 0.U) 1188d91483a6Sfdy 1189d91483a6Sfdy for(i <- 0 until RenameWidth) { 1190d91483a6Sfdy decodedInsts(i) := MuxCase(csBundle(i), Seq( 1191*189ec863SzhanglyGit (state === s_normal) -> csBundle(i), 1192*189ec863SzhanglyGit (state === s_ext) -> Mux((i.U + numOfUop -uopRes) < maxUopSize.U, csBundle(i.U + numOfUop - uopRes), csBundle(maxUopSize - 1)) 1193d91483a6Sfdy )) 1194d91483a6Sfdy } 1195d91483a6Sfdy 1196d91483a6Sfdy 1197d91483a6Sfdy val validSimple = Wire(Vec(DecodeWidth - 1, Bool())) 1198d91483a6Sfdy validSimple.zip(io.validFromIBuf.drop(1).zip(io.isComplex)).map{ case (dst, (src1, src2)) => dst := src1 && !src2 } 1199d91483a6Sfdy val notInf = Wire(Vec(DecodeWidth - 1, Bool())) 1200d91483a6Sfdy notInf.zip(io.validFromIBuf.drop(1).zip(validSimple)).map{ case (dst, (src1, src2)) => dst := !src1 || src2 } 1201d91483a6Sfdy val notInfVec = Wire(Vec(DecodeWidth, Bool())) 1202d91483a6Sfdy notInfVec.drop(1).zip(0 until DecodeWidth - 1).map{ case (dst, i) => dst := Cat(notInf.take(i + 1)).andR} 1203d91483a6Sfdy notInfVec(0) := true.B 1204d91483a6Sfdy 1205d91483a6Sfdy complexNum := Mux(io.validFromIBuf(0) && readyCounter.orR , 1206d91483a6Sfdy Mux(uopRes0 > readyCounter, readyCounter, uopRes0), 1207d91483a6Sfdy 1.U) 1208d91483a6Sfdy validToRename.zipWithIndex.foreach{ 1209d91483a6Sfdy case(dst, i) => 1210d91483a6Sfdy dst := MuxCase(false.B, Seq( 1211d91483a6Sfdy (io.validFromIBuf(0) && uopRes0 > readyCounter ) -> Mux(readyCounter > i.U, true.B, false.B), 1212d91483a6Sfdy (io.validFromIBuf(0) && !(uopRes0 > readyCounter)) -> Mux(complexNum > i.U, true.B, validSimple(i.U - complexNum) && notInfVec(i.U - complexNum) && io.readyFromRename(i)), 1213d91483a6Sfdy )) 1214d91483a6Sfdy } 1215d91483a6Sfdy 1216d91483a6Sfdy readyToIBuf.zipWithIndex.foreach { 1217d91483a6Sfdy case (dst, i) => 1218d91483a6Sfdy dst := MuxCase(true.B, Seq( 1219d91483a6Sfdy (io.validFromIBuf(0) && uopRes0 > readyCounter) -> false.B, 1220d91483a6Sfdy (io.validFromIBuf(0) && !(uopRes0 > readyCounter)) -> (if (i==0) true.B else Mux(RenameWidth.U - complexNum >= i.U, notInfVec(i - 1) && validSimple(i - 1) && io.readyFromRename(i), false.B)), 1221d91483a6Sfdy )) 1222d91483a6Sfdy } 1223d91483a6Sfdy 1224d91483a6Sfdy io.deq.decodedInsts := decodedInsts 1225*189ec863SzhanglyGit io.deq.isVset := isVsetSimple 1226d91483a6Sfdy io.deq.complexNum := complexNum 1227d91483a6Sfdy io.deq.validToRename := validToRename 1228d91483a6Sfdy io.deq.readyToIBuf := readyToIBuf 1229d91483a6Sfdy 1230d91483a6Sfdy} 1231