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