xref: /XiangShan/src/main/scala/xiangshan/package.scala (revision 0f9d371773a53ab8045e3714b2ab4953b4eabc8b)
19a2e6b8aSLinJiaweiimport chisel3._
29a2e6b8aSLinJiaweiimport chisel3.util._
39a2e6b8aSLinJiawei
49a2e6b8aSLinJiaweipackage object xiangshan {
59ee9f926SYikeZhou  object SrcType {
69a2e6b8aSLinJiawei    def reg = "b00".U
79a2e6b8aSLinJiawei    def pc  = "b01".U
89a2e6b8aSLinJiawei    def imm = "b01".U
99a2e6b8aSLinJiawei    def fp  = "b10".U
1004b56283SZhangZifei
111a3df1feSYikeZhou    def DC = imm // Don't Care
124d24c305SYikeZhou
1304b56283SZhangZifei    def isReg(srcType: UInt) = srcType===reg
1404b56283SZhangZifei    def isPc(srcType: UInt) = srcType===pc
1504b56283SZhangZifei    def isImm(srcType: UInt) = srcType===imm
1604b56283SZhangZifei    def isFp(srcType: UInt) = srcType===fp
175c321a22SZhangZifei    def isPcImm(srcType: UInt) = isPc(srcType) || isImm(srcType)
185c321a22SZhangZifei    def isRegFp(srcType: UInt) = isReg(srcType) || isFp(srcType)
1904b56283SZhangZifei
209a2e6b8aSLinJiawei    def apply() = UInt(2.W)
219a2e6b8aSLinJiawei  }
229a2e6b8aSLinJiawei
239a2e6b8aSLinJiawei  object SrcState {
24100aa93cSYinan Xu    def busy    = "b0".U
25100aa93cSYinan Xu    def rdy     = "b1".U
26100aa93cSYinan Xu    // def specRdy = "b10".U // speculative ready, for future use
27100aa93cSYinan Xu    def apply() = UInt(1.W)
289a2e6b8aSLinJiawei  }
299a2e6b8aSLinJiawei
309a2e6b8aSLinJiawei  object FuType extends HasXSParameter {
31cafb3558SLinJiawei    def num           = exuParameters.NRFuType
32cafb3558SLinJiawei
33cafb3558SLinJiawei    def jmp          = "b0000".U
34cafb3558SLinJiawei    def i2f          = "b0001".U
35cafb3558SLinJiawei    def csr          = "b0010".U
36975b9ea3SYinan Xu    def alu          = "b0110".U
37cafb3558SLinJiawei    def mul          = "b0100".U
38cafb3558SLinJiawei    def div          = "b0101".U
39975b9ea3SYinan Xu    def fence        = "b0011".U
40cafb3558SLinJiawei
41cafb3558SLinJiawei    def fmac         = "b1000".U
4292ab24ebSYinan Xu    def fmisc        = "b1011".U
43cafb3558SLinJiawei    def fDivSqrt     = "b1010".U
44cafb3558SLinJiawei
45cafb3558SLinJiawei    def ldu          = "b1100".U
46cafb3558SLinJiawei    def stu          = "b1101".U
4792ab24ebSYinan Xu    def mou          = "b1111".U // for amo, lr, sc, fence
489a2e6b8aSLinJiawei
499a2e6b8aSLinJiawei    def apply() = UInt(log2Up(num).W)
509a2e6b8aSLinJiawei
51cafb3558SLinJiawei    def isIntExu(fuType: UInt) = !fuType(3)
526ac289b3SLinJiawei    def isJumpExu(fuType: UInt) = fuType === jmp
53cafb3558SLinJiawei    def isFpExu(fuType: UInt) = fuType(3, 2) === "b10".U
54cafb3558SLinJiawei    def isMemExu(fuType: UInt) = fuType(3, 2) === "b11".U
5592ab24ebSYinan Xu    def isLoadStore(fuType: UInt) = isMemExu(fuType) && !fuType(1)
5692ab24ebSYinan Xu    def isStoreExu(fuType: UInt) = isMemExu(fuType) && fuType(0)
57*0f9d3717SYinan Xu    def isAMO(fuType: UInt) = fuType(1)
5892ab24ebSYinan Xu
5992ab24ebSYinan Xu    def jmpCanAccept(fuType: UInt) = !fuType(2)
6092ab24ebSYinan Xu    def mduCanAccept(fuType: UInt) = fuType(2) && !fuType(1)
6192ab24ebSYinan Xu    def aluCanAccept(fuType: UInt) = fuType(2) && fuType(1)
6292ab24ebSYinan Xu
6392ab24ebSYinan Xu    def fmacCanAccept(fuType: UInt) = !fuType(1)
6492ab24ebSYinan Xu    def fmiscCanAccept(fuType: UInt) = fuType(1)
6592ab24ebSYinan Xu
6692ab24ebSYinan Xu    def loadCanAccept(fuType: UInt) = !fuType(0)
6792ab24ebSYinan Xu    def storeCanAccept(fuType: UInt) = fuType(0)
6892ab24ebSYinan Xu
6992ab24ebSYinan Xu    def storeIsAMO(fuType: UInt) = fuType(1)
70cafb3558SLinJiawei
71cafb3558SLinJiawei    val functionNameMap = Map(
72cafb3558SLinJiawei      jmp.litValue() -> "jmp",
73cafb3558SLinJiawei      i2f.litValue() -> "int to float",
74cafb3558SLinJiawei      csr.litValue() -> "csr",
75cafb3558SLinJiawei      alu.litValue() -> "alu",
76cafb3558SLinJiawei      mul.litValue() -> "mul",
77cafb3558SLinJiawei      div.litValue() -> "div",
78b8f08ca0SZhangZifei      fence.litValue() -> "fence",
79cafb3558SLinJiawei      fmac.litValue() -> "fmac",
80cafb3558SLinJiawei      fmisc.litValue() -> "fmisc",
81cafb3558SLinJiawei      fDivSqrt.litValue() -> "fdiv/fsqrt",
82cafb3558SLinJiawei      ldu.litValue() -> "load",
83cafb3558SLinJiawei      stu.litValue() -> "store"
84cafb3558SLinJiawei    )
85cafb3558SLinJiawei
869a2e6b8aSLinJiawei  }
879a2e6b8aSLinJiawei
889a2e6b8aSLinJiawei  object FuOpType extends HasXSParameter {
89cafb3558SLinJiawei    def apply() = UInt(exuParameters.FuOpWidth.W)
909a2e6b8aSLinJiawei  }
91ebd97ecbSzhanglinjuan
92ebd97ecbSzhanglinjuan  object BTBtype {
93ebd97ecbSzhanglinjuan    def B = "b00".U  // branch
94ebd97ecbSzhanglinjuan    def J = "b01".U  // jump
95ebd97ecbSzhanglinjuan    def I = "b10".U  // indirect
96ebd97ecbSzhanglinjuan    def R = "b11".U  // return
97ebd97ecbSzhanglinjuan
98ebd97ecbSzhanglinjuan    def apply() = UInt(2.W)
99ebd97ecbSzhanglinjuan  }
100518d8658SYinan Xu
101a3edac52SYinan Xu  object CommitType {
102fe6452fcSYinan Xu    def NORMAL = "b00".U  // int/fp
103fe6452fcSYinan Xu    def BRANCH = "b01".U  // branch
104a3edac52SYinan Xu    def LOAD   = "b10".U  // load
105a3edac52SYinan Xu    def STORE  = "b11".U  // store
106518d8658SYinan Xu
107518d8658SYinan Xu    def apply() = UInt(2.W)
108a3edac52SYinan Xu    def isLoadStore(commitType: UInt) = commitType(1)
1094fb541a1SYinan Xu    def lsInstIsStore(commitType: UInt) = commitType(0)
1101abe60b3SYinan Xu    def isStore(commitType: UInt) = isLoadStore(commitType) && lsInstIsStore(commitType)
111fe6452fcSYinan Xu    def isBranch(commitType: UInt) = commitType(0) && !commitType(1)
112518d8658SYinan Xu  }
113bfb958a3SYinan Xu
114bfb958a3SYinan Xu  object RedirectLevel {
115bfb958a3SYinan Xu    def flushAfter = "b00".U
116bfb958a3SYinan Xu    def flush      = "b01".U
117bfb958a3SYinan Xu    def flushAll   = "b10".U
118bfb958a3SYinan Xu    def exception  = "b11".U
119bfb958a3SYinan Xu
120bfb958a3SYinan Xu    def apply() = UInt(2.W)
121bfb958a3SYinan Xu    def isUnconditional(level: UInt) = level(1)
122bfb958a3SYinan Xu    def flushItself(level: UInt) = level(0)
123bfb958a3SYinan Xu    def isException(level: UInt) = level(1) && level(0)
124bfb958a3SYinan Xu  }
125baf8def6SYinan Xu
126baf8def6SYinan Xu  object ExceptionVec {
127baf8def6SYinan Xu    def apply() = Vec(16, Bool())
128baf8def6SYinan Xu  }
129a8e04b1dSYinan Xu
130c60c1ab4SWilliam Wang  object PMAMode {
1318d9a04fcSWilliam Wang    def R = "b1".U << 0 //readable
1328d9a04fcSWilliam Wang    def W = "b1".U << 1 //writeable
1338d9a04fcSWilliam Wang    def X = "b1".U << 2 //executable
1348d9a04fcSWilliam Wang    def I = "b1".U << 3 //cacheable: icache
1358d9a04fcSWilliam Wang    def D = "b1".U << 4 //cacheable: dcache
1368d9a04fcSWilliam Wang    def S = "b1".U << 5 //enable speculative access
137cff68e26SWilliam Wang    def A = "b1".U << 6 //enable atomic operation, A imply R & W
1388d9a04fcSWilliam Wang    def C = "b1".U << 7 //if it is cacheable is configable
139c60c1ab4SWilliam Wang    def Reserved = "b0".U
140c60c1ab4SWilliam Wang
141c60c1ab4SWilliam Wang    def apply() = UInt(7.W)
142c60c1ab4SWilliam Wang
143c60c1ab4SWilliam Wang    def read(mode: UInt) = mode(0)
144c60c1ab4SWilliam Wang    def write(mode: UInt) = mode(1)
145c60c1ab4SWilliam Wang    def execute(mode: UInt) = mode(2)
146c60c1ab4SWilliam Wang    def icache(mode: UInt) = mode(3)
147c60c1ab4SWilliam Wang    def dcache(mode: UInt) = mode(4)
148c60c1ab4SWilliam Wang    def speculate(mode: UInt) = mode(5)
149c60c1ab4SWilliam Wang    def atomic(mode: UInt) = mode(6)
150c60c1ab4SWilliam Wang    def configable_cache(mode: UInt) = mode(7)
151c60c1ab4SWilliam Wang
152c60c1ab4SWilliam Wang    def strToMode(s: String) = {
153c60c1ab4SWilliam Wang      var result = 0.U << 8
154c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("R") >= 0) result = result + R
155c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("W") >= 0) result = result + W
156c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("X") >= 0) result = result + X
157c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("I") >= 0) result = result + I
158c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("D") >= 0) result = result + D
159c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("S") >= 0) result = result + S
160c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("A") >= 0) result = result + A
161c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("C") >= 0) result = result + C
162c60c1ab4SWilliam Wang      result
163c60c1ab4SWilliam Wang    }
164c60c1ab4SWilliam Wang  }
1659a2e6b8aSLinJiawei}
166