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 41189ec863SzhanglyGit 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) 6987dd4e0dSzhanglyGit 70d91483a6Sfdy 71d91483a6Sfdy staticInst := io.enq.staticInst 7287dd4e0dSzhanglyGit private val inst: XSInstBitFields = staticInst.instr.asTypeOf(new XSInstBitFields) 73d91483a6Sfdy 7498cfe81bSxgkiri val src1 = Cat(0.U(1.W), inst.RS1) 7598cfe81bSxgkiri val src2 = Cat(0.U(1.W), inst.RS2) 7698cfe81bSxgkiri val dest = Cat(0.U(1.W), inst.RD) 777f9f0a79SzhanglyGit 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 86189ec863SzhanglyGit val decodedInstsSimple = Wire(new DecodedInst) 877f9f0a79SzhanglyGit val numOfUop = Wire(UInt(log2Up(maxUopSize+1).W)) 887f9f0a79SzhanglyGit val lmul = Wire(UInt(4.W)) 89189ec863SzhanglyGit val isVsetSimple = Wire(Bool()) 90d91483a6Sfdy 91d91483a6Sfdy //pre decode 92d91483a6Sfdy val simple = Module(new DecodeUnit) 93d91483a6Sfdy simple.io.enq.ctrlFlow := staticInst 94d91483a6Sfdy simple.io.enq.vtype := io.vtype 95d91483a6Sfdy simple.io.csrCtrl := io.csrCtrl 96189ec863SzhanglyGit decodedInstsSimple := simple.io.deq.decodedInst 977f9f0a79SzhanglyGit lmul := simple.io.deq.uopInfo.lmul 98189ec863SzhanglyGit isVsetSimple := simple.io.deq.decodedInst.isVset 99189ec863SzhanglyGit when(isVsetSimple) { 100d91483a6Sfdy when(dest === 0.U && src1 === 0.U) { 101189ec863SzhanglyGit decodedInstsSimple.fuOpType := VSETOpType.keepVl(simple.io.deq.decodedInst.fuOpType) 102d91483a6Sfdy }.elsewhen(src1 === 0.U) { 103189ec863SzhanglyGit decodedInstsSimple.fuOpType := VSETOpType.setVlmax(simple.io.deq.decodedInst.fuOpType) 104a8db15d8Sfdy } 105a8db15d8Sfdy when(io.vtype.illegal){ 106189ec863SzhanglyGit decodedInstsSimple.flushPipe := true.B 107d91483a6Sfdy } 108d91483a6Sfdy } 109d91483a6Sfdy //Type of uop Div 110189ec863SzhanglyGit val typeOfSplit = decodedInstsSimple.uopSplitType 111d91483a6Sfdy 1127f9f0a79SzhanglyGit when(typeOfSplit === UopSplitType.DIR) { 1137f9f0a79SzhanglyGit numOfUop := Mux(dest =/= 0.U, 2.U, 114d91483a6Sfdy Mux(src1 =/= 0.U, 1.U, 1157f9f0a79SzhanglyGit Mux(VSETOpType.isVsetvl(decodedInstsSimple.fuOpType), 2.U, 1.U))) 1167f9f0a79SzhanglyGit } .otherwise { 1177f9f0a79SzhanglyGit numOfUop := simple.io.deq.uopInfo.numOfUop 1187f9f0a79SzhanglyGit } 1197f9f0a79SzhanglyGit 120d91483a6Sfdy 121d91483a6Sfdy //uop div up to maxUopSize 122d91483a6Sfdy val csBundle = Wire(Vec(maxUopSize, new DecodedInst)) 123d91483a6Sfdy csBundle.map { case dst => 124189ec863SzhanglyGit dst := decodedInstsSimple 125d91483a6Sfdy dst.firstUop := false.B 126d91483a6Sfdy dst.lastUop := false.B 127d91483a6Sfdy } 128d91483a6Sfdy 129f1e8fcb2SXuan Hu csBundle(0).numUops := numOfUop 130d91483a6Sfdy csBundle(0).firstUop := true.B 131d91483a6Sfdy csBundle(numOfUop - 1.U).lastUop := true.B 132d91483a6Sfdy 133189ec863SzhanglyGit switch(typeOfSplit) { 13417ec87f2SXuan Hu is(UopSplitType.DIR) { 135189ec863SzhanglyGit when(isVsetSimple) { 136d91483a6Sfdy when(dest =/= 0.U) { 137d91483a6Sfdy csBundle(0).fuType := FuType.vsetiwi.U 138189ec863SzhanglyGit csBundle(0).fuOpType := VSETOpType.switchDest(decodedInstsSimple.fuOpType) 139d91483a6Sfdy csBundle(0).flushPipe := false.B 140d91483a6Sfdy csBundle(0).rfWen := true.B 141d91483a6Sfdy csBundle(0).vecWen := false.B 142cb10a55bSXuan Hu csBundle(1).ldest := VCONFIG_IDX.U 143fe60541bSXuan Hu csBundle(1).rfWen := false.B 144fe60541bSXuan Hu csBundle(1).vecWen := true.B 145d91483a6Sfdy }.elsewhen(src1 =/= 0.U) { 146cb10a55bSXuan Hu csBundle(0).ldest := VCONFIG_IDX.U 147189ec863SzhanglyGit }.elsewhen(VSETOpType.isVsetvli(decodedInstsSimple.fuOpType)) { 148d91483a6Sfdy csBundle(0).fuType := FuType.vsetfwf.U 149d91483a6Sfdy csBundle(0).srcType(0) := SrcType.vp 150cb10a55bSXuan Hu csBundle(0).lsrc(0) := VCONFIG_IDX.U 151189ec863SzhanglyGit }.elsewhen(VSETOpType.isVsetvl(decodedInstsSimple.fuOpType)) { 152d91483a6Sfdy csBundle(0).srcType(0) := SrcType.reg 153d91483a6Sfdy csBundle(0).srcType(1) := SrcType.imm 154d91483a6Sfdy csBundle(0).lsrc(1) := 0.U 155d91483a6Sfdy csBundle(0).ldest := FP_TMP_REG_MV.U 156d91483a6Sfdy csBundle(0).fuType := FuType.i2f.U 157d91483a6Sfdy csBundle(0).rfWen := false.B 158d91483a6Sfdy csBundle(0).fpWen := true.B 159d91483a6Sfdy csBundle(0).vecWen := false.B 160d91483a6Sfdy csBundle(0).fpu.isAddSub := false.B 161d91483a6Sfdy csBundle(0).fpu.typeTagIn := FPU.D 162d91483a6Sfdy csBundle(0).fpu.typeTagOut := FPU.D 163d91483a6Sfdy csBundle(0).fpu.fromInt := true.B 164d91483a6Sfdy csBundle(0).fpu.wflags := false.B 165d91483a6Sfdy csBundle(0).fpu.fpWen := true.B 166d91483a6Sfdy csBundle(0).fpu.div := false.B 167d91483a6Sfdy csBundle(0).fpu.sqrt := false.B 168d91483a6Sfdy csBundle(0).fpu.fcvt := false.B 169d91483a6Sfdy csBundle(0).flushPipe := false.B 170d91483a6Sfdy csBundle(1).fuType := FuType.vsetfwf.U 171d91483a6Sfdy csBundle(1).srcType(0) := SrcType.vp 172cb10a55bSXuan Hu csBundle(1).lsrc(0) := VCONFIG_IDX.U 173d91483a6Sfdy csBundle(1).srcType(1) := SrcType.fp 174d91483a6Sfdy csBundle(1).lsrc(1) := FP_TMP_REG_MV.U 175cb10a55bSXuan Hu csBundle(1).ldest := VCONFIG_IDX.U 176d91483a6Sfdy } 177d91483a6Sfdy } 178d91483a6Sfdy } 17917ec87f2SXuan Hu is(UopSplitType.VEC_VVV) { 180d91483a6Sfdy for (i <- 0 until MAX_VLMUL) { 181d91483a6Sfdy csBundle(i).lsrc(0) := src1 + i.U 182d91483a6Sfdy csBundle(i).lsrc(1) := src2 + i.U 183d91483a6Sfdy csBundle(i).lsrc(2) := dest + i.U 184d91483a6Sfdy csBundle(i).ldest := dest + i.U 185d91483a6Sfdy csBundle(i).uopIdx := i.U 186d91483a6Sfdy } 187d91483a6Sfdy } 188684d7aceSxiaofeibao-xjtu is(UopSplitType.VEC_VFV) { 189684d7aceSxiaofeibao-xjtu for (i <- 0 until MAX_VLMUL) { 190684d7aceSxiaofeibao-xjtu csBundle(i).lsrc(1) := src2 + i.U 191684d7aceSxiaofeibao-xjtu csBundle(i).lsrc(2) := dest + i.U 192684d7aceSxiaofeibao-xjtu csBundle(i).ldest := dest + i.U 193684d7aceSxiaofeibao-xjtu csBundle(i).uopIdx := i.U 194684d7aceSxiaofeibao-xjtu } 195684d7aceSxiaofeibao-xjtu } 19617ec87f2SXuan Hu is(UopSplitType.VEC_EXT2) { 197d91483a6Sfdy for (i <- 0 until MAX_VLMUL / 2) { 198d91483a6Sfdy csBundle(2 * i).lsrc(1) := src2 + i.U 199d91483a6Sfdy csBundle(2 * i).lsrc(2) := dest + (2 * i).U 200d91483a6Sfdy csBundle(2 * i).ldest := dest + (2 * i).U 201d91483a6Sfdy csBundle(2 * i).uopIdx := (2 * i).U 202d91483a6Sfdy csBundle(2 * i + 1).lsrc(1) := src2 + i.U 203d91483a6Sfdy csBundle(2 * i + 1).lsrc(2) := dest + (2 * i + 1).U 204d91483a6Sfdy csBundle(2 * i + 1).ldest := dest + (2 * i + 1).U 205d91483a6Sfdy csBundle(2 * i + 1).uopIdx := (2 * i + 1).U 206d91483a6Sfdy } 207d91483a6Sfdy } 20817ec87f2SXuan Hu is(UopSplitType.VEC_EXT4) { 209d91483a6Sfdy for (i <- 0 until MAX_VLMUL / 4) { 210d91483a6Sfdy csBundle(4 * i).lsrc(1) := src2 + i.U 211d91483a6Sfdy csBundle(4 * i).lsrc(2) := dest + (4 * i).U 212d91483a6Sfdy csBundle(4 * i).ldest := dest + (4 * i).U 213d91483a6Sfdy csBundle(4 * i).uopIdx := (4 * i).U 214d91483a6Sfdy csBundle(4 * i + 1).lsrc(1) := src2 + i.U 215d91483a6Sfdy csBundle(4 * i + 1).lsrc(2) := dest + (4 * i + 1).U 216d91483a6Sfdy csBundle(4 * i + 1).ldest := dest + (4 * i + 1).U 217d91483a6Sfdy csBundle(4 * i + 1).uopIdx := (4 * i + 1).U 218d91483a6Sfdy csBundle(4 * i + 2).lsrc(1) := src2 + i.U 219d91483a6Sfdy csBundle(4 * i + 2).lsrc(2) := dest + (4 * i + 2).U 220d91483a6Sfdy csBundle(4 * i + 2).ldest := dest + (4 * i + 2).U 221d91483a6Sfdy csBundle(4 * i + 2).uopIdx := (4 * i + 2).U 222d91483a6Sfdy csBundle(4 * i + 3).lsrc(1) := src2 + i.U 223d91483a6Sfdy csBundle(4 * i + 3).lsrc(2) := dest + (4 * i + 3).U 224d91483a6Sfdy csBundle(4 * i + 3).ldest := dest + (4 * i + 3).U 225d91483a6Sfdy csBundle(4 * i + 3).uopIdx := (4 * i + 3).U 226d91483a6Sfdy } 227d91483a6Sfdy } 22817ec87f2SXuan Hu is(UopSplitType.VEC_EXT8) { 229d91483a6Sfdy for (i <- 0 until MAX_VLMUL) { 230d91483a6Sfdy csBundle(i).lsrc(1) := src2 231d91483a6Sfdy csBundle(i).lsrc(2) := dest + i.U 232d91483a6Sfdy csBundle(i).ldest := dest + i.U 233d91483a6Sfdy csBundle(i).uopIdx := i.U 234d91483a6Sfdy } 235d91483a6Sfdy } 23617ec87f2SXuan Hu is(UopSplitType.VEC_0XV) { 237d91483a6Sfdy /* 238d91483a6Sfdy FMV.D.X 239d91483a6Sfdy */ 240d91483a6Sfdy csBundle(0).srcType(0) := SrcType.reg 241d91483a6Sfdy csBundle(0).srcType(1) := SrcType.imm 242d91483a6Sfdy csBundle(0).lsrc(1) := 0.U 243d91483a6Sfdy csBundle(0).ldest := FP_TMP_REG_MV.U 244d91483a6Sfdy csBundle(0).fuType := FuType.i2f.U 245d91483a6Sfdy csBundle(0).rfWen := false.B 246d91483a6Sfdy csBundle(0).fpWen := true.B 247d91483a6Sfdy csBundle(0).vecWen := false.B 248d91483a6Sfdy csBundle(0).fpu.isAddSub := false.B 249d91483a6Sfdy csBundle(0).fpu.typeTagIn := FPU.D 250d91483a6Sfdy csBundle(0).fpu.typeTagOut := FPU.D 251d91483a6Sfdy csBundle(0).fpu.fromInt := true.B 252d91483a6Sfdy csBundle(0).fpu.wflags := false.B 253d91483a6Sfdy csBundle(0).fpu.fpWen := true.B 254d91483a6Sfdy csBundle(0).fpu.div := false.B 255d91483a6Sfdy csBundle(0).fpu.sqrt := false.B 256d91483a6Sfdy csBundle(0).fpu.fcvt := false.B 257d91483a6Sfdy /* 258d91483a6Sfdy vfmv.s.f 259d91483a6Sfdy */ 260d91483a6Sfdy csBundle(1).srcType(0) := SrcType.fp 261d91483a6Sfdy csBundle(1).srcType(1) := SrcType.vp 262d91483a6Sfdy csBundle(1).srcType(2) := SrcType.vp 263d91483a6Sfdy csBundle(1).lsrc(0) := FP_TMP_REG_MV.U 264d91483a6Sfdy csBundle(1).lsrc(1) := 0.U 265d91483a6Sfdy csBundle(1).lsrc(2) := dest 266d91483a6Sfdy csBundle(1).ldest := dest 267d91483a6Sfdy csBundle(1).fuType := FuType.vppu.U 26817ec87f2SXuan Hu csBundle(1).fuOpType := VpermType.dummy 269d91483a6Sfdy csBundle(1).rfWen := false.B 270d91483a6Sfdy csBundle(1).fpWen := false.B 271d91483a6Sfdy csBundle(1).vecWen := true.B 272d91483a6Sfdy } 27317ec87f2SXuan Hu is(UopSplitType.VEC_VXV) { 274d91483a6Sfdy /* 275d91483a6Sfdy FMV.D.X 276d91483a6Sfdy */ 277d91483a6Sfdy csBundle(0).srcType(0) := SrcType.reg 278d91483a6Sfdy csBundle(0).srcType(1) := SrcType.imm 279d91483a6Sfdy csBundle(0).lsrc(1) := 0.U 280d91483a6Sfdy csBundle(0).ldest := FP_TMP_REG_MV.U 281d91483a6Sfdy csBundle(0).fuType := FuType.i2f.U 282d91483a6Sfdy csBundle(0).rfWen := false.B 283d91483a6Sfdy csBundle(0).fpWen := true.B 284d91483a6Sfdy csBundle(0).vecWen := false.B 285d91483a6Sfdy csBundle(0).fpu.isAddSub := false.B 286d91483a6Sfdy csBundle(0).fpu.typeTagIn := FPU.D 287d91483a6Sfdy csBundle(0).fpu.typeTagOut := FPU.D 288d91483a6Sfdy csBundle(0).fpu.fromInt := true.B 289d91483a6Sfdy csBundle(0).fpu.wflags := false.B 290d91483a6Sfdy csBundle(0).fpu.fpWen := true.B 291d91483a6Sfdy csBundle(0).fpu.div := false.B 292d91483a6Sfdy csBundle(0).fpu.sqrt := false.B 293d91483a6Sfdy csBundle(0).fpu.fcvt := false.B 294d91483a6Sfdy /* 295d91483a6Sfdy LMUL 296d91483a6Sfdy */ 297d91483a6Sfdy for (i <- 0 until MAX_VLMUL) { 298d91483a6Sfdy csBundle(i + 1).srcType(0) := SrcType.fp 299d91483a6Sfdy csBundle(i + 1).lsrc(0) := FP_TMP_REG_MV.U 300d91483a6Sfdy csBundle(i + 1).lsrc(1) := src2 + i.U 301d91483a6Sfdy csBundle(i + 1).lsrc(2) := dest + i.U 302d91483a6Sfdy csBundle(i + 1).ldest := dest + i.U 303d91483a6Sfdy csBundle(i + 1).uopIdx := i.U 304d91483a6Sfdy } 305d91483a6Sfdy } 30617ec87f2SXuan Hu is(UopSplitType.VEC_VVW) { 307d91483a6Sfdy for (i <- 0 until MAX_VLMUL / 2) { 308d91483a6Sfdy csBundle(2 * i).lsrc(0) := src1 + i.U 309d91483a6Sfdy csBundle(2 * i).lsrc(1) := src2 + i.U 310d91483a6Sfdy csBundle(2 * i).lsrc(2) := dest + (2 * i).U 311d91483a6Sfdy csBundle(2 * i).ldest := dest + (2 * i).U 312d91483a6Sfdy csBundle(2 * i).uopIdx := (2 * i).U 313d91483a6Sfdy csBundle(2 * i + 1).lsrc(0) := src1 + i.U 314d91483a6Sfdy csBundle(2 * i + 1).lsrc(1) := src2 + i.U 315d91483a6Sfdy csBundle(2 * i + 1).lsrc(2) := dest + (2 * i + 1).U 316d91483a6Sfdy csBundle(2 * i + 1).ldest := dest + (2 * i + 1).U 317d91483a6Sfdy csBundle(2 * i + 1).uopIdx := (2 * i + 1).U 318d91483a6Sfdy } 319d91483a6Sfdy } 3203748ec56Sxiaofeibao-xjtu is(UopSplitType.VEC_VFW) { 3213748ec56Sxiaofeibao-xjtu for (i <- 0 until MAX_VLMUL / 2) { 3223748ec56Sxiaofeibao-xjtu csBundle(2 * i).lsrc(0) := src1 3233748ec56Sxiaofeibao-xjtu csBundle(2 * i).lsrc(1) := src2 + i.U 3243748ec56Sxiaofeibao-xjtu csBundle(2 * i).lsrc(2) := dest + (2 * i).U 3253748ec56Sxiaofeibao-xjtu csBundle(2 * i).ldest := dest + (2 * i).U 3263748ec56Sxiaofeibao-xjtu csBundle(2 * i).uopIdx := (2 * i).U 3273748ec56Sxiaofeibao-xjtu csBundle(2 * i + 1).lsrc(0) := src1 3283748ec56Sxiaofeibao-xjtu csBundle(2 * i + 1).lsrc(1) := src2 + i.U 3293748ec56Sxiaofeibao-xjtu csBundle(2 * i + 1).lsrc(2) := dest + (2 * i + 1).U 3303748ec56Sxiaofeibao-xjtu csBundle(2 * i + 1).ldest := dest + (2 * i + 1).U 3313748ec56Sxiaofeibao-xjtu csBundle(2 * i + 1).uopIdx := (2 * i + 1).U 3323748ec56Sxiaofeibao-xjtu } 3333748ec56Sxiaofeibao-xjtu } 33417ec87f2SXuan Hu is(UopSplitType.VEC_WVW) { 335d91483a6Sfdy for (i <- 0 until MAX_VLMUL / 2) { 336d91483a6Sfdy csBundle(2 * i).lsrc(0) := src1 + i.U 337d91483a6Sfdy csBundle(2 * i).lsrc(1) := src2 + (2 * i).U 338d91483a6Sfdy csBundle(2 * i).lsrc(2) := dest + (2 * i).U 339d91483a6Sfdy csBundle(2 * i).ldest := dest + (2 * i).U 340d91483a6Sfdy csBundle(2 * i).uopIdx := (2 * i).U 341d91483a6Sfdy csBundle(2 * i + 1).lsrc(0) := src1 + i.U 342d91483a6Sfdy csBundle(2 * i + 1).lsrc(1) := src2 + (2 * i + 1).U 343d91483a6Sfdy csBundle(2 * i + 1).lsrc(2) := dest + (2 * i + 1).U 344d91483a6Sfdy csBundle(2 * i + 1).ldest := dest + (2 * i + 1).U 345d91483a6Sfdy csBundle(2 * i + 1).uopIdx := (2 * i + 1).U 346d91483a6Sfdy } 347d91483a6Sfdy } 34817ec87f2SXuan Hu is(UopSplitType.VEC_VXW) { 349d91483a6Sfdy /* 350d91483a6Sfdy FMV.D.X 351d91483a6Sfdy */ 352d91483a6Sfdy csBundle(0).srcType(0) := SrcType.reg 353d91483a6Sfdy csBundle(0).srcType(1) := SrcType.imm 354d91483a6Sfdy csBundle(0).lsrc(1) := 0.U 355d91483a6Sfdy csBundle(0).ldest := FP_TMP_REG_MV.U 356d91483a6Sfdy csBundle(0).fuType := FuType.i2f.U 357d91483a6Sfdy csBundle(0).rfWen := false.B 358d91483a6Sfdy csBundle(0).fpWen := true.B 359d91483a6Sfdy csBundle(0).vecWen := false.B 360d91483a6Sfdy csBundle(0).fpu.isAddSub := false.B 361d91483a6Sfdy csBundle(0).fpu.typeTagIn := FPU.D 362d91483a6Sfdy csBundle(0).fpu.typeTagOut := FPU.D 363d91483a6Sfdy csBundle(0).fpu.fromInt := true.B 364d91483a6Sfdy csBundle(0).fpu.wflags := false.B 365d91483a6Sfdy csBundle(0).fpu.fpWen := true.B 366d91483a6Sfdy csBundle(0).fpu.div := false.B 367d91483a6Sfdy csBundle(0).fpu.sqrt := false.B 368d91483a6Sfdy csBundle(0).fpu.fcvt := false.B 369d91483a6Sfdy 370d91483a6Sfdy for (i <- 0 until MAX_VLMUL / 2) { 371d91483a6Sfdy csBundle(2 * i + 1).srcType(0) := SrcType.fp 372d91483a6Sfdy csBundle(2 * i + 1).lsrc(0) := FP_TMP_REG_MV.U 373d91483a6Sfdy csBundle(2 * i + 1).lsrc(1) := src2 + i.U 374d91483a6Sfdy csBundle(2 * i + 1).lsrc(2) := dest + (2 * i).U 375d91483a6Sfdy csBundle(2 * i + 1).ldest := dest + (2 * i).U 376d91483a6Sfdy csBundle(2 * i + 1).uopIdx := (2 * i).U 377d91483a6Sfdy csBundle(2 * i + 2).srcType(0) := SrcType.fp 378d91483a6Sfdy csBundle(2 * i + 2).lsrc(0) := FP_TMP_REG_MV.U 379d91483a6Sfdy csBundle(2 * i + 2).lsrc(1) := src2 + i.U 380d91483a6Sfdy csBundle(2 * i + 2).lsrc(2) := dest + (2 * i + 1).U 381d91483a6Sfdy csBundle(2 * i + 2).ldest := dest + (2 * i + 1).U 382d91483a6Sfdy csBundle(2 * i + 2).uopIdx := (2 * i + 1).U 383d91483a6Sfdy } 384d91483a6Sfdy } 38517ec87f2SXuan Hu is(UopSplitType.VEC_WXW) { 386d91483a6Sfdy /* 387d91483a6Sfdy FMV.D.X 388d91483a6Sfdy */ 389d91483a6Sfdy csBundle(0).srcType(0) := SrcType.reg 390d91483a6Sfdy csBundle(0).srcType(1) := SrcType.imm 391d91483a6Sfdy csBundle(0).lsrc(1) := 0.U 392d91483a6Sfdy csBundle(0).ldest := FP_TMP_REG_MV.U 393d91483a6Sfdy csBundle(0).fuType := FuType.i2f.U 394d91483a6Sfdy csBundle(0).rfWen := false.B 395d91483a6Sfdy csBundle(0).fpWen := true.B 396d91483a6Sfdy csBundle(0).vecWen := false.B 397d91483a6Sfdy csBundle(0).fpu.isAddSub := false.B 398d91483a6Sfdy csBundle(0).fpu.typeTagIn := FPU.D 399d91483a6Sfdy csBundle(0).fpu.typeTagOut := FPU.D 400d91483a6Sfdy csBundle(0).fpu.fromInt := true.B 401d91483a6Sfdy csBundle(0).fpu.wflags := false.B 402d91483a6Sfdy csBundle(0).fpu.fpWen := true.B 403d91483a6Sfdy csBundle(0).fpu.div := false.B 404d91483a6Sfdy csBundle(0).fpu.sqrt := false.B 405d91483a6Sfdy csBundle(0).fpu.fcvt := false.B 406d91483a6Sfdy 407d91483a6Sfdy for (i <- 0 until MAX_VLMUL / 2) { 408d91483a6Sfdy csBundle(2 * i + 1).srcType(0) := SrcType.fp 409d91483a6Sfdy csBundle(2 * i + 1).lsrc(0) := FP_TMP_REG_MV.U 410d91483a6Sfdy csBundle(2 * i + 1).lsrc(1) := src2 + (2 * i).U 411d91483a6Sfdy csBundle(2 * i + 1).lsrc(2) := dest + (2 * i).U 412d91483a6Sfdy csBundle(2 * i + 1).ldest := dest + (2 * i).U 413d91483a6Sfdy csBundle(2 * i + 1).uopIdx := (2 * i).U 414d91483a6Sfdy csBundle(2 * i + 2).srcType(0) := SrcType.fp 415d91483a6Sfdy csBundle(2 * i + 2).lsrc(0) := FP_TMP_REG_MV.U 416d91483a6Sfdy csBundle(2 * i + 2).lsrc(1) := src2 + (2 * i + 1).U 417d91483a6Sfdy csBundle(2 * i + 2).lsrc(2) := dest + (2 * i + 1).U 418d91483a6Sfdy csBundle(2 * i + 2).ldest := dest + (2 * i + 1).U 419d91483a6Sfdy csBundle(2 * i + 2).uopIdx := (2 * i + 1).U 420d91483a6Sfdy } 421d91483a6Sfdy } 42217ec87f2SXuan Hu is(UopSplitType.VEC_WVV) { 423d91483a6Sfdy for (i <- 0 until MAX_VLMUL / 2) { 424d91483a6Sfdy 425d91483a6Sfdy csBundle(2 * i).lsrc(0) := src1 + i.U 426d91483a6Sfdy csBundle(2 * i).lsrc(1) := src2 + (2 * i).U 427d91483a6Sfdy csBundle(2 * i).lsrc(2) := dest + i.U 428d6f9198fSXuan Hu csBundle(2 * i).ldest := dest + i.U 429d91483a6Sfdy csBundle(2 * i).uopIdx := (2 * i).U 430d91483a6Sfdy csBundle(2 * i + 1).lsrc(0) := src1 + i.U 431d91483a6Sfdy csBundle(2 * i + 1).lsrc(1) := src2 + (2 * i + 1).U 432d6f9198fSXuan Hu csBundle(2 * i + 1).lsrc(2) := dest + i.U 433d91483a6Sfdy csBundle(2 * i + 1).ldest := dest + i.U 434d91483a6Sfdy csBundle(2 * i + 1).uopIdx := (2 * i + 1).U 435d91483a6Sfdy } 436d91483a6Sfdy } 4373748ec56Sxiaofeibao-xjtu is(UopSplitType.VEC_WFW) { 4383748ec56Sxiaofeibao-xjtu for (i <- 0 until MAX_VLMUL / 2) { 4393748ec56Sxiaofeibao-xjtu csBundle(2 * i).lsrc(0) := src1 4403748ec56Sxiaofeibao-xjtu csBundle(2 * i).lsrc(1) := src2 + (2 * i).U 4413748ec56Sxiaofeibao-xjtu csBundle(2 * i).lsrc(2) := dest + (2 * i).U 4423748ec56Sxiaofeibao-xjtu csBundle(2 * i).ldest := dest + (2 * i).U 4433748ec56Sxiaofeibao-xjtu csBundle(2 * i).uopIdx := (2 * i).U 4443748ec56Sxiaofeibao-xjtu csBundle(2 * i + 1).lsrc(0) := src1 4453748ec56Sxiaofeibao-xjtu csBundle(2 * i + 1).lsrc(1) := src2 + (2 * i + 1).U 4463748ec56Sxiaofeibao-xjtu csBundle(2 * i + 1).lsrc(2) := dest + (2 * i + 1).U 4473748ec56Sxiaofeibao-xjtu csBundle(2 * i + 1).ldest := dest + (2 * i + 1).U 4483748ec56Sxiaofeibao-xjtu csBundle(2 * i + 1).uopIdx := (2 * i + 1).U 4493748ec56Sxiaofeibao-xjtu } 4503748ec56Sxiaofeibao-xjtu } 45117ec87f2SXuan Hu is(UopSplitType.VEC_WXV) { 452d91483a6Sfdy /* 453d91483a6Sfdy FMV.D.X 454d91483a6Sfdy */ 455d91483a6Sfdy csBundle(0).srcType(0) := SrcType.reg 456d91483a6Sfdy csBundle(0).srcType(1) := SrcType.imm 457d91483a6Sfdy csBundle(0).lsrc(1) := 0.U 458d91483a6Sfdy csBundle(0).ldest := FP_TMP_REG_MV.U 459d91483a6Sfdy csBundle(0).fuType := FuType.i2f.U 460d91483a6Sfdy csBundle(0).rfWen := false.B 461d91483a6Sfdy csBundle(0).fpWen := true.B 462d91483a6Sfdy csBundle(0).vecWen := false.B 463d91483a6Sfdy csBundle(0).fpu.isAddSub := false.B 464d91483a6Sfdy csBundle(0).fpu.typeTagIn := FPU.D 465d91483a6Sfdy csBundle(0).fpu.typeTagOut := FPU.D 466d91483a6Sfdy csBundle(0).fpu.fromInt := true.B 467d91483a6Sfdy csBundle(0).fpu.wflags := false.B 468d91483a6Sfdy csBundle(0).fpu.fpWen := true.B 469d91483a6Sfdy csBundle(0).fpu.div := false.B 470d91483a6Sfdy csBundle(0).fpu.sqrt := false.B 471d91483a6Sfdy csBundle(0).fpu.fcvt := false.B 472d91483a6Sfdy 473d91483a6Sfdy for (i <- 0 until MAX_VLMUL / 2) { 474d91483a6Sfdy csBundle(2 * i + 1).srcType(0) := SrcType.fp 475d91483a6Sfdy csBundle(2 * i + 1).lsrc(0) := FP_TMP_REG_MV.U 476d91483a6Sfdy csBundle(2 * i + 1).lsrc(1) := src2 + (2 * i).U 477d91483a6Sfdy csBundle(2 * i + 1).lsrc(2) := dest + i.U 478d6f9198fSXuan Hu csBundle(2 * i + 1).ldest := dest + i.U 479d91483a6Sfdy csBundle(2 * i + 1).uopIdx := (2 * i).U 480d91483a6Sfdy csBundle(2 * i + 2).srcType(0) := SrcType.fp 481d91483a6Sfdy csBundle(2 * i + 2).lsrc(0) := FP_TMP_REG_MV.U 482d91483a6Sfdy csBundle(2 * i + 2).lsrc(1) := src2 + (2 * i + 1).U 483d6f9198fSXuan Hu csBundle(2 * i + 2).lsrc(2) := dest + i.U 484d91483a6Sfdy csBundle(2 * i + 2).ldest := dest + i.U 485d91483a6Sfdy csBundle(2 * i + 2).uopIdx := (2 * i + 1).U 486d91483a6Sfdy } 487d91483a6Sfdy } 48817ec87f2SXuan Hu is(UopSplitType.VEC_VVM) { 489d91483a6Sfdy csBundle(0).lsrc(2) := dest 490d6f9198fSXuan Hu csBundle(0).ldest := dest 491d91483a6Sfdy csBundle(0).uopIdx := 0.U 492d91483a6Sfdy for (i <- 1 until MAX_VLMUL) { 493d91483a6Sfdy csBundle(i).lsrc(0) := src1 + i.U 494d91483a6Sfdy csBundle(i).lsrc(1) := src2 + i.U 495d6f9198fSXuan Hu csBundle(i).lsrc(2) := dest 496d6f9198fSXuan Hu csBundle(i).ldest := dest 497d91483a6Sfdy csBundle(i).uopIdx := i.U 498d91483a6Sfdy } 499d91483a6Sfdy csBundle(numOfUop - 1.U).ldest := dest 500d91483a6Sfdy } 501*f06d6d60Sxiaofeibao-xjtu is(UopSplitType.VEC_VFM) { 502*f06d6d60Sxiaofeibao-xjtu csBundle(0).lsrc(2) := dest 503*f06d6d60Sxiaofeibao-xjtu csBundle(0).ldest := dest 504*f06d6d60Sxiaofeibao-xjtu csBundle(0).uopIdx := 0.U 505*f06d6d60Sxiaofeibao-xjtu for (i <- 1 until MAX_VLMUL) { 506*f06d6d60Sxiaofeibao-xjtu csBundle(i).lsrc(0) := src1 507*f06d6d60Sxiaofeibao-xjtu csBundle(i).lsrc(1) := src2 + i.U 508*f06d6d60Sxiaofeibao-xjtu csBundle(i).lsrc(2) := dest 509*f06d6d60Sxiaofeibao-xjtu csBundle(i).ldest := dest 510*f06d6d60Sxiaofeibao-xjtu csBundle(i).uopIdx := i.U 511*f06d6d60Sxiaofeibao-xjtu } 512*f06d6d60Sxiaofeibao-xjtu csBundle(numOfUop - 1.U).ldest := dest 513*f06d6d60Sxiaofeibao-xjtu } 51417ec87f2SXuan Hu is(UopSplitType.VEC_VXM) { 515d91483a6Sfdy /* 516d91483a6Sfdy FMV.D.X 517d91483a6Sfdy */ 518d91483a6Sfdy csBundle(0).srcType(0) := SrcType.reg 519d91483a6Sfdy csBundle(0).srcType(1) := SrcType.imm 520d91483a6Sfdy csBundle(0).lsrc(1) := 0.U 521d91483a6Sfdy csBundle(0).ldest := FP_TMP_REG_MV.U 522d91483a6Sfdy csBundle(0).fuType := FuType.i2f.U 523d91483a6Sfdy csBundle(0).rfWen := false.B 524d91483a6Sfdy csBundle(0).fpWen := true.B 525d91483a6Sfdy csBundle(0).vecWen := false.B 526d91483a6Sfdy csBundle(0).fpu.isAddSub := false.B 527d91483a6Sfdy csBundle(0).fpu.typeTagIn := FPU.D 528d91483a6Sfdy csBundle(0).fpu.typeTagOut := FPU.D 529d91483a6Sfdy csBundle(0).fpu.fromInt := true.B 530d91483a6Sfdy csBundle(0).fpu.wflags := false.B 531d91483a6Sfdy csBundle(0).fpu.fpWen := true.B 532d91483a6Sfdy csBundle(0).fpu.div := false.B 533d91483a6Sfdy csBundle(0).fpu.sqrt := false.B 534d91483a6Sfdy csBundle(0).fpu.fcvt := false.B 535d91483a6Sfdy //LMUL 536d91483a6Sfdy csBundle(1).srcType(0) := SrcType.fp 537d91483a6Sfdy csBundle(1).lsrc(0) := FP_TMP_REG_MV.U 538d91483a6Sfdy csBundle(1).lsrc(2) := dest 539d6f9198fSXuan Hu csBundle(1).ldest := dest 540d91483a6Sfdy csBundle(1).uopIdx := 0.U 541d91483a6Sfdy for (i <- 1 until MAX_VLMUL) { 542d91483a6Sfdy csBundle(i + 1).srcType(0) := SrcType.fp 543d91483a6Sfdy csBundle(i + 1).lsrc(0) := FP_TMP_REG_MV.U 544d91483a6Sfdy csBundle(i + 1).lsrc(1) := src2 + i.U 545d6f9198fSXuan Hu csBundle(i + 1).lsrc(2) := dest 546d6f9198fSXuan Hu csBundle(i + 1).ldest := dest 547d91483a6Sfdy csBundle(i + 1).uopIdx := i.U 548d91483a6Sfdy } 549d91483a6Sfdy csBundle(numOfUop - 1.U).ldest := dest 550d91483a6Sfdy } 55117ec87f2SXuan Hu is(UopSplitType.VEC_SLIDE1UP) { 552d91483a6Sfdy /* 553d91483a6Sfdy FMV.D.X 554d91483a6Sfdy */ 555d91483a6Sfdy csBundle(0).srcType(0) := SrcType.reg 556d91483a6Sfdy csBundle(0).srcType(1) := SrcType.imm 557d91483a6Sfdy csBundle(0).lsrc(1) := 0.U 558d91483a6Sfdy csBundle(0).ldest := FP_TMP_REG_MV.U 559d91483a6Sfdy csBundle(0).fuType := FuType.i2f.U 560d91483a6Sfdy csBundle(0).rfWen := false.B 561d91483a6Sfdy csBundle(0).fpWen := true.B 562d91483a6Sfdy csBundle(0).vecWen := false.B 563d91483a6Sfdy csBundle(0).fpu.isAddSub := false.B 564d91483a6Sfdy csBundle(0).fpu.typeTagIn := FPU.D 565d91483a6Sfdy csBundle(0).fpu.typeTagOut := FPU.D 566d91483a6Sfdy csBundle(0).fpu.fromInt := true.B 567d91483a6Sfdy csBundle(0).fpu.wflags := false.B 568d91483a6Sfdy csBundle(0).fpu.fpWen := true.B 569d91483a6Sfdy csBundle(0).fpu.div := false.B 570d91483a6Sfdy csBundle(0).fpu.sqrt := false.B 571d91483a6Sfdy csBundle(0).fpu.fcvt := false.B 572d91483a6Sfdy //LMUL 573d91483a6Sfdy csBundle(1).srcType(0) := SrcType.fp 574d91483a6Sfdy csBundle(1).lsrc(0) := FP_TMP_REG_MV.U 575d91483a6Sfdy csBundle(1).lsrc(2) := dest 576d91483a6Sfdy csBundle(1).ldest := dest 577d91483a6Sfdy csBundle(1).uopIdx := 0.U 578d91483a6Sfdy for (i <- 1 until MAX_VLMUL) { 579d91483a6Sfdy csBundle(i + 1).srcType(0) := SrcType.vp 580d91483a6Sfdy csBundle(i + 1).lsrc(0) := src2 + (i - 1).U 581d91483a6Sfdy csBundle(i + 1).lsrc(1) := src2 + i.U 582d91483a6Sfdy csBundle(i + 1).lsrc(2) := dest + i.U 583d91483a6Sfdy csBundle(i + 1).ldest := dest + i.U 584d91483a6Sfdy csBundle(i + 1).uopIdx := i.U 585d91483a6Sfdy } 586d91483a6Sfdy } 58717ec87f2SXuan Hu is(UopSplitType.VEC_FSLIDE1UP) { 588d91483a6Sfdy //LMUL 589d91483a6Sfdy csBundle(0).srcType(0) := SrcType.fp 590d91483a6Sfdy csBundle(0).lsrc(0) := src1 591d91483a6Sfdy csBundle(0).lsrc(1) := src2 592d91483a6Sfdy csBundle(0).lsrc(2) := dest 593d91483a6Sfdy csBundle(0).ldest := dest 594d91483a6Sfdy csBundle(0).uopIdx := 0.U 595d91483a6Sfdy for (i <- 1 until MAX_VLMUL) { 596d91483a6Sfdy csBundle(i).srcType(0) := SrcType.vp 597d91483a6Sfdy csBundle(i).lsrc(0) := src2 + (i - 1).U 598d91483a6Sfdy csBundle(i).lsrc(1) := src2 + i.U 599d91483a6Sfdy csBundle(i).lsrc(2) := dest + i.U 600d91483a6Sfdy csBundle(i).ldest := dest + i.U 601d91483a6Sfdy csBundle(i).uopIdx := i.U 602d91483a6Sfdy } 603d91483a6Sfdy } 60417ec87f2SXuan Hu is(UopSplitType.VEC_SLIDE1DOWN) { // lmul+lmul = 16 605d91483a6Sfdy /* 606d91483a6Sfdy FMV.D.X 607d91483a6Sfdy */ 608d91483a6Sfdy csBundle(0).srcType(0) := SrcType.reg 609d91483a6Sfdy csBundle(0).srcType(1) := SrcType.imm 610d91483a6Sfdy csBundle(0).lsrc(1) := 0.U 611d91483a6Sfdy csBundle(0).ldest := FP_TMP_REG_MV.U 612d91483a6Sfdy csBundle(0).fuType := FuType.i2f.U 613d91483a6Sfdy csBundle(0).rfWen := false.B 614d91483a6Sfdy csBundle(0).fpWen := true.B 615d91483a6Sfdy csBundle(0).vecWen := false.B 616d91483a6Sfdy csBundle(0).fpu.isAddSub := false.B 617d91483a6Sfdy csBundle(0).fpu.typeTagIn := FPU.D 618d91483a6Sfdy csBundle(0).fpu.typeTagOut := FPU.D 619d91483a6Sfdy csBundle(0).fpu.fromInt := true.B 620d91483a6Sfdy csBundle(0).fpu.wflags := false.B 621d91483a6Sfdy csBundle(0).fpu.fpWen := true.B 622d91483a6Sfdy csBundle(0).fpu.div := false.B 623d91483a6Sfdy csBundle(0).fpu.sqrt := false.B 624d91483a6Sfdy csBundle(0).fpu.fcvt := false.B 625d91483a6Sfdy //LMUL 626d91483a6Sfdy for (i <- 0 until MAX_VLMUL) { 627d91483a6Sfdy csBundle(2 * i + 1).srcType(0) := SrcType.vp 628d91483a6Sfdy csBundle(2 * i + 1).srcType(1) := SrcType.vp 629d91483a6Sfdy csBundle(2 * i + 1).lsrc(0) := src2 + (i + 1).U 630d91483a6Sfdy csBundle(2 * i + 1).lsrc(1) := src2 + i.U 631d91483a6Sfdy csBundle(2 * i + 1).lsrc(2) := dest + i.U 632d91483a6Sfdy csBundle(2 * i + 1).ldest := VECTOR_TMP_REG_LMUL.U 633d91483a6Sfdy csBundle(2 * i + 1).uopIdx := (2 * i).U 634d91483a6Sfdy if (2 * i + 2 < MAX_VLMUL * 2) { 635d91483a6Sfdy csBundle(2 * i + 2).srcType(0) := SrcType.fp 636d91483a6Sfdy csBundle(2 * i + 2).lsrc(0) := FP_TMP_REG_MV.U 637d91483a6Sfdy // csBundle(2 * i + 2).lsrc(1) := src2 + i.U // DontCare 638d91483a6Sfdy csBundle(2 * i + 2).lsrc(2) := VECTOR_TMP_REG_LMUL.U 639d91483a6Sfdy csBundle(2 * i + 2).ldest := dest + i.U 640d91483a6Sfdy csBundle(2 * i + 2).uopIdx := (2 * i + 1).U 641d91483a6Sfdy } 642d91483a6Sfdy } 643d91483a6Sfdy csBundle(numOfUop - 1.U).srcType(0) := SrcType.fp 644d91483a6Sfdy csBundle(numOfUop - 1.U).lsrc(0) := FP_TMP_REG_MV.U 645d91483a6Sfdy csBundle(numOfUop - 1.U).ldest := dest + lmul - 1.U 646d91483a6Sfdy } 64717ec87f2SXuan Hu is(UopSplitType.VEC_FSLIDE1DOWN) { 648d91483a6Sfdy //LMUL 649d91483a6Sfdy for (i <- 0 until MAX_VLMUL) { 650d91483a6Sfdy csBundle(2 * i).srcType(0) := SrcType.vp 651d91483a6Sfdy csBundle(2 * i).srcType(1) := SrcType.vp 652d91483a6Sfdy csBundle(2 * i).lsrc(0) := src2 + (i + 1).U 653d91483a6Sfdy csBundle(2 * i).lsrc(1) := src2 + i.U 654d91483a6Sfdy csBundle(2 * i).lsrc(2) := dest + i.U 655d91483a6Sfdy csBundle(2 * i).ldest := VECTOR_TMP_REG_LMUL.U 656d91483a6Sfdy csBundle(2 * i).uopIdx := (2 * i).U 657d91483a6Sfdy csBundle(2 * i + 1).srcType(0) := SrcType.fp 658d91483a6Sfdy csBundle(2 * i + 1).lsrc(0) := src1 659d91483a6Sfdy csBundle(2 * i + 1).lsrc(2) := VECTOR_TMP_REG_LMUL.U 660d91483a6Sfdy csBundle(2 * i + 1).ldest := dest + i.U 661d91483a6Sfdy csBundle(2 * i + 1).uopIdx := (2 * i + 1).U 662d91483a6Sfdy } 663d91483a6Sfdy csBundle(numOfUop - 1.U).srcType(0) := SrcType.fp 664d91483a6Sfdy csBundle(numOfUop - 1.U).lsrc(0) := src1 665d91483a6Sfdy csBundle(numOfUop - 1.U).ldest := dest + lmul - 1.U 666d91483a6Sfdy } 66717ec87f2SXuan Hu is(UopSplitType.VEC_VRED) { 668d91483a6Sfdy when(simple.io.enq.vtype.vlmul === "b001".U) { 669d91483a6Sfdy csBundle(0).srcType(2) := SrcType.DC 670d91483a6Sfdy csBundle(0).lsrc(0) := src2 + 1.U 671d91483a6Sfdy csBundle(0).lsrc(1) := src2 672d91483a6Sfdy csBundle(0).ldest := VECTOR_TMP_REG_LMUL.U 673d91483a6Sfdy csBundle(0).uopIdx := 0.U 674d91483a6Sfdy } 675d91483a6Sfdy when(simple.io.enq.vtype.vlmul === "b010".U) { 676d91483a6Sfdy csBundle(0).srcType(2) := SrcType.DC 677d91483a6Sfdy csBundle(0).lsrc(0) := src2 + 1.U 678d91483a6Sfdy csBundle(0).lsrc(1) := src2 679d91483a6Sfdy csBundle(0).ldest := VECTOR_TMP_REG_LMUL.U 680d91483a6Sfdy csBundle(0).uopIdx := 0.U 681d91483a6Sfdy 682d91483a6Sfdy csBundle(1).srcType(2) := SrcType.DC 683d91483a6Sfdy csBundle(1).lsrc(0) := src2 + 3.U 684d91483a6Sfdy csBundle(1).lsrc(1) := src2 + 2.U 685d91483a6Sfdy csBundle(1).ldest := (VECTOR_TMP_REG_LMUL + 1).U 686d91483a6Sfdy csBundle(1).uopIdx := 1.U 687d91483a6Sfdy 688d91483a6Sfdy csBundle(2).srcType(2) := SrcType.DC 689d91483a6Sfdy csBundle(2).lsrc(0) := (VECTOR_TMP_REG_LMUL + 1).U 690d91483a6Sfdy csBundle(2).lsrc(1) := VECTOR_TMP_REG_LMUL.U 691d91483a6Sfdy csBundle(2).ldest := (VECTOR_TMP_REG_LMUL + 2).U 692d91483a6Sfdy csBundle(2).uopIdx := 2.U 693d91483a6Sfdy } 694d91483a6Sfdy when(simple.io.enq.vtype.vlmul === "b011".U) { 695d91483a6Sfdy for (i <- 0 until MAX_VLMUL) { 696d91483a6Sfdy if (i < MAX_VLMUL - MAX_VLMUL / 2) { 697d91483a6Sfdy csBundle(i).lsrc(0) := src2 + (i * 2 + 1).U 698d91483a6Sfdy csBundle(i).lsrc(1) := src2 + (i * 2).U 699d91483a6Sfdy csBundle(i).ldest := (VECTOR_TMP_REG_LMUL + i).U 700d91483a6Sfdy } else if (i < MAX_VLMUL - MAX_VLMUL / 4) { 701d91483a6Sfdy csBundle(i).lsrc(0) := (VECTOR_TMP_REG_LMUL + (i - MAX_VLMUL / 2) * 2 + 1).U 702d91483a6Sfdy csBundle(i).lsrc(1) := (VECTOR_TMP_REG_LMUL + (i - MAX_VLMUL / 2) * 2).U 703d91483a6Sfdy csBundle(i).ldest := (VECTOR_TMP_REG_LMUL + i).U 704d91483a6Sfdy } else if (i < MAX_VLMUL - MAX_VLMUL / 8) { 705d91483a6Sfdy csBundle(6).lsrc(0) := (VECTOR_TMP_REG_LMUL + 5).U 706d91483a6Sfdy csBundle(6).lsrc(1) := (VECTOR_TMP_REG_LMUL + 4).U 707d91483a6Sfdy csBundle(6).ldest := (VECTOR_TMP_REG_LMUL + 6).U 708d91483a6Sfdy } 709d91483a6Sfdy csBundle(i).srcType(2) := SrcType.DC 710d91483a6Sfdy csBundle(i).uopIdx := i.U 711d91483a6Sfdy } 712d91483a6Sfdy } 713d91483a6Sfdy when(simple.io.enq.vtype.vlmul.orR()) { 714d91483a6Sfdy csBundle(numOfUop - 1.U).srcType(2) := SrcType.vp 715d91483a6Sfdy csBundle(numOfUop - 1.U).lsrc(0) := src1 716d91483a6Sfdy csBundle(numOfUop - 1.U).lsrc(1) := VECTOR_TMP_REG_LMUL.U + numOfUop - 2.U 717d91483a6Sfdy csBundle(numOfUop - 1.U).lsrc(2) := dest 718d91483a6Sfdy csBundle(numOfUop - 1.U).ldest := dest 719d91483a6Sfdy csBundle(numOfUop - 1.U).uopIdx := numOfUop - 1.U 720d91483a6Sfdy } 721d91483a6Sfdy } 722d91483a6Sfdy 72317ec87f2SXuan Hu is(UopSplitType.VEC_SLIDEUP) { 724d91483a6Sfdy // FMV.D.X 725d91483a6Sfdy csBundle(0).srcType(0) := SrcType.reg 726d91483a6Sfdy csBundle(0).srcType(1) := SrcType.imm 727d91483a6Sfdy csBundle(0).lsrc(1) := 0.U 728d91483a6Sfdy csBundle(0).ldest := FP_TMP_REG_MV.U 729d91483a6Sfdy csBundle(0).fuType := FuType.i2f.U 730d91483a6Sfdy csBundle(0).rfWen := false.B 731d91483a6Sfdy csBundle(0).fpWen := true.B 732d91483a6Sfdy csBundle(0).vecWen := false.B 733d91483a6Sfdy csBundle(0).fpu.isAddSub := false.B 734d91483a6Sfdy csBundle(0).fpu.typeTagIn := FPU.D 735d91483a6Sfdy csBundle(0).fpu.typeTagOut := FPU.D 736d91483a6Sfdy csBundle(0).fpu.fromInt := true.B 737d91483a6Sfdy csBundle(0).fpu.wflags := false.B 738d91483a6Sfdy csBundle(0).fpu.fpWen := true.B 739d91483a6Sfdy csBundle(0).fpu.div := false.B 740d91483a6Sfdy csBundle(0).fpu.sqrt := false.B 741d91483a6Sfdy csBundle(0).fpu.fcvt := false.B 742d91483a6Sfdy // LMUL 743d91483a6Sfdy for (i <- 0 until MAX_VLMUL) 744d91483a6Sfdy for (j <- 0 to i) { 7454ee69032SzhanglyGit val old_vd = if (j == 0) { 7464ee69032SzhanglyGit dest + i.U 7474ee69032SzhanglyGit } else (VECTOR_TMP_REG_LMUL + j - 1).U 7484ee69032SzhanglyGit val vd = if (j == i) { 7494ee69032SzhanglyGit dest + i.U 7504ee69032SzhanglyGit } else (VECTOR_TMP_REG_LMUL + j).U 751d91483a6Sfdy csBundle(i * (i + 1) / 2 + j + 1).srcType(0) := SrcType.fp 752d91483a6Sfdy csBundle(i * (i + 1) / 2 + j + 1).lsrc(0) := FP_TMP_REG_MV.U 753d91483a6Sfdy csBundle(i * (i + 1) / 2 + j + 1).lsrc(1) := src2 + j.U 754d91483a6Sfdy csBundle(i * (i + 1) / 2 + j + 1).lsrc(2) := old_vd 755d91483a6Sfdy csBundle(i * (i + 1) / 2 + j + 1).ldest := vd 756d91483a6Sfdy csBundle(i * (i + 1) / 2 + j + 1).uopIdx := (i * (i + 1) / 2 + j).U 757d91483a6Sfdy } 758d91483a6Sfdy } 759d91483a6Sfdy 76017ec87f2SXuan Hu is(UopSplitType.VEC_ISLIDEUP) { 761d91483a6Sfdy // LMUL 762d91483a6Sfdy for (i <- 0 until MAX_VLMUL) 763d91483a6Sfdy for (j <- 0 to i) { 7644ee69032SzhanglyGit val old_vd = if (j == 0) { 7654ee69032SzhanglyGit dest + i.U 7664ee69032SzhanglyGit } else (VECTOR_TMP_REG_LMUL + j - 1).U 7674ee69032SzhanglyGit val vd = if (j == i) { 7684ee69032SzhanglyGit dest + i.U 7694ee69032SzhanglyGit } else (VECTOR_TMP_REG_LMUL + j).U 770d91483a6Sfdy csBundle(i * (i + 1) / 2 + j).lsrc(1) := src2 + j.U 771d91483a6Sfdy csBundle(i * (i + 1) / 2 + j).lsrc(2) := old_vd 772d91483a6Sfdy csBundle(i * (i + 1) / 2 + j).ldest := vd 773d91483a6Sfdy csBundle(i * (i + 1) / 2 + j).uopIdx := (i * (i + 1) / 2 + j).U 774d91483a6Sfdy } 775d91483a6Sfdy } 776d91483a6Sfdy 77717ec87f2SXuan Hu is(UopSplitType.VEC_SLIDEDOWN) { 778d91483a6Sfdy // FMV.D.X 779d91483a6Sfdy csBundle(0).srcType(0) := SrcType.reg 780d91483a6Sfdy csBundle(0).srcType(1) := SrcType.imm 781d91483a6Sfdy csBundle(0).lsrc(1) := 0.U 782d91483a6Sfdy csBundle(0).ldest := FP_TMP_REG_MV.U 783d91483a6Sfdy csBundle(0).fuType := FuType.i2f.U 784d91483a6Sfdy csBundle(0).rfWen := false.B 785d91483a6Sfdy csBundle(0).fpWen := true.B 786d91483a6Sfdy csBundle(0).vecWen := false.B 787d91483a6Sfdy csBundle(0).fpu.isAddSub := false.B 788d91483a6Sfdy csBundle(0).fpu.typeTagIn := FPU.D 789d91483a6Sfdy csBundle(0).fpu.typeTagOut := FPU.D 790d91483a6Sfdy csBundle(0).fpu.fromInt := true.B 791d91483a6Sfdy csBundle(0).fpu.wflags := false.B 792d91483a6Sfdy csBundle(0).fpu.fpWen := true.B 793d91483a6Sfdy csBundle(0).fpu.div := false.B 794d91483a6Sfdy csBundle(0).fpu.sqrt := false.B 795d91483a6Sfdy csBundle(0).fpu.fcvt := false.B 796d91483a6Sfdy // LMUL 797d91483a6Sfdy for (i <- 0 until MAX_VLMUL) 798d91483a6Sfdy for (j <- (0 to i).reverse) { 799d91483a6Sfdy when(i.U < lmul) { 8004ee69032SzhanglyGit val old_vd = if (j == 0) { 8014ee69032SzhanglyGit dest + lmul - 1.U - i.U 8024ee69032SzhanglyGit } else (VECTOR_TMP_REG_LMUL + j - 1).U 8034ee69032SzhanglyGit val vd = if (j == i) { 8044ee69032SzhanglyGit dest + lmul - 1.U - i.U 8054ee69032SzhanglyGit } else (VECTOR_TMP_REG_LMUL + j).U 806d91483a6Sfdy csBundle(numOfUop - (i * (i + 1) / 2 + i - j + 1).U).srcType(0) := SrcType.fp 807d91483a6Sfdy csBundle(numOfUop - (i * (i + 1) / 2 + i - j + 1).U).lsrc(0) := FP_TMP_REG_MV.U 808d91483a6Sfdy csBundle(numOfUop - (i * (i + 1) / 2 + i - j + 1).U).lsrc(1) := src2 + lmul - 1.U - j.U 809d91483a6Sfdy csBundle(numOfUop - (i * (i + 1) / 2 + i - j + 1).U).lsrc(2) := old_vd 810d91483a6Sfdy csBundle(numOfUop - (i * (i + 1) / 2 + i - j + 1).U).ldest := vd 811d91483a6Sfdy csBundle(numOfUop - (i * (i + 1) / 2 + i - j + 1).U).uopIdx := numOfUop - (i * (i + 1) / 2 + i - j + 2).U 812d91483a6Sfdy } 813d91483a6Sfdy } 814d91483a6Sfdy } 815d91483a6Sfdy 81617ec87f2SXuan Hu is(UopSplitType.VEC_ISLIDEDOWN) { 817d91483a6Sfdy // LMUL 818d91483a6Sfdy for (i <- 0 until MAX_VLMUL) 819d91483a6Sfdy for (j <- (0 to i).reverse) { 820d91483a6Sfdy when(i.U < lmul) { 8214ee69032SzhanglyGit val old_vd = if (j == 0) { 8224ee69032SzhanglyGit dest + lmul - 1.U - i.U 8234ee69032SzhanglyGit } else (VECTOR_TMP_REG_LMUL + j - 1).U 8244ee69032SzhanglyGit val vd = if (j == i) { 8254ee69032SzhanglyGit dest + lmul - 1.U - i.U 8264ee69032SzhanglyGit } else (VECTOR_TMP_REG_LMUL + j).U 827d91483a6Sfdy csBundle(numOfUop - (i * (i + 1) / 2 + i - j + 1).U).lsrc(1) := src2 + lmul - 1.U - j.U 828d91483a6Sfdy csBundle(numOfUop - (i * (i + 1) / 2 + i - j + 1).U).lsrc(2) := old_vd 829d91483a6Sfdy csBundle(numOfUop - (i * (i + 1) / 2 + i - j + 1).U).ldest := vd 830d91483a6Sfdy csBundle(numOfUop - (i * (i + 1) / 2 + i - j + 1).U).uopIdx := numOfUop - (i * (i + 1) / 2 + i - j + 1).U 831d91483a6Sfdy } 832d91483a6Sfdy } 833d91483a6Sfdy } 834d91483a6Sfdy 83517ec87f2SXuan Hu is(UopSplitType.VEC_M0X) { 836d91483a6Sfdy // LMUL 837d91483a6Sfdy for (i <- 0 until MAX_VLMUL) { 838d91483a6Sfdy val srcType0 = if (i == 0) SrcType.DC else SrcType.vp 839d91483a6Sfdy val ldest = (VECTOR_TMP_REG_LMUL + i).U 840d91483a6Sfdy csBundle(i).srcType(0) := srcType0 841d91483a6Sfdy csBundle(i).srcType(1) := SrcType.vp 842d91483a6Sfdy csBundle(i).rfWen := false.B 843d91483a6Sfdy csBundle(i).vecWen := true.B 844d91483a6Sfdy csBundle(i).lsrc(0) := (VECTOR_TMP_REG_LMUL + i - 1).U 845d91483a6Sfdy csBundle(i).lsrc(1) := src2 846d91483a6Sfdy // csBundle(i).lsrc(2) := dest + i.U DontCare 847d91483a6Sfdy csBundle(i).ldest := ldest 848d91483a6Sfdy csBundle(i).uopIdx := i.U 849d91483a6Sfdy } 850d91483a6Sfdy csBundle(lmul - 1.U).vecWen := false.B 851d91483a6Sfdy csBundle(lmul - 1.U).fpWen := true.B 852d91483a6Sfdy csBundle(lmul - 1.U).ldest := FP_TMP_REG_MV.U 853d91483a6Sfdy // FMV_X_D 854d91483a6Sfdy csBundle(lmul).srcType(0) := SrcType.fp 855d91483a6Sfdy csBundle(lmul).srcType(1) := SrcType.imm 856d91483a6Sfdy csBundle(lmul).lsrc(0) := FP_TMP_REG_MV.U 857d91483a6Sfdy csBundle(lmul).lsrc(1) := 0.U 858d91483a6Sfdy csBundle(lmul).ldest := dest 859d91483a6Sfdy csBundle(lmul).fuType := FuType.fmisc.U 860d91483a6Sfdy csBundle(lmul).rfWen := true.B 861d91483a6Sfdy csBundle(lmul).fpWen := false.B 862d91483a6Sfdy csBundle(lmul).vecWen := false.B 863d91483a6Sfdy csBundle(lmul).fpu.isAddSub := false.B 864d91483a6Sfdy csBundle(lmul).fpu.typeTagIn := FPU.D 865d91483a6Sfdy csBundle(lmul).fpu.typeTagOut := FPU.D 866d91483a6Sfdy csBundle(lmul).fpu.fromInt := false.B 867d91483a6Sfdy csBundle(lmul).fpu.wflags := false.B 868d91483a6Sfdy csBundle(lmul).fpu.fpWen := false.B 869d91483a6Sfdy csBundle(lmul).fpu.div := false.B 870d91483a6Sfdy csBundle(lmul).fpu.sqrt := false.B 871d91483a6Sfdy csBundle(lmul).fpu.fcvt := false.B 872d91483a6Sfdy } 873d91483a6Sfdy 87417ec87f2SXuan Hu is(UopSplitType.VEC_MVV) { 875d91483a6Sfdy // LMUL 876d91483a6Sfdy for (i <- 0 until MAX_VLMUL) { 877d91483a6Sfdy val srcType0 = if (i == 0) SrcType.DC else SrcType.vp 878d91483a6Sfdy csBundle(i * 2 + 0).srcType(0) := srcType0 879d91483a6Sfdy csBundle(i * 2 + 0).srcType(1) := SrcType.vp 880d91483a6Sfdy csBundle(i * 2 + 0).lsrc(0) := (VECTOR_TMP_REG_LMUL + i - 1).U 881d91483a6Sfdy csBundle(i * 2 + 0).lsrc(1) := src2 882d91483a6Sfdy csBundle(i * 2 + 0).lsrc(2) := dest + i.U 883d91483a6Sfdy csBundle(i * 2 + 0).ldest := dest + i.U 884d91483a6Sfdy csBundle(i * 2 + 0).uopIdx := (i * 2 + 0).U 885d91483a6Sfdy 886d91483a6Sfdy csBundle(i * 2 + 1).srcType(0) := srcType0 887d91483a6Sfdy csBundle(i * 2 + 1).srcType(1) := SrcType.vp 888d91483a6Sfdy csBundle(i * 2 + 1).lsrc(0) := (VECTOR_TMP_REG_LMUL + i - 1).U 889d91483a6Sfdy csBundle(i * 2 + 1).lsrc(1) := src2 890d91483a6Sfdy // csBundle(i).lsrc(2) := dest + i.U DontCare 891d91483a6Sfdy csBundle(i * 2 + 1).ldest := (VECTOR_TMP_REG_LMUL + i).U 892d91483a6Sfdy csBundle(i * 2 + 1).uopIdx := (i * 2 + 1).U 893d91483a6Sfdy } 894d91483a6Sfdy } 895d91483a6Sfdy 89617ec87f2SXuan Hu is(UopSplitType.VEC_M0X_VFIRST) { 897d91483a6Sfdy // LMUL 898d91483a6Sfdy csBundle(0).rfWen := false.B 899d91483a6Sfdy csBundle(0).fpWen := true.B 900d91483a6Sfdy csBundle(0).ldest := FP_TMP_REG_MV.U 901d91483a6Sfdy // FMV_X_D 902d91483a6Sfdy csBundle(1).srcType(0) := SrcType.fp 903d91483a6Sfdy csBundle(1).srcType(1) := SrcType.imm 904d91483a6Sfdy csBundle(1).lsrc(0) := FP_TMP_REG_MV.U 905d91483a6Sfdy csBundle(1).lsrc(1) := 0.U 906d91483a6Sfdy csBundle(1).ldest := dest 907d91483a6Sfdy csBundle(1).fuType := FuType.fmisc.U 908d91483a6Sfdy csBundle(1).rfWen := true.B 909d91483a6Sfdy csBundle(1).fpWen := false.B 910d91483a6Sfdy csBundle(1).vecWen := false.B 911d91483a6Sfdy csBundle(1).fpu.isAddSub := false.B 912d91483a6Sfdy csBundle(1).fpu.typeTagIn := FPU.D 913d91483a6Sfdy csBundle(1).fpu.typeTagOut := FPU.D 914d91483a6Sfdy csBundle(1).fpu.fromInt := false.B 915d91483a6Sfdy csBundle(1).fpu.wflags := false.B 916d91483a6Sfdy csBundle(1).fpu.fpWen := false.B 917d91483a6Sfdy csBundle(1).fpu.div := false.B 918d91483a6Sfdy csBundle(1).fpu.sqrt := false.B 919d91483a6Sfdy csBundle(1).fpu.fcvt := false.B 920d91483a6Sfdy } 921189ec863SzhanglyGit is(UopSplitType.VEC_VWW) { 922189ec863SzhanglyGit for (i <- 0 until MAX_VLMUL*2) { 923189ec863SzhanglyGit when(i.U < lmul){ 924189ec863SzhanglyGit csBundle(i).srcType(2) := SrcType.DC 925189ec863SzhanglyGit csBundle(i).lsrc(0) := src2 + i.U 926189ec863SzhanglyGit csBundle(i).lsrc(1) := src2 + i.U 927189ec863SzhanglyGit // csBundle(i).lsrc(2) := dest + (2 * i).U 928189ec863SzhanglyGit csBundle(i).ldest := (VECTOR_TMP_REG_LMUL + i).U 929189ec863SzhanglyGit csBundle(i).uopIdx := i.U 930189ec863SzhanglyGit } otherwise { 931189ec863SzhanglyGit csBundle(i).srcType(2) := SrcType.DC 932189ec863SzhanglyGit csBundle(i).lsrc(0) := VECTOR_TMP_REG_LMUL.U + Cat((i.U-lmul),0.U(1.W)) + 1.U 933189ec863SzhanglyGit csBundle(i).lsrc(1) := VECTOR_TMP_REG_LMUL.U + Cat((i.U-lmul),0.U(1.W)) 934189ec863SzhanglyGit // csBundle(i).lsrc(2) := dest + (2 * i).U 935189ec863SzhanglyGit csBundle(i).ldest := (VECTOR_TMP_REG_LMUL + i).U 936189ec863SzhanglyGit csBundle(i).uopIdx := i.U 937189ec863SzhanglyGit } 938189ec863SzhanglyGit csBundle(numOfUop-1.U).srcType(2) := SrcType.vp 939189ec863SzhanglyGit csBundle(numOfUop-1.U).lsrc(0) := src1 940189ec863SzhanglyGit csBundle(numOfUop-1.U).lsrc(2) := dest 941189ec863SzhanglyGit csBundle(numOfUop-1.U).ldest := dest 942189ec863SzhanglyGit } 943189ec863SzhanglyGit } 944189ec863SzhanglyGit is(UopSplitType.VEC_RGATHER) { 945189ec863SzhanglyGit def genCsBundle_VEC_RGATHER(len:Int): Unit ={ 946189ec863SzhanglyGit for (i <- 0 until len) 947189ec863SzhanglyGit for (j <- 0 until len) { 948189ec863SzhanglyGit // csBundle(i * len + j).srcType(0) := SrcType.vp // SrcType.imm 949189ec863SzhanglyGit // csBundle(i * len + j).srcType(1) := SrcType.vp 950189ec863SzhanglyGit // csBundle(i * len + j).srcType(2) := SrcType.vp 951189ec863SzhanglyGit csBundle(i * len + j).lsrc(0) := src1 + i.U 952189ec863SzhanglyGit csBundle(i * len + j).lsrc(1) := src2 + j.U 953189ec863SzhanglyGit val vd_old = if(j==0) (dest + i.U) else (VECTOR_TMP_REG_LMUL + j - 1).U 954189ec863SzhanglyGit csBundle(i * len + j).lsrc(2) := vd_old 955189ec863SzhanglyGit val vd = if(j==len-1) (dest + i.U) else (VECTOR_TMP_REG_LMUL + j).U 956189ec863SzhanglyGit csBundle(i * len + j).ldest := vd 957189ec863SzhanglyGit csBundle(i * len + j).uopIdx := (i * len + j).U 958189ec863SzhanglyGit } 959189ec863SzhanglyGit } 960189ec863SzhanglyGit switch(simple.io.enq.vtype.vlmul) { 961189ec863SzhanglyGit is("b001".U ){ 962189ec863SzhanglyGit genCsBundle_VEC_RGATHER(2) 963189ec863SzhanglyGit } 964189ec863SzhanglyGit is("b010".U ){ 965189ec863SzhanglyGit genCsBundle_VEC_RGATHER(4) 966189ec863SzhanglyGit } 967189ec863SzhanglyGit is("b011".U ){ 968189ec863SzhanglyGit genCsBundle_VEC_RGATHER(8) 969189ec863SzhanglyGit } 970189ec863SzhanglyGit } 971189ec863SzhanglyGit } 972189ec863SzhanglyGit is(UopSplitType.VEC_RGATHER_VX) { 973189ec863SzhanglyGit def genCsBundle_RGATHER_VX(len:Int): Unit ={ 974189ec863SzhanglyGit for (i <- 0 until len) 975189ec863SzhanglyGit for (j <- 0 until len) { 976189ec863SzhanglyGit csBundle(i * len + j + 1).srcType(0) := SrcType.fp 977189ec863SzhanglyGit // csBundle(i * len + j + 1).srcType(1) := SrcType.vp 978189ec863SzhanglyGit // csBundle(i * len + j + 1).srcType(2) := SrcType.vp 979189ec863SzhanglyGit csBundle(i * len + j + 1).lsrc(0) := FP_TMP_REG_MV.U 980189ec863SzhanglyGit csBundle(i * len + j + 1).lsrc(1) := src2 + j.U 981189ec863SzhanglyGit val vd_old = if(j==0) (dest + i.U) else (VECTOR_TMP_REG_LMUL + j - 1).U 982189ec863SzhanglyGit csBundle(i * len + j + 1).lsrc(2) := vd_old 983189ec863SzhanglyGit val vd = if(j==len-1) (dest + i.U) else (VECTOR_TMP_REG_LMUL + j).U 984189ec863SzhanglyGit csBundle(i * len + j + 1).ldest := vd 985189ec863SzhanglyGit csBundle(i * len + j + 1).uopIdx := (i * len + j).U 986189ec863SzhanglyGit } 987189ec863SzhanglyGit } 988189ec863SzhanglyGit // FMV.D.X 989189ec863SzhanglyGit csBundle(0).srcType(0) := SrcType.reg 990189ec863SzhanglyGit csBundle(0).srcType(1) := SrcType.imm 991189ec863SzhanglyGit csBundle(0).lsrc(1) := 0.U 992189ec863SzhanglyGit csBundle(0).ldest := FP_TMP_REG_MV.U 993189ec863SzhanglyGit csBundle(0).fuType := FuType.i2f.U 994189ec863SzhanglyGit csBundle(0).rfWen := false.B 995189ec863SzhanglyGit csBundle(0).fpWen := true.B 996189ec863SzhanglyGit csBundle(0).vecWen := false.B 997189ec863SzhanglyGit csBundle(0).fpu.isAddSub := false.B 998189ec863SzhanglyGit csBundle(0).fpu.typeTagIn := FPU.D 999189ec863SzhanglyGit csBundle(0).fpu.typeTagOut := FPU.D 1000189ec863SzhanglyGit csBundle(0).fpu.fromInt := true.B 1001189ec863SzhanglyGit csBundle(0).fpu.wflags := false.B 1002189ec863SzhanglyGit csBundle(0).fpu.fpWen := true.B 1003189ec863SzhanglyGit csBundle(0).fpu.div := false.B 1004189ec863SzhanglyGit csBundle(0).fpu.sqrt := false.B 1005189ec863SzhanglyGit csBundle(0).fpu.fcvt := false.B 1006189ec863SzhanglyGit switch(simple.io.enq.vtype.vlmul) { 1007189ec863SzhanglyGit is("b000".U ){ 1008189ec863SzhanglyGit genCsBundle_RGATHER_VX(1) 1009189ec863SzhanglyGit } 1010189ec863SzhanglyGit is("b001".U ){ 1011189ec863SzhanglyGit genCsBundle_RGATHER_VX(2) 1012189ec863SzhanglyGit } 1013189ec863SzhanglyGit is("b010".U ){ 1014189ec863SzhanglyGit genCsBundle_RGATHER_VX(4) 1015189ec863SzhanglyGit } 1016189ec863SzhanglyGit is("b011".U ){ 1017189ec863SzhanglyGit genCsBundle_RGATHER_VX(8) 1018189ec863SzhanglyGit } 1019189ec863SzhanglyGit } 1020189ec863SzhanglyGit } 1021189ec863SzhanglyGit is(UopSplitType.VEC_RGATHEREI16) { 1022189ec863SzhanglyGit def genCsBundle_VEC_RGATHEREI16_SEW8(len:Int): Unit ={ 1023189ec863SzhanglyGit for (i <- 0 until len) 1024189ec863SzhanglyGit for (j <- 0 until len) { 1025189ec863SzhanglyGit val vd_old0 = if(j==0) (dest + i.U) else (VECTOR_TMP_REG_LMUL + j*2-1).U 1026189ec863SzhanglyGit val vd0 = (VECTOR_TMP_REG_LMUL + j*2 ).U 1027189ec863SzhanglyGit // csBundle(i * len + j).srcType(0) := SrcType.vp // SrcType.imm 1028189ec863SzhanglyGit // csBundle(i * len + j).srcType(1) := SrcType.vp 1029189ec863SzhanglyGit // csBundle(i * len + j).srcType(2) := SrcType.vp 1030189ec863SzhanglyGit csBundle((i * len + j)*2+0).lsrc(0) := src1 + (i*2+0).U 1031189ec863SzhanglyGit csBundle((i * len + j)*2+0).lsrc(1) := src2 + j.U 1032189ec863SzhanglyGit csBundle((i * len + j)*2+0).lsrc(2) := vd_old0 1033189ec863SzhanglyGit csBundle((i * len + j)*2+0).ldest := vd0 1034189ec863SzhanglyGit csBundle((i * len + j)*2+0).uopIdx := ((i * len + j)*2+0).U 1035189ec863SzhanglyGit val vd_old1 = (VECTOR_TMP_REG_LMUL + j*2).U 1036189ec863SzhanglyGit val vd1 = if(j==len-1) (dest + i.U) else (VECTOR_TMP_REG_LMUL + j*2+1 ).U 1037189ec863SzhanglyGit csBundle((i * len + j)*2+1).lsrc(0) := src1 + (i*2+1).U 1038189ec863SzhanglyGit csBundle((i * len + j)*2+1).lsrc(1) := src2 + j.U 1039189ec863SzhanglyGit csBundle((i * len + j)*2+1).lsrc(2) := vd_old1 1040189ec863SzhanglyGit csBundle((i * len + j)*2+1).ldest := vd1 1041189ec863SzhanglyGit csBundle((i * len + j)*2+1).uopIdx := ((i * len + j)*2+1).U 1042189ec863SzhanglyGit } 1043189ec863SzhanglyGit } 1044189ec863SzhanglyGit def genCsBundle_VEC_RGATHEREI16(len:Int): Unit ={ 1045189ec863SzhanglyGit for (i <- 0 until len) 1046189ec863SzhanglyGit for (j <- 0 until len) { 1047189ec863SzhanglyGit val vd_old = if(j==0) (dest + i.U) else (VECTOR_TMP_REG_LMUL + j-1).U 1048189ec863SzhanglyGit val vd = if(j==len-1) (dest + i.U) else (VECTOR_TMP_REG_LMUL + j).U 1049189ec863SzhanglyGit // csBundle(i * len + j).srcType(0) := SrcType.vp // SrcType.imm 1050189ec863SzhanglyGit // csBundle(i * len + j).srcType(1) := SrcType.vp 1051189ec863SzhanglyGit // csBundle(i * len + j).srcType(2) := SrcType.vp 1052189ec863SzhanglyGit csBundle(i * len + j).lsrc(0) := src1 + i.U 1053189ec863SzhanglyGit csBundle(i * len + j).lsrc(1) := src2 + j.U 1054189ec863SzhanglyGit csBundle(i * len + j).lsrc(2) := vd_old 1055189ec863SzhanglyGit csBundle(i * len + j).ldest := vd 1056189ec863SzhanglyGit csBundle(i * len + j).uopIdx := (i * len + j).U 1057189ec863SzhanglyGit } 1058189ec863SzhanglyGit } 1059189ec863SzhanglyGit switch(simple.io.enq.vtype.vlmul) { 1060189ec863SzhanglyGit is("b000".U ){ 1061189ec863SzhanglyGit when(!simple.io.enq.vtype.vsew.orR){ 1062189ec863SzhanglyGit genCsBundle_VEC_RGATHEREI16_SEW8(1) 1063189ec863SzhanglyGit } .otherwise{ 1064189ec863SzhanglyGit genCsBundle_VEC_RGATHEREI16(1) 1065189ec863SzhanglyGit } 1066189ec863SzhanglyGit } 1067189ec863SzhanglyGit is("b001".U) { 1068189ec863SzhanglyGit when(!simple.io.enq.vtype.vsew.orR) { 1069189ec863SzhanglyGit genCsBundle_VEC_RGATHEREI16_SEW8(2) 1070189ec863SzhanglyGit }.otherwise { 1071189ec863SzhanglyGit genCsBundle_VEC_RGATHEREI16(2) 1072189ec863SzhanglyGit } 1073189ec863SzhanglyGit } 1074189ec863SzhanglyGit is("b010".U) { 1075189ec863SzhanglyGit when(!simple.io.enq.vtype.vsew.orR) { 1076189ec863SzhanglyGit genCsBundle_VEC_RGATHEREI16_SEW8(4) 1077189ec863SzhanglyGit }.otherwise { 1078189ec863SzhanglyGit genCsBundle_VEC_RGATHEREI16(4) 1079189ec863SzhanglyGit } 1080189ec863SzhanglyGit } 1081189ec863SzhanglyGit is("b011".U) { 1082189ec863SzhanglyGit genCsBundle_VEC_RGATHEREI16(8) 1083189ec863SzhanglyGit } 1084189ec863SzhanglyGit } 1085189ec863SzhanglyGit } 1086189ec863SzhanglyGit is(UopSplitType.VEC_COMPRESS) { 1087189ec863SzhanglyGit def genCsBundle_VEC_COMPRESS(len:Int): Unit ={ 1088189ec863SzhanglyGit for (i <- 0 until len){ 1089189ec863SzhanglyGit val jlen = if (i == len-1) i+1 else i+2 1090189ec863SzhanglyGit for (j <- 0 until jlen) { 1091189ec863SzhanglyGit val vd_old = if(i==j) (dest + i.U) else (VECTOR_TMP_REG_LMUL + j + 1).U 1092189ec863SzhanglyGit val vd = if(i==len-1) (dest + j.U) else{ 1093189ec863SzhanglyGit if (j == i+1) VECTOR_TMP_REG_LMUL.U else (VECTOR_TMP_REG_LMUL + j + 1).U 1094189ec863SzhanglyGit } 1095189ec863SzhanglyGit val src23Type = if (j == i+1) DontCare else SrcType.vp 1096189ec863SzhanglyGit csBundle(i*(i+3)/2 + j).srcType(0) := SrcType.vp 1097189ec863SzhanglyGit csBundle(i*(i+3)/2 + j).srcType(1) := src23Type 1098189ec863SzhanglyGit csBundle(i*(i+3)/2 + j).srcType(2) := src23Type 1099189ec863SzhanglyGit csBundle(i*(i+3)/2 + j).lsrc(0) := src1 1100189ec863SzhanglyGit csBundle(i*(i+3)/2 + j).lsrc(1) := src2 + i.U 1101189ec863SzhanglyGit csBundle(i*(i+3)/2 + j).lsrc(2) := vd_old 1102189ec863SzhanglyGit // csBundle(i*(i+3)/2 + j).lsrc(3) := VECTOR_TMP_REG_LMUL.U 1103189ec863SzhanglyGit csBundle(i*(i+3)/2 + j).ldest := vd 1104189ec863SzhanglyGit csBundle(i*(i+3)/2 + j).uopIdx := (i*(i+3)/2 + j).U 1105189ec863SzhanglyGit } 1106189ec863SzhanglyGit } 1107189ec863SzhanglyGit } 1108189ec863SzhanglyGit switch(simple.io.enq.vtype.vlmul) { 1109189ec863SzhanglyGit is("b001".U ){ 1110189ec863SzhanglyGit genCsBundle_VEC_COMPRESS(2) 1111189ec863SzhanglyGit } 1112189ec863SzhanglyGit is("b010".U ){ 1113189ec863SzhanglyGit genCsBundle_VEC_COMPRESS(4) 1114189ec863SzhanglyGit } 1115189ec863SzhanglyGit is("b011".U ){ 1116189ec863SzhanglyGit genCsBundle_VEC_COMPRESS(8) 1117189ec863SzhanglyGit } 1118189ec863SzhanglyGit } 1119189ec863SzhanglyGit } 11204ee69032SzhanglyGit is(UopSplitType.VEC_US_LD) { 11214ee69032SzhanglyGit /* 11224ee69032SzhanglyGit FMV.D.X 11234ee69032SzhanglyGit */ 11244ee69032SzhanglyGit csBundle(0).srcType(0) := SrcType.reg 11254ee69032SzhanglyGit csBundle(0).srcType(1) := SrcType.imm 11264ee69032SzhanglyGit csBundle(0).lsrc(1) := 0.U 11274ee69032SzhanglyGit csBundle(0).ldest := FP_TMP_REG_MV.U 11284ee69032SzhanglyGit csBundle(0).fuType := FuType.i2f.U 11294ee69032SzhanglyGit csBundle(0).rfWen := false.B 11304ee69032SzhanglyGit csBundle(0).fpWen := true.B 11314ee69032SzhanglyGit csBundle(0).vecWen := false.B 11324ee69032SzhanglyGit csBundle(0).fpu.isAddSub := false.B 11334ee69032SzhanglyGit csBundle(0).fpu.typeTagIn := FPU.D 11344ee69032SzhanglyGit csBundle(0).fpu.typeTagOut := FPU.D 11354ee69032SzhanglyGit csBundle(0).fpu.fromInt := true.B 11364ee69032SzhanglyGit csBundle(0).fpu.wflags := false.B 11374ee69032SzhanglyGit csBundle(0).fpu.fpWen := true.B 11384ee69032SzhanglyGit csBundle(0).fpu.div := false.B 11394ee69032SzhanglyGit csBundle(0).fpu.sqrt := false.B 11404ee69032SzhanglyGit csBundle(0).fpu.fcvt := false.B 11414ee69032SzhanglyGit //LMUL 11424ee69032SzhanglyGit for (i <- 0 until MAX_VLMUL) { 11434ee69032SzhanglyGit csBundle(i + 1).srcType(0) := SrcType.fp 11444ee69032SzhanglyGit csBundle(i + 1).lsrc(0) := FP_TMP_REG_MV.U 11454ee69032SzhanglyGit csBundle(i + 1).ldest := dest + i.U 11464ee69032SzhanglyGit csBundle(i + 1).uopIdx := i.U 11474ee69032SzhanglyGit } 11484ee69032SzhanglyGit } 1149d91483a6Sfdy } 1150d91483a6Sfdy 1151d91483a6Sfdy //uops dispatch 1152189ec863SzhanglyGit val s_normal :: s_ext :: Nil = Enum(2) 1153189ec863SzhanglyGit val state = RegInit(s_normal) 1154189ec863SzhanglyGit val state_next = WireDefault(state) 1155d91483a6Sfdy val uopRes = RegInit(0.U) 1156d91483a6Sfdy 1157d91483a6Sfdy //readyFromRename Counter 1158d91483a6Sfdy val readyCounter = PriorityMuxDefault(io.readyFromRename.map(x => !x).zip((0 to (RenameWidth - 1)).map(_.U)), RenameWidth.U) 1159d91483a6Sfdy 1160189ec863SzhanglyGit switch(state) { 1161189ec863SzhanglyGit is(s_normal) { 1162189ec863SzhanglyGit state_next := Mux(io.validFromIBuf(0) && (numOfUop > readyCounter) && (readyCounter =/= 0.U), s_ext, s_normal) 1163d91483a6Sfdy } 1164189ec863SzhanglyGit is(s_ext) { 1165189ec863SzhanglyGit state_next := Mux(io.validFromIBuf(0) && (uopRes > readyCounter), s_ext, s_normal) 1166d91483a6Sfdy } 1167d91483a6Sfdy } 1168d91483a6Sfdy 1169189ec863SzhanglyGit state := state_next 1170189ec863SzhanglyGit 1171189ec863SzhanglyGit val uopRes0 = Mux(state === s_normal, numOfUop, uopRes) 1172189ec863SzhanglyGit val uopResJudge = Mux(state === s_normal, 1173d91483a6Sfdy io.validFromIBuf(0) && (readyCounter =/= 0.U) && (uopRes0 > readyCounter), 1174d91483a6Sfdy io.validFromIBuf(0) && (uopRes0 > readyCounter)) 1175d91483a6Sfdy uopRes := Mux(uopResJudge, uopRes0 - readyCounter, 0.U) 1176d91483a6Sfdy 1177d91483a6Sfdy for(i <- 0 until RenameWidth) { 1178d91483a6Sfdy decodedInsts(i) := MuxCase(csBundle(i), Seq( 1179189ec863SzhanglyGit (state === s_normal) -> csBundle(i), 1180189ec863SzhanglyGit (state === s_ext) -> Mux((i.U + numOfUop -uopRes) < maxUopSize.U, csBundle(i.U + numOfUop - uopRes), csBundle(maxUopSize - 1)) 1181d91483a6Sfdy )) 1182d91483a6Sfdy } 1183d91483a6Sfdy 1184d91483a6Sfdy 1185d91483a6Sfdy val validSimple = Wire(Vec(DecodeWidth - 1, Bool())) 1186d91483a6Sfdy validSimple.zip(io.validFromIBuf.drop(1).zip(io.isComplex)).map{ case (dst, (src1, src2)) => dst := src1 && !src2 } 1187d91483a6Sfdy val notInf = Wire(Vec(DecodeWidth - 1, Bool())) 1188d91483a6Sfdy notInf.zip(io.validFromIBuf.drop(1).zip(validSimple)).map{ case (dst, (src1, src2)) => dst := !src1 || src2 } 1189d91483a6Sfdy val notInfVec = Wire(Vec(DecodeWidth, Bool())) 1190d91483a6Sfdy notInfVec.drop(1).zip(0 until DecodeWidth - 1).map{ case (dst, i) => dst := Cat(notInf.take(i + 1)).andR} 1191d91483a6Sfdy notInfVec(0) := true.B 1192d91483a6Sfdy 1193d91483a6Sfdy complexNum := Mux(io.validFromIBuf(0) && readyCounter.orR , 1194d91483a6Sfdy Mux(uopRes0 > readyCounter, readyCounter, uopRes0), 1195d91483a6Sfdy 1.U) 1196d91483a6Sfdy validToRename.zipWithIndex.foreach{ 1197d91483a6Sfdy case(dst, i) => 1198d91483a6Sfdy dst := MuxCase(false.B, Seq( 1199d91483a6Sfdy (io.validFromIBuf(0) && uopRes0 > readyCounter ) -> Mux(readyCounter > i.U, true.B, false.B), 1200d91483a6Sfdy (io.validFromIBuf(0) && !(uopRes0 > readyCounter)) -> Mux(complexNum > i.U, true.B, validSimple(i.U - complexNum) && notInfVec(i.U - complexNum) && io.readyFromRename(i)), 1201d91483a6Sfdy )) 1202d91483a6Sfdy } 1203d91483a6Sfdy 1204d91483a6Sfdy readyToIBuf.zipWithIndex.foreach { 1205d91483a6Sfdy case (dst, i) => 1206d91483a6Sfdy dst := MuxCase(true.B, Seq( 1207d91483a6Sfdy (io.validFromIBuf(0) && uopRes0 > readyCounter) -> false.B, 1208d91483a6Sfdy (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)), 1209d91483a6Sfdy )) 1210d91483a6Sfdy } 1211d91483a6Sfdy 1212d91483a6Sfdy io.deq.decodedInsts := decodedInsts 1213189ec863SzhanglyGit io.deq.isVset := isVsetSimple 1214d91483a6Sfdy io.deq.complexNum := complexNum 1215d91483a6Sfdy io.deq.validToRename := validToRename 1216d91483a6Sfdy io.deq.readyToIBuf := readyToIBuf 1217d91483a6Sfdy 1218d91483a6Sfdy} 1219