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