1edace9bfSxiwenx/*************************************************************************************** 2edace9bfSxiwenx * Copyright (c) 2020-2021 Institute of Computing Technology, Chinese Academy of Sciences 3edace9bfSxiwenx * Copyright (c) 2020-2021 Peng Cheng Laboratory 4edace9bfSxiwenx * 5edace9bfSxiwenx * XiangShan is licensed under Mulan PSL v2. 6edace9bfSxiwenx * You can use this software according to the terms and conditions of the Mulan PSL v2. 7edace9bfSxiwenx * You may obtain a copy of Mulan PSL v2 at: 8edace9bfSxiwenx * http://license.coscl.org.cn/MulanPSL2 9edace9bfSxiwenx * 10edace9bfSxiwenx * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, 11edace9bfSxiwenx * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, 12edace9bfSxiwenx * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. 13edace9bfSxiwenx * 14edace9bfSxiwenx * See the Mulan PSL v2 for more details. 15edace9bfSxiwenx ***************************************************************************************/ 16edace9bfSxiwenx 17edace9bfSxiwenxpackage xiangshan.backend.fu 18edace9bfSxiwenx 19edace9bfSxiwenximport chipsalliance.rocketchip.config.Parameters 20edace9bfSxiwenximport chisel3._ 21edace9bfSxiwenximport chisel3.util._ 22*a32c56f4SXuan Huimport utility.ZeroExt 233b739f49SXuan Huimport xiangshan._ 24*a32c56f4SXuan Huimport xiangshan.backend.fu.vector.Bundles.{VConfig, VType, Vl} 25edace9bfSxiwenx 26*a32c56f4SXuan Huclass VsetModuleIO(implicit p: Parameters) extends XSBundle { 27*a32c56f4SXuan Hu private val vlWidth = p(XSCoreParamsKey).vlWidth 28*a32c56f4SXuan Hu 29*a32c56f4SXuan Hu val in = Input(new Bundle { 30*a32c56f4SXuan Hu val avl : UInt = Vl() 31*a32c56f4SXuan Hu val vtype : VType = VType() 32*a32c56f4SXuan Hu val func : UInt = FuOpType() 33*a32c56f4SXuan Hu val oldVl : UInt = Vl() // Todo: check if it can be optimized 34edace9bfSxiwenx }) 35edace9bfSxiwenx 36*a32c56f4SXuan Hu val out = Output(new Bundle { 37*a32c56f4SXuan Hu val vconfig: VConfig = VConfig() 38*a32c56f4SXuan Hu }) 39edace9bfSxiwenx 40*a32c56f4SXuan Hu // test bundle for internal state 41*a32c56f4SXuan Hu val testOut = Output(new Bundle { 42*a32c56f4SXuan Hu val log2Vlmax : UInt = UInt(3.W) 43*a32c56f4SXuan Hu val vlmax : UInt = UInt(vlWidth.W) 44*a32c56f4SXuan Hu }) 45*a32c56f4SXuan Hu} 46edace9bfSxiwenx 47*a32c56f4SXuan Huclass VsetModule(implicit p: Parameters) extends XSModule { 48*a32c56f4SXuan Hu val io = IO(new VsetModuleIO) 49d91483a6Sfdy 50*a32c56f4SXuan Hu private val avl = io.in.avl 51*a32c56f4SXuan Hu private val oldVL = io.in.oldVl 52*a32c56f4SXuan Hu private val func = io.in.func 53*a32c56f4SXuan Hu private val vtype = io.in.vtype 54*a32c56f4SXuan Hu 55*a32c56f4SXuan Hu private val outVConfig = io.out.vconfig 56*a32c56f4SXuan Hu 57*a32c56f4SXuan Hu private val vlWidth = p(XSCoreParamsKey).vlWidth 58*a32c56f4SXuan Hu 59*a32c56f4SXuan Hu private val isKeepVl = VSETOpType.isKeepVl(func) 60*a32c56f4SXuan Hu private val isSetVlmax = VSETOpType.isSetVlmax(func) 61*a32c56f4SXuan Hu private val isVsetivli = VSETOpType.isVsetivli(func) 62*a32c56f4SXuan Hu 63*a32c56f4SXuan Hu private val vlmul: UInt = vtype.vlmul 64*a32c56f4SXuan Hu private val vsew : UInt = vtype.vsew 65*a32c56f4SXuan Hu 66d91483a6Sfdy 67d91483a6Sfdy private val vl = WireInit(0.U(XLEN.W)) 68edace9bfSxiwenx 69*a32c56f4SXuan Hu // VLMAX = VLEN * LMUL / SEW 70*a32c56f4SXuan Hu // = VLEN << (Cat(~vlmul(2), vlmul(1,0)) >> (vsew + 1.U) 71*a32c56f4SXuan Hu // = VLEN >> shamt 72*a32c56f4SXuan Hu // shamt = (vsew + 1.U) - (Cat(~vlmul(2), vlmul(1,0)) 73*a32c56f4SXuan Hu 74edace9bfSxiwenx // vlen = 128 75*a32c56f4SXuan Hu private val log2Vlen = log2Up(VLEN) 76*a32c56f4SXuan Hu println(s"[VsetModule] log2Vlen: $log2Vlen") 77*a32c56f4SXuan Hu println(s"[VsetModule] vlWidth: $vlWidth") 78*a32c56f4SXuan Hu // mf8-->b001, m1-->b100, m8-->b111 79*a32c56f4SXuan Hu private val ilmul = Cat(!vlmul(2), vlmul(1, 0)) 80*a32c56f4SXuan Hu 81*a32c56f4SXuan Hu // vlen = 128, lmul = 8, sew = 8, log2Vlen = 7, 82*a32c56f4SXuan Hu // vlmul = b011, ilmul - 4 = b111 - 4 = 3, vsew = 0, vsew + 3 = 3, 7 + (7 - 4) - (0 + 3) = 7 83*a32c56f4SXuan Hu // vlen = 128, lmul = 2, sew = 16 84*a32c56f4SXuan Hu // vlmul = b001, ilmul - 4 = b101 - 4 = 3, vsew = 1, 7 + (5 - 4) - (1 + 3) = 4 85*a32c56f4SXuan Hu private val log2Vlmax: UInt = log2Vlen.U(3.W) + (ilmul - "b100".U) - (vsew + "b011".U) 86*a32c56f4SXuan Hu private val vlmax = (1.U(vlWidth.W) << (log2Vlmax - 1.U)).asUInt 87*a32c56f4SXuan Hu 88*a32c56f4SXuan Hu// private val vlmaxVec: Seq[UInt] = (0 to 7).map(i => if(i < 4) (16 << i).U(8.W) else (16 >> (8 - i)).U(8.W)) 89*a32c56f4SXuan Hu// private val shamt = vlmul + (~vsew).asUInt + 1.U 90*a32c56f4SXuan Hu// private val vlmax = ParallelMux((0 to 7).map(_.U === shamt), vlmaxVec) 91edace9bfSxiwenx 92d91483a6Sfdy private val normalVL = Mux(avl > vlmax, vlmax, avl) 93edace9bfSxiwenx 94*a32c56f4SXuan Hu vl := MuxCase(normalVL, Seq( 95*a32c56f4SXuan Hu isVsetivli -> normalVL, 96*a32c56f4SXuan Hu isKeepVl -> ZeroExt(oldVL, XLEN), 97*a32c56f4SXuan Hu isSetVlmax -> vlmax, 98*a32c56f4SXuan Hu )) 99*a32c56f4SXuan Hu 100*a32c56f4SXuan Hu outVConfig.vl := vl 101*a32c56f4SXuan Hu outVConfig.vtype.illegal := false.B // Todo 102*a32c56f4SXuan Hu outVConfig.vtype.vta := vtype.vta 103*a32c56f4SXuan Hu outVConfig.vtype.vma := vtype.vma 104*a32c56f4SXuan Hu outVConfig.vtype.vlmul := vtype.vlmul 105*a32c56f4SXuan Hu outVConfig.vtype.vsew := vtype.vsew 106*a32c56f4SXuan Hu 107*a32c56f4SXuan Hu io.testOut.vlmax := vlmax 108*a32c56f4SXuan Hu io.testOut.log2Vlmax := log2Vlmax 109edace9bfSxiwenx} 110