xref: /XiangShan/src/main/scala/xiangshan/backend/fu/Vsetu.scala (revision 83ba63b34cf09b33c0a9e1b3203138e51af4491b)
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
19*83ba63b3SXuan Huimport org.chipsalliance.cde.config.Parameters
20edace9bfSxiwenximport chisel3._
21edace9bfSxiwenximport chisel3.util._
223b739f49SXuan Huimport xiangshan._
23a32c56f4SXuan Huimport xiangshan.backend.fu.vector.Bundles.{VConfig, VType, Vl}
24edace9bfSxiwenx
25a32c56f4SXuan Huclass VsetModuleIO(implicit p: Parameters) extends XSBundle {
26a32c56f4SXuan Hu  private val vlWidth = p(XSCoreParamsKey).vlWidth
27a32c56f4SXuan Hu
28a32c56f4SXuan Hu  val in = Input(new Bundle {
29a8db15d8Sfdy    val avl   : UInt = UInt(XLEN.W)
30a32c56f4SXuan Hu    val vtype : VType = VType()
31a32c56f4SXuan Hu    val func  : UInt = FuOpType()
32edace9bfSxiwenx  })
33edace9bfSxiwenx
34a32c56f4SXuan Hu  val out = Output(new Bundle {
35a32c56f4SXuan Hu    val vconfig: VConfig = VConfig()
36a32c56f4SXuan Hu  })
37edace9bfSxiwenx
38a32c56f4SXuan Hu  // test bundle for internal state
39a32c56f4SXuan Hu  val testOut = Output(new Bundle {
40a32c56f4SXuan Hu    val log2Vlmax : UInt = UInt(3.W)
41a32c56f4SXuan Hu    val vlmax     : UInt = UInt(vlWidth.W)
42a32c56f4SXuan Hu  })
43a32c56f4SXuan Hu}
44edace9bfSxiwenx
45a32c56f4SXuan Huclass VsetModule(implicit p: Parameters) extends XSModule {
46a32c56f4SXuan Hu  val io = IO(new VsetModuleIO)
47d91483a6Sfdy
48a32c56f4SXuan Hu  private val avl   = io.in.avl
49a32c56f4SXuan Hu  private val func  = io.in.func
50a32c56f4SXuan Hu  private val vtype = io.in.vtype
51a32c56f4SXuan Hu
52a32c56f4SXuan Hu  private val outVConfig = io.out.vconfig
53a32c56f4SXuan Hu
54a32c56f4SXuan Hu  private val vlWidth = p(XSCoreParamsKey).vlWidth
55a32c56f4SXuan Hu
56a32c56f4SXuan Hu  private val isSetVlmax = VSETOpType.isSetVlmax(func)
57a32c56f4SXuan Hu  private val isVsetivli = VSETOpType.isVsetivli(func)
58a32c56f4SXuan Hu
59a32c56f4SXuan Hu  private val vlmul: UInt = vtype.vlmul
60a32c56f4SXuan Hu  private val vsew : UInt = vtype.vsew
61a32c56f4SXuan Hu
62d91483a6Sfdy  private val vl = WireInit(0.U(XLEN.W))
63edace9bfSxiwenx
64a8db15d8Sfdy  // EncodedLMUL = log(LMUL)
65a8db15d8Sfdy  // EncodedSEW  = log(SEW) - 3
66a32c56f4SXuan Hu  //        VLMAX  = VLEN * LMUL / SEW
67a8db15d8Sfdy  // => log(VLMAX) = log(VLEN * LMUL / SEW)
68a8db15d8Sfdy  // => log(VLMAX) = log(VLEN) + log(LMUL) - log(SEW)
69a8db15d8Sfdy  // =>     VLMAX  = 1 << log(VLMAX)
70a8db15d8Sfdy  //               = 1 << (log(VLEN) + log(LMUL) - log(SEW))
71a32c56f4SXuan Hu
72edace9bfSxiwenx  // vlen =  128
73a32c56f4SXuan Hu  private val log2Vlen = log2Up(VLEN)
74a32c56f4SXuan Hu  println(s"[VsetModule] log2Vlen: $log2Vlen")
75a32c56f4SXuan Hu  println(s"[VsetModule] vlWidth: $vlWidth")
76a8db15d8Sfdy
77a8db15d8Sfdy  private val log2Vlmul = vlmul
78a8db15d8Sfdy  private val log2Vsew = vsew +& "b011".U
79a32c56f4SXuan Hu
80a32c56f4SXuan Hu  // vlen = 128, lmul = 8, sew = 8, log2Vlen = 7,
81a8db15d8Sfdy  // vlmul = b011, vsew = 0, 7 + 3 - (0 + 3) = 7
82a32c56f4SXuan Hu  // vlen = 128, lmul = 2, sew = 16
83a8db15d8Sfdy  // vlmul = b001, vsew = 1, 7 + 1 - (1 + 3) = 4
84a8db15d8Sfdy  private val log2Vlmax: UInt = log2Vlen.U(3.W) + log2Vlmul - log2Vsew
85a8db15d8Sfdy  private val vlmax = (1.U(vlWidth.W) << log2Vlmax).asUInt
86edace9bfSxiwenx
87d91483a6Sfdy  private val normalVL = Mux(avl > vlmax, vlmax, avl)
88edace9bfSxiwenx
89a8db15d8Sfdy  vl := Mux(isSetVlmax, vlmax, normalVL)
90a32c56f4SXuan Hu
91a8db15d8Sfdy  private val log2Elen = log2Up(ELEN)
92a8db15d8Sfdy  private val log2VsewMax = Mux(log2Vlmul(2), log2Elen.U + log2Vlmul, log2Elen.U)
93a8db15d8Sfdy
94a8db15d8Sfdy  private val sewIllegal = log2Vsew > log2VsewMax
95a8db15d8Sfdy  private val lmulIllegal = vlmul === "b100".U
96a8db15d8Sfdy
97a8db15d8Sfdy  private val illegal = lmulIllegal | sewIllegal | vtype.illegal
98a8db15d8Sfdy
99a8db15d8Sfdy  outVConfig.vl := Mux(illegal, 0.U, vl)
100a8db15d8Sfdy  outVConfig.vtype.illegal := illegal
101a8db15d8Sfdy  outVConfig.vtype.vta := Mux(illegal, 0.U, vtype.vta)
102a8db15d8Sfdy  outVConfig.vtype.vma := Mux(illegal, 0.U, vtype.vma)
103a8db15d8Sfdy  outVConfig.vtype.vlmul := Mux(illegal, 0.U, vtype.vlmul)
104a8db15d8Sfdy  outVConfig.vtype.vsew := Mux(illegal, 0.U, vtype.vsew)
105a32c56f4SXuan Hu
106a32c56f4SXuan Hu  io.testOut.vlmax := vlmax
107a32c56f4SXuan Hu  io.testOut.log2Vlmax := log2Vlmax
108edace9bfSxiwenx}
109