xref: /XiangShan/src/main/scala/xiangshan/backend/fu/Vsetu.scala (revision edace9bf42d3629aa254e3670e6fee86346313e8)
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}