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