1*edace9bfSxiwenx/*************************************************************************************** 2*edace9bfSxiwenx* Copyright (c) 2020-2021 Institute of Computing Technology, Chinese Academy of Sciences 3*edace9bfSxiwenx* Copyright (c) 2020-2021 Peng Cheng Laboratory 4*edace9bfSxiwenx* 5*edace9bfSxiwenx* XiangShan is licensed under Mulan PSL v2. 6*edace9bfSxiwenx* You can use this software according to the terms and conditions of the Mulan PSL v2. 7*edace9bfSxiwenx* You may obtain a copy of Mulan PSL v2 at: 8*edace9bfSxiwenx* http://license.coscl.org.cn/MulanPSL2 9*edace9bfSxiwenx* 10*edace9bfSxiwenx* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, 11*edace9bfSxiwenx* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, 12*edace9bfSxiwenx* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. 13*edace9bfSxiwenx* 14*edace9bfSxiwenx* See the Mulan PSL v2 for more details. 15*edace9bfSxiwenx***************************************************************************************/ 16*edace9bfSxiwenx 17*edace9bfSxiwenxpackage xiangshan.backend.fu 18*edace9bfSxiwenx 19*edace9bfSxiwenximport chipsalliance.rocketchip.config.Parameters 20*edace9bfSxiwenximport chisel3._ 21*edace9bfSxiwenximport chisel3.util._ 22*edace9bfSxiwenximport xiangshan._ 23*edace9bfSxiwenximport utility.ParallelMux 24*edace9bfSxiwenx 25*edace9bfSxiwenxclass VsetModule(implicit p: Parameters) extends XSModule { 26*edace9bfSxiwenx val io = IO(new Bundle() { 27*edace9bfSxiwenx val lsrc0NotZero = Input(Bool()) 28*edace9bfSxiwenx val ldest = Input(UInt(6.W)) 29*edace9bfSxiwenx val src0 = Input(UInt(XLEN.W)) 30*edace9bfSxiwenx val src1 = Input(UInt(XLEN.W)) 31*edace9bfSxiwenx val func = Input(FuOpType()) 32*edace9bfSxiwenx val vconfig = Input(UInt(16.W)) 33*edace9bfSxiwenx 34*edace9bfSxiwenx val res = Output(UInt(XLEN.W)) 35*edace9bfSxiwenx }) 36*edace9bfSxiwenx 37*edace9bfSxiwenx val vtype = io.src1(7, 0) 38*edace9bfSxiwenx val vlmul = vtype(2, 0) 39*edace9bfSxiwenx val vsew = vtype(5, 3) 40*edace9bfSxiwenx 41*edace9bfSxiwenx val avlImm = Cat(0.U(3.W), io.src1(14, 10)) 42*edace9bfSxiwenx val vlLast = io.vconfig(15, 8) 43*edace9bfSxiwenx 44*edace9bfSxiwenx val rd = io.ldest 45*edace9bfSxiwenx val lsrc0NotZero = io.lsrc0NotZero 46*edace9bfSxiwenx val vl = WireInit(0.U(XLEN.W)) 47*edace9bfSxiwenx val vconfig = WireInit(0.U(XLEN.W)) 48*edace9bfSxiwenx 49*edace9bfSxiwenx // vlen = 128 50*edace9bfSxiwenx val vlmaxVec = (0 to 7).map(i => if(i < 4) (16 << i).U(8.W) else (16 >> (8 - i)).U(8.W)) 51*edace9bfSxiwenx val shamt = vlmul + (~vsew).asUInt + 1.U 52*edace9bfSxiwenx val vlmax = ParallelMux((0 to 7).map(_.U).map(_ === shamt), vlmaxVec) 53*edace9bfSxiwenx 54*edace9bfSxiwenx val isVsetivli = io.func === ALUOpType.vsetivli2 || io.func === ALUOpType.vsetivli1 55*edace9bfSxiwenx val vlWhenRs1Not0 = Mux(isVsetivli, Mux(avlImm > vlmax, vlmax, avlImm), 56*edace9bfSxiwenx Mux(io.src0 > vlmax, vlmax, io.src0)) 57*edace9bfSxiwenx vl := Mux(isVsetivli, Mux(avlImm > vlmax, vlmax, avlImm), 58*edace9bfSxiwenx Mux(lsrc0NotZero, Mux(io.src0 > vlmax, vlmax, io.src0), 59*edace9bfSxiwenx Mux(rd === 0.U, Cat(0.U(56.W), vlLast), vlmax))) 60*edace9bfSxiwenx 61*edace9bfSxiwenx vconfig := Cat(0.U(48.W), vl(7, 0), vtype) 62*edace9bfSxiwenx 63*edace9bfSxiwenx io.res := Mux(io.func === ALUOpType.vsetvli2 || io.func === ALUOpType.vsetvl2 || io.func === ALUOpType.vsetivli2, vl, vconfig) 64*edace9bfSxiwenx} 65*edace9bfSxiwenx 66*edace9bfSxiwenxclass Vset(implicit p: Parameters) extends FUWithRedirect { 67*edace9bfSxiwenx 68*edace9bfSxiwenx val uop = io.in.bits.uop 69*edace9bfSxiwenx 70*edace9bfSxiwenx // vset 71*edace9bfSxiwenx 72*edace9bfSxiwenx val isVset = ALUOpType.isVset(io.in.bits.uop.ctrl.fuOpType) 73*edace9bfSxiwenx val dataModule = Module(new VsetModule) 74*edace9bfSxiwenx 75*edace9bfSxiwenx dataModule.io.lsrc0NotZero := uop.ctrl.imm(15) // lsrc(0) Not Zero 76*edace9bfSxiwenx dataModule.io.ldest := uop.ctrl.ldest 77*edace9bfSxiwenx dataModule.io.src0 := io.in.bits.src(0) 78*edace9bfSxiwenx dataModule.io.src1 := io.in.bits.src(1) 79*edace9bfSxiwenx dataModule.io.func := io.in.bits.uop.ctrl.fuOpType 80*edace9bfSxiwenx dataModule.io.vconfig := uop.ctrl.vconfig 81*edace9bfSxiwenx 82*edace9bfSxiwenx redirectOutValid := false.B 83*edace9bfSxiwenx redirectOut := DontCare 84*edace9bfSxiwenx 85*edace9bfSxiwenx io.in.ready := io.out.ready 86*edace9bfSxiwenx io.out.valid := io.in.valid && isVset 87*edace9bfSxiwenx io.out.bits.uop <> io.in.bits.uop 88*edace9bfSxiwenx io.out.bits.data := dataModule.io.res 89*edace9bfSxiwenx}