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*d91483a6Sfdyimport utility.{ParallelMux, ZeroExt} 233b739f49SXuan Huimport xiangshan._ 24edace9bfSxiwenxclass VsetModule(implicit p: Parameters) extends XSModule { 25edace9bfSxiwenx val io = IO(new Bundle() { 26edace9bfSxiwenx val src0 = Input(UInt(XLEN.W)) 27edace9bfSxiwenx val src1 = Input(UInt(XLEN.W)) 28edace9bfSxiwenx val func = Input(FuOpType()) 29*d91483a6Sfdy val oldVConfig = Input(UInt(16.W)) 30edace9bfSxiwenx 31*d91483a6Sfdy val vconfig = Output(UInt(XLEN.W)) 32*d91483a6Sfdy val vl = Output(UInt(XLEN.W)) 33edace9bfSxiwenx }) 34edace9bfSxiwenx 35*d91483a6Sfdy private val vtypeWidth = 8 36*d91483a6Sfdy private val vlWidth = 8 37edace9bfSxiwenx 38*d91483a6Sfdy private val setOldVLFlag = VSETOpType.oldvlFlag(io.func) 39*d91483a6Sfdy private val setVLMAXFlag = VSETOpType.vlmaxFlag(io.func) 40*d91483a6Sfdy private val isVsetivli = VSETOpType.isVsetivli(io.func) 41edace9bfSxiwenx 42*d91483a6Sfdy private val vtype = io.src1(7, 0) 43*d91483a6Sfdy private val vlmul = vtype(2, 0) 44*d91483a6Sfdy private val vsew = vtype(5, 3) 45*d91483a6Sfdy 46*d91483a6Sfdy private val avlImm = ZeroExt(io.src1(14, 10), XLEN) 47*d91483a6Sfdy private val avl = Mux(VSETOpType.isVsetivli(io.func), avlImm, io.src0) 48*d91483a6Sfdy private val oldVL = io.oldVConfig(vtypeWidth + vlWidth - 1, vtypeWidth) 49*d91483a6Sfdy 50*d91483a6Sfdy private val vl = WireInit(0.U(XLEN.W)) 51edace9bfSxiwenx 52edace9bfSxiwenx // vlen = 128 53*d91483a6Sfdy private val vlmaxVec = (0 to 7).map(i => if(i < 4) (16 << i).U(8.W) else (16 >> (8 - i)).U(8.W)) 54*d91483a6Sfdy private val shamt = vlmul + (~vsew).asUInt + 1.U 55*d91483a6Sfdy private val vlmax = ParallelMux((0 to 7).map(_.U === shamt), vlmaxVec) 56edace9bfSxiwenx 57*d91483a6Sfdy private val normalVL = Mux(avl > vlmax, vlmax, avl) 58edace9bfSxiwenx 59*d91483a6Sfdy vl := Mux(isVsetivli, normalVL, 60*d91483a6Sfdy Mux(setOldVLFlag, ZeroExt(oldVL, XLEN), 61*d91483a6Sfdy Mux(setVLMAXFlag, vlmax, normalVL))) 62*d91483a6Sfdy io.vl := vl 63*d91483a6Sfdy io.vconfig := ZeroExt(Cat(vl(7, 0), vtype), XLEN) 64edace9bfSxiwenx} 65