xref: /XiangShan/src/main/scala/xiangshan/backend/fu/vector/Bundles.scala (revision 785e3bfdd39261ee799e7c6ca1a1540603b08268)
1b52d4755SXuan Hupackage xiangshan.backend.fu.vector
2b52d4755SXuan Hu
383ba63b3SXuan Huimport org.chipsalliance.cde.config.Parameters
4b52d4755SXuan Huimport chisel3._
5a8db15d8Sfdyimport chisel3.util._
6e6ac7fe1SZiyue Zhangimport xiangshan.XSBundle
7b52d4755SXuan Huimport xiangshan.XSCoreParamsKey
8b52d4755SXuan Huimport xiangshan.backend.decode.isa.bitfield.InstVType
9a8db15d8Sfdyimport xiangshan.backend.fu.VtypeStruct
1042475509SXuan Huimport _root_.utils.NamedUInt
11e43bb916SXuan Huimport utility.ZeroExt
12b52d4755SXuan Hu
13b52d4755SXuan Huobject Bundles {
14b52d4755SXuan Hu
15b52d4755SXuan Hu  /**
16b52d4755SXuan Hu    * vtype bundle, should not used as csr reg
17b52d4755SXuan Hu    */
18a8db15d8Sfdy  class VType(implicit p: Parameters) extends Bundle {
19b52d4755SXuan Hu    val illegal = Bool()
20b52d4755SXuan Hu    val vma     = Bool()
21b52d4755SXuan Hu    val vta     = Bool()
22b52d4755SXuan Hu    val vsew    = VSew()
23b52d4755SXuan Hu    val vlmul   = VLmul()
24b52d4755SXuan Hu  }
25b52d4755SXuan Hu
264c8a449fSZiyue Zhang  /**
274c8a449fSZiyue Zhang    * vset module's vtype bundle, use 3 bits vsew to check if it is illegal
284c8a449fSZiyue Zhang    *
294c8a449fSZiyue Zhang    * we need to get 3 bits vsew in Vtype struct, then vset module can check if it is reserved.
304c8a449fSZiyue Zhang    * and we use 2 bits to store vsew in other places to save space
314c8a449fSZiyue Zhang    */
32e6ac7fe1SZiyue Zhang  class VsetVType(implicit p: Parameters) extends XSBundle {
334c8a449fSZiyue Zhang    val illegal  = Bool()
34e6ac7fe1SZiyue Zhang    val reserved = UInt((XLEN - 9).W)
354c8a449fSZiyue Zhang    val vma      = Bool()
364c8a449fSZiyue Zhang    val vta      = Bool()
374c8a449fSZiyue Zhang    val vsew     = VtypeVSew()
384c8a449fSZiyue Zhang    val vlmul    = VLmul()
394c8a449fSZiyue Zhang  }
404c8a449fSZiyue Zhang
41b52d4755SXuan Hu  object VType {
42a8db15d8Sfdy    def apply()(implicit p: Parameters) : VType = {
43b52d4755SXuan Hu      new VType
44b52d4755SXuan Hu    }
45b52d4755SXuan Hu
46a8db15d8Sfdy    def fromInstVType(instVType: InstVType)(implicit p: Parameters) : VType = {
47b52d4755SXuan Hu      val res = Wire(VType())
48b52d4755SXuan Hu      res.vma   := instVType.vma
49b52d4755SXuan Hu      res.vta   := instVType.vta
50b52d4755SXuan Hu      res.vsew  := instVType.vsew(VSew.width - 1, 0)
51b52d4755SXuan Hu      res.vlmul := instVType.vlmul
52b52d4755SXuan Hu      res.illegal := false.B // Todo: add illegal check function
53b52d4755SXuan Hu      res
54b52d4755SXuan Hu    }
55a8db15d8Sfdy
56a8db15d8Sfdy    def fromVtypeStruct(vtypeStruct: VtypeStruct)(implicit p: Parameters): VType = {
57a8db15d8Sfdy      val res = Wire(VType())
58a8db15d8Sfdy      res.illegal := vtypeStruct.vill
59a8db15d8Sfdy      res.vma := vtypeStruct.vma
60a8db15d8Sfdy      res.vta := vtypeStruct.vta
61a8db15d8Sfdy      res.vsew := vtypeStruct.vsew(VSew.width - 1, 0)
62a8db15d8Sfdy      res.vlmul := vtypeStruct.vlmul
63a8db15d8Sfdy      res
64a8db15d8Sfdy    }
65a8db15d8Sfdy
66a8db15d8Sfdy    def toVtypeStruct(vtype: VType)(implicit p: Parameters) : VtypeStruct = {
67a8db15d8Sfdy      val res = WireInit(0.U.asTypeOf(new VtypeStruct))
68a8db15d8Sfdy      res.vill := vtype.illegal
69a8db15d8Sfdy      res.vma := vtype.vma
70a8db15d8Sfdy      res.vta := vtype.vta
71a8db15d8Sfdy      res.vsew := Cat(0.U(1.W), vtype.vsew)
72a8db15d8Sfdy      res.vlmul := vtype.vlmul
73a8db15d8Sfdy      res
74a8db15d8Sfdy    }
755ae0e5deSZiyue Zhang
765ae0e5deSZiyue Zhang    def initVtype()(implicit p: Parameters) : VType = {
775ae0e5deSZiyue Zhang      val res = Wire(VType())
785ae0e5deSZiyue Zhang      res.illegal := true.B
795ae0e5deSZiyue Zhang      res.vma := false.B
805ae0e5deSZiyue Zhang      res.vta := false.B
815ae0e5deSZiyue Zhang      res.vsew := 0.U
825ae0e5deSZiyue Zhang      res.vlmul := 0.U
835ae0e5deSZiyue Zhang      res
845ae0e5deSZiyue Zhang    }
85*785e3bfdSXuan Hu
86*785e3bfdSXuan Hu    def mu: UInt = 0.U(1.W)
87*785e3bfdSXuan Hu
88*785e3bfdSXuan Hu    def ma: UInt = 1.U(1.W)
89*785e3bfdSXuan Hu
90*785e3bfdSXuan Hu    def tu: UInt = 0.U(1.W)
91*785e3bfdSXuan Hu
92*785e3bfdSXuan Hu    def ta: UInt = 1.U(1.W)
93b52d4755SXuan Hu  }
94b52d4755SXuan Hu
954c8a449fSZiyue Zhang  object VsetVType {
964c8a449fSZiyue Zhang    def apply()(implicit p: Parameters) : VsetVType = {
974c8a449fSZiyue Zhang      new VsetVType
984c8a449fSZiyue Zhang    }
994c8a449fSZiyue Zhang
1004c8a449fSZiyue Zhang    def fromInstVType(instVType: InstVType)(implicit p: Parameters) : VsetVType = {
1014c8a449fSZiyue Zhang      val res = Wire(VsetVType())
1024c8a449fSZiyue Zhang      res.vma   := instVType.vma
1034c8a449fSZiyue Zhang      res.vta   := instVType.vta
1044c8a449fSZiyue Zhang      res.vsew  := instVType.vsew
1054c8a449fSZiyue Zhang      res.vlmul := instVType.vlmul
1064c8a449fSZiyue Zhang      res.illegal := false.B
107e6ac7fe1SZiyue Zhang      res.reserved := instVType.reserved
1084c8a449fSZiyue Zhang      res
1094c8a449fSZiyue Zhang    }
1104c8a449fSZiyue Zhang
1114c8a449fSZiyue Zhang    def fromVtypeStruct(vtypeStruct: VtypeStruct)(implicit p: Parameters): VsetVType = {
1124c8a449fSZiyue Zhang      val res = Wire(VsetVType())
1134c8a449fSZiyue Zhang      res.illegal := vtypeStruct.vill
1144c8a449fSZiyue Zhang      res.vma := vtypeStruct.vma
1154c8a449fSZiyue Zhang      res.vta := vtypeStruct.vta
1164c8a449fSZiyue Zhang      res.vsew := vtypeStruct.vsew
1174c8a449fSZiyue Zhang      res.vlmul := vtypeStruct.vlmul
118e6ac7fe1SZiyue Zhang      res.reserved := vtypeStruct.reserved
1194c8a449fSZiyue Zhang      res
1204c8a449fSZiyue Zhang    }
1214c8a449fSZiyue Zhang  }
1224c8a449fSZiyue Zhang
123b52d4755SXuan Hu  class VConfig(implicit p: Parameters) extends Bundle {
124b52d4755SXuan Hu    val vtype = new VType
125ec371b25SXuan Hu    val vl    = Vl()
126b52d4755SXuan Hu  }
127b52d4755SXuan Hu
128b52d4755SXuan Hu  object VConfig {
129b52d4755SXuan Hu    def apply()(implicit p: Parameters) : VConfig = {
130b52d4755SXuan Hu      new VConfig()
131b52d4755SXuan Hu    }
132b52d4755SXuan Hu  }
133b52d4755SXuan Hu
13478dc7ed0SXuan Hu  // modify the width when support more vector data width
13578dc7ed0SXuan Hu  object VSew extends NamedUInt(2) {
136b52d4755SXuan Hu    def e8  : UInt = "b000".U(width.W)
137b52d4755SXuan Hu    def e16 : UInt = "b001".U(width.W)
138b52d4755SXuan Hu    def e32 : UInt = "b010".U(width.W)
139b52d4755SXuan Hu    def e64 : UInt = "b011".U(width.W)
140b52d4755SXuan Hu
141b52d4755SXuan Hu    def reserved: BitPat = BitPat("b1??")
142b52d4755SXuan Hu
143b52d4755SXuan Hu    def isReserved(sew: UInt) : Bool = {
144b52d4755SXuan Hu      require(sew.getWidth >= 2 && sew.getWidth <= 3)
145b52d4755SXuan Hu      if (sew.getWidth == 3) {
146b52d4755SXuan Hu        sew === reserved
147b52d4755SXuan Hu      } else {
148b52d4755SXuan Hu        false.B
149b52d4755SXuan Hu      }
150b52d4755SXuan Hu    }
151b52d4755SXuan Hu  }
152b52d4755SXuan Hu
153e43bb916SXuan Hu  object SewOH extends NamedUInt(4) {
154e43bb916SXuan Hu    def e8  : UInt = "b0001".U(width.W)
155e43bb916SXuan Hu    def e16 : UInt = "b0010".U(width.W)
156e43bb916SXuan Hu    def e32 : UInt = "b0100".U(width.W)
157e43bb916SXuan Hu    def e64 : UInt = "b1000".U(width.W)
158e43bb916SXuan Hu
159e43bb916SXuan Hu    def convertFromVSew(vsew: UInt): UInt = {
160e43bb916SXuan Hu      require(vsew.getWidth >= 2 && vsew.getWidth <= 3)
161e43bb916SXuan Hu      ZeroExt(UIntToOH(vsew), this.width)
162e43bb916SXuan Hu    }
163e43bb916SXuan Hu  }
164e43bb916SXuan Hu
1654c8a449fSZiyue Zhang  object VtypeVSew extends NamedUInt(3)
1664c8a449fSZiyue Zhang
16778dc7ed0SXuan Hu  object VLmul extends NamedUInt(3) {
168b52d4755SXuan Hu    def m1  : UInt = "b000".U(width.W)
169b52d4755SXuan Hu    def m2  : UInt = "b001".U(width.W)
170b52d4755SXuan Hu    def m4  : UInt = "b010".U(width.W)
171b52d4755SXuan Hu    def m8  : UInt = "b011".U(width.W)
172b52d4755SXuan Hu    def mf2 : UInt = "b111".U(width.W)
173b52d4755SXuan Hu    def mf4 : UInt = "b110".U(width.W)
174b52d4755SXuan Hu    def mf8 : UInt = "b101".U(width.W)
175b52d4755SXuan Hu
176b52d4755SXuan Hu    def reserved: BitPat = BitPat("b100")
177b52d4755SXuan Hu
178b52d4755SXuan Hu    def isReserved(vlmul: UInt) : Bool = {
179b52d4755SXuan Hu      require(vlmul.getWidth == 3)
180b52d4755SXuan Hu      vlmul === reserved
181b52d4755SXuan Hu    }
182e43bb916SXuan Hu
183e43bb916SXuan Hu    def makeNoLessThanM1(uint: UInt): UInt = {
184e43bb916SXuan Hu      checkInputWidth(uint)
185e43bb916SXuan Hu      Mux(uint(2), m1, uint)
186e43bb916SXuan Hu    }
187b52d4755SXuan Hu  }
188b52d4755SXuan Hu
189b52d4755SXuan Hu  object Vl {
190b52d4755SXuan Hu    def apply()(implicit p: Parameters): UInt = UInt(width.W)
191b52d4755SXuan Hu
192b52d4755SXuan Hu    def width(implicit p: Parameters) = p(XSCoreParamsKey).vlWidth
193b52d4755SXuan Hu  }
19478dc7ed0SXuan Hu
19501cdded8SXuan Hu  object Vstart {
19601cdded8SXuan Hu    def apply()(implicit p: Parameters): UInt = UInt(width.W)
19701cdded8SXuan Hu
19801cdded8SXuan Hu    def width(implicit p: Parameters) = p(XSCoreParamsKey).vlWidth - 1
19901cdded8SXuan Hu  }
20001cdded8SXuan Hu
20178dc7ed0SXuan Hu  object Vxsat extends NamedUInt(1)
20278dc7ed0SXuan Hu
20378dc7ed0SXuan Hu  object Vxrm extends NamedUInt(2)
20478dc7ed0SXuan Hu
20578dc7ed0SXuan Hu  object Nf extends NamedUInt(3)
20642475509SXuan Hu
20776093df2Slwd  object VEew extends NamedUInt(2)
208d9355d3aSZiyue-Zhang
2096dbb4e08SXuan Hu  object NumLsElem {
2106dbb4e08SXuan Hu    def apply()(implicit p: Parameters): UInt = UInt(width.W)
2116dbb4e08SXuan Hu
21208047a41SAnzooooo    def width(implicit p: Parameters) = log2Up(p(XSCoreParamsKey).maxElemPerVreg) + 1
2136dbb4e08SXuan Hu  }
2146dbb4e08SXuan Hu
215bdda74fdSxiaofeibao-xjtu  class Fpu extends Bundle{
216bdda74fdSxiaofeibao-xjtu    val isFpToVecInst = Bool()
217bdda74fdSxiaofeibao-xjtu    val isFP32Instr   = Bool()
218bdda74fdSxiaofeibao-xjtu    val isFP64Instr   = Bool()
219582849ffSxiaofeibao-xjtu    val isReduction   = Bool()
220582849ffSxiaofeibao-xjtu    val isFoldTo1_2   = Bool()
221582849ffSxiaofeibao-xjtu    val isFoldTo1_4   = Bool()
222582849ffSxiaofeibao-xjtu    val isFoldTo1_8   = Bool()
223bdda74fdSxiaofeibao-xjtu  }
224bdda74fdSxiaofeibao-xjtu  object Fpu {
225bdda74fdSxiaofeibao-xjtu    def apply() = new Fpu
226bdda74fdSxiaofeibao-xjtu  }
227b52d4755SXuan Hu}
228