xref: /XiangShan/src/main/scala/xiangshan/package.scala (revision c4501a6f9d3314f3a2b25dcd7b64862f8a7184bd)
1c6d43980SLemover/***************************************************************************************
2c6d43980SLemover* Copyright (c) 2020-2021 Institute of Computing Technology, Chinese Academy of Sciences
3f320e0f0SYinan Xu* Copyright (c) 2020-2021 Peng Cheng Laboratory
4c6d43980SLemover*
5c6d43980SLemover* XiangShan is licensed under Mulan PSL v2.
6c6d43980SLemover* You can use this software according to the terms and conditions of the Mulan PSL v2.
7c6d43980SLemover* You may obtain a copy of Mulan PSL v2 at:
8c6d43980SLemover*          http://license.coscl.org.cn/MulanPSL2
9c6d43980SLemover*
10c6d43980SLemover* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
11c6d43980SLemover* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
12c6d43980SLemover* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
13c6d43980SLemover*
14c6d43980SLemover* See the Mulan PSL v2 for more details.
15c6d43980SLemover***************************************************************************************/
16c6d43980SLemover
179a2e6b8aSLinJiaweiimport chisel3._
189a2e6b8aSLinJiaweiimport chisel3.util._
198891a219SYinan Xuimport org.chipsalliance.cde.config.Parameters
202225d46eSJiawei Linimport freechips.rocketchip.tile.XLen
216ab6918fSYinan Xuimport xiangshan.ExceptionNO._
222225d46eSJiawei Linimport xiangshan.backend.fu._
232225d46eSJiawei Linimport xiangshan.backend.fu.fpu._
246827759bSZhangZifeiimport xiangshan.backend.fu.vector._
258f3b164bSXuan Huimport xiangshan.backend.issue._
26730cfbc0SXuan Huimport xiangshan.backend.fu.FuConfig
272225d46eSJiawei Lin
289a2e6b8aSLinJiaweipackage object xiangshan {
299ee9f926SYikeZhou  object SrcType {
301285b047SXuan Hu    def imm = "b000".U
311285b047SXuan Hu    def pc  = "b000".U
321285b047SXuan Hu    def xp  = "b001".U
331285b047SXuan Hu    def fp  = "b010".U
341285b047SXuan Hu    def vp  = "b100".U
3572d67441SXuan Hu    def no  = "b000".U // this src read no reg but cannot be Any value
3604b56283SZhangZifei
371285b047SXuan Hu    // alias
381285b047SXuan Hu    def reg = this.xp
391a3df1feSYikeZhou    def DC  = imm // Don't Care
4057a10886SXuan Hu    def X   = BitPat("b000")
414d24c305SYikeZhou
4204b56283SZhangZifei    def isPc(srcType: UInt) = srcType===pc
4304b56283SZhangZifei    def isImm(srcType: UInt) = srcType===imm
441285b047SXuan Hu    def isReg(srcType: UInt) = srcType(0)
459ca09953SXuan Hu    def isXp(srcType: UInt) = srcType(0)
462b4e8253SYinan Xu    def isFp(srcType: UInt) = srcType(1)
471285b047SXuan Hu    def isVp(srcType: UInt) = srcType(2)
481285b047SXuan Hu    def isPcOrImm(srcType: UInt) = isPc(srcType) || isImm(srcType)
499ca09953SXuan Hu    def isNotReg(srcType: UInt): Bool = !srcType.orR
50351e22f2SXuan Hu    def isVfp(srcType: UInt) = isVp(srcType) || isFp(srcType)
511285b047SXuan Hu    def apply() = UInt(3.W)
529a2e6b8aSLinJiawei  }
539a2e6b8aSLinJiawei
549a2e6b8aSLinJiawei  object SrcState {
55100aa93cSYinan Xu    def busy    = "b0".U
56100aa93cSYinan Xu    def rdy     = "b1".U
57100aa93cSYinan Xu    // def specRdy = "b10".U // speculative ready, for future use
58100aa93cSYinan Xu    def apply() = UInt(1.W)
599ca09953SXuan Hu
609ca09953SXuan Hu    def isReady(state: UInt): Bool = state === this.rdy
619ca09953SXuan Hu    def isBusy(state: UInt): Bool = state === this.busy
629a2e6b8aSLinJiawei  }
639a2e6b8aSLinJiawei
649019e3efSXuan Hu  def FuOpTypeWidth = 9
652225d46eSJiawei Lin  object FuOpType {
6657a10886SXuan Hu    def apply() = UInt(FuOpTypeWidth.W)
6757a10886SXuan Hu    def X = BitPat("b00000000")
68ebd97ecbSzhanglinjuan  }
69518d8658SYinan Xu
707f2b7720SXuan Hu  object VlduType {
71*c4501a6fSZiyue-Zhang    def dummy     = "b0000".U
72*c4501a6fSZiyue-Zhang    def vle       = "b0001".U
73*c4501a6fSZiyue-Zhang    def vlse      = "b0010".U
74*c4501a6fSZiyue-Zhang    def vluxe     = "b0011".U
75*c4501a6fSZiyue-Zhang    def vloxe     = "b0100".U
76*c4501a6fSZiyue-Zhang    def vleff     = "b0101".U
77*c4501a6fSZiyue-Zhang    def vlm       = "b0110".U
78*c4501a6fSZiyue-Zhang    def vlr       = "b0111".U
797f2b7720SXuan Hu  }
807f2b7720SXuan Hu
817f2b7720SXuan Hu  object VstuType {
82*c4501a6fSZiyue-Zhang    def dummy     = "b0000".U
83*c4501a6fSZiyue-Zhang    def vse       = "b1001".U
84*c4501a6fSZiyue-Zhang    def vsse      = "b1010".U
85*c4501a6fSZiyue-Zhang    def vsuxe     = "b1011".U
86*c4501a6fSZiyue-Zhang    def vsoxe     = "b1100".U
87*c4501a6fSZiyue-Zhang    def vseff     = "b1101".U
88*c4501a6fSZiyue-Zhang    def vsm       = "b1110".U
89*c4501a6fSZiyue-Zhang    def vsr       = "b1111".U
907f2b7720SXuan Hu  }
917f2b7720SXuan Hu
92d6059658SZiyue Zhang  object IF2VectorType {
93d6059658SZiyue Zhang    // use last 3 bits for vsew
94d6059658SZiyue Zhang    def i2vector       = "b00_00".U
95d6059658SZiyue Zhang    def f2vector       = "b00_01".U
96d6059658SZiyue Zhang    def imm2vector     = "b00_10".U
97d6059658SZiyue Zhang    def permImm2vector = "b00_11".U
98d6059658SZiyue Zhang  }
99d6059658SZiyue Zhang
100a3edac52SYinan Xu  object CommitType {
101c3abb8b6SYinan Xu    def NORMAL = "b000".U  // int/fp
102c3abb8b6SYinan Xu    def BRANCH = "b001".U  // branch
103c3abb8b6SYinan Xu    def LOAD   = "b010".U  // load
104c3abb8b6SYinan Xu    def STORE  = "b011".U  // store
105518d8658SYinan Xu
106c3abb8b6SYinan Xu    def apply() = UInt(3.W)
107c3abb8b6SYinan Xu    def isFused(commitType: UInt): Bool = commitType(2)
108c3abb8b6SYinan Xu    def isLoadStore(commitType: UInt): Bool = !isFused(commitType) && commitType(1)
109c3abb8b6SYinan Xu    def lsInstIsStore(commitType: UInt): Bool = commitType(0)
110c3abb8b6SYinan Xu    def isStore(commitType: UInt): Bool = isLoadStore(commitType) && lsInstIsStore(commitType)
111c3abb8b6SYinan Xu    def isBranch(commitType: UInt): Bool = commitType(0) && !commitType(1) && !isFused(commitType)
112518d8658SYinan Xu  }
113bfb958a3SYinan Xu
114bfb958a3SYinan Xu  object RedirectLevel {
1152d7c7105SYinan Xu    def flushAfter = "b0".U
1162d7c7105SYinan Xu    def flush      = "b1".U
117bfb958a3SYinan Xu
1182d7c7105SYinan Xu    def apply() = UInt(1.W)
1192d7c7105SYinan Xu    // def isUnconditional(level: UInt) = level(1)
120bfb958a3SYinan Xu    def flushItself(level: UInt) = level(0)
1212d7c7105SYinan Xu    // def isException(level: UInt) = level(1) && level(0)
122bfb958a3SYinan Xu  }
123baf8def6SYinan Xu
124baf8def6SYinan Xu  object ExceptionVec {
125da3bf434SMaxpicca-Li    val ExceptionVecSize = 16
126da3bf434SMaxpicca-Li    def apply() = Vec(ExceptionVecSize, Bool())
127baf8def6SYinan Xu  }
128a8e04b1dSYinan Xu
129c60c1ab4SWilliam Wang  object PMAMode {
1308d9a04fcSWilliam Wang    def R = "b1".U << 0 //readable
1318d9a04fcSWilliam Wang    def W = "b1".U << 1 //writeable
1328d9a04fcSWilliam Wang    def X = "b1".U << 2 //executable
1338d9a04fcSWilliam Wang    def I = "b1".U << 3 //cacheable: icache
1348d9a04fcSWilliam Wang    def D = "b1".U << 4 //cacheable: dcache
1358d9a04fcSWilliam Wang    def S = "b1".U << 5 //enable speculative access
136cff68e26SWilliam Wang    def A = "b1".U << 6 //enable atomic operation, A imply R & W
1378d9a04fcSWilliam Wang    def C = "b1".U << 7 //if it is cacheable is configable
138c60c1ab4SWilliam Wang    def Reserved = "b0".U
139c60c1ab4SWilliam Wang
140c60c1ab4SWilliam Wang    def apply() = UInt(7.W)
141c60c1ab4SWilliam Wang
142c60c1ab4SWilliam Wang    def read(mode: UInt) = mode(0)
143c60c1ab4SWilliam Wang    def write(mode: UInt) = mode(1)
144c60c1ab4SWilliam Wang    def execute(mode: UInt) = mode(2)
145c60c1ab4SWilliam Wang    def icache(mode: UInt) = mode(3)
146c60c1ab4SWilliam Wang    def dcache(mode: UInt) = mode(4)
147c60c1ab4SWilliam Wang    def speculate(mode: UInt) = mode(5)
148c60c1ab4SWilliam Wang    def atomic(mode: UInt) = mode(6)
149c60c1ab4SWilliam Wang    def configable_cache(mode: UInt) = mode(7)
150c60c1ab4SWilliam Wang
151c60c1ab4SWilliam Wang    def strToMode(s: String) = {
152423b9255SWilliam Wang      var result = 0.U(8.W)
153c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("R") >= 0) result = result + R
154c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("W") >= 0) result = result + W
155c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("X") >= 0) result = result + X
156c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("I") >= 0) result = result + I
157c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("D") >= 0) result = result + D
158c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("S") >= 0) result = result + S
159c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("A") >= 0) result = result + A
160c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("C") >= 0) result = result + C
161c60c1ab4SWilliam Wang      result
162c60c1ab4SWilliam Wang    }
163c60c1ab4SWilliam Wang  }
1642225d46eSJiawei Lin
1652225d46eSJiawei Lin
1662225d46eSJiawei Lin  object CSROpType {
1672225d46eSJiawei Lin    def jmp  = "b000".U
1682225d46eSJiawei Lin    def wrt  = "b001".U
1692225d46eSJiawei Lin    def set  = "b010".U
1702225d46eSJiawei Lin    def clr  = "b011".U
171b6900d94SYinan Xu    def wfi  = "b100".U
1722225d46eSJiawei Lin    def wrti = "b101".U
1732225d46eSJiawei Lin    def seti = "b110".U
1742225d46eSJiawei Lin    def clri = "b111".U
1755d669833SYinan Xu    def needAccess(op: UInt): Bool = op(1, 0) =/= 0.U
1762225d46eSJiawei Lin  }
1772225d46eSJiawei Lin
1782225d46eSJiawei Lin  // jump
1792225d46eSJiawei Lin  object JumpOpType {
1802225d46eSJiawei Lin    def jal  = "b00".U
1812225d46eSJiawei Lin    def jalr = "b01".U
1822225d46eSJiawei Lin    def auipc = "b10".U
1832225d46eSJiawei Lin//    def call = "b11_011".U
1842225d46eSJiawei Lin//    def ret  = "b11_100".U
1852225d46eSJiawei Lin    def jumpOpisJalr(op: UInt) = op(0)
1862225d46eSJiawei Lin    def jumpOpisAuipc(op: UInt) = op(1)
1872225d46eSJiawei Lin  }
1882225d46eSJiawei Lin
1892225d46eSJiawei Lin  object FenceOpType {
1902225d46eSJiawei Lin    def fence  = "b10000".U
1912225d46eSJiawei Lin    def sfence = "b10001".U
1922225d46eSJiawei Lin    def fencei = "b10010".U
193af2f7849Shappy-lx    def nofence= "b00000".U
1942225d46eSJiawei Lin  }
1952225d46eSJiawei Lin
1962225d46eSJiawei Lin  object ALUOpType {
197ee8ff153Szfw    // shift optype
198675acc68SYinan Xu    def slliuw     = "b000_0000".U // slliuw: ZEXT(src1[31:0]) << shamt
199675acc68SYinan Xu    def sll        = "b000_0001".U // sll:     src1 << src2
200ee8ff153Szfw
201675acc68SYinan Xu    def bclr       = "b000_0010".U // bclr:    src1 & ~(1 << src2[5:0])
202675acc68SYinan Xu    def bset       = "b000_0011".U // bset:    src1 | (1 << src2[5:0])
203675acc68SYinan Xu    def binv       = "b000_0100".U // binv:    src1 ^ ~(1 << src2[5:0])
204ee8ff153Szfw
205675acc68SYinan Xu    def srl        = "b000_0101".U // srl:     src1 >> src2
206675acc68SYinan Xu    def bext       = "b000_0110".U // bext:    (src1 >> src2)[0]
207675acc68SYinan Xu    def sra        = "b000_0111".U // sra:     src1 >> src2 (arithmetic)
208ee8ff153Szfw
2097b441e5eSYinan Xu    def rol        = "b000_1001".U // rol:     (src1 << src2) | (src1 >> (xlen - src2))
2107b441e5eSYinan Xu    def ror        = "b000_1011".U // ror:     (src1 >> src2) | (src1 << (xlen - src2))
211184a1958Szfw
212ee8ff153Szfw    // RV64 32bit optype
213675acc68SYinan Xu    def addw       = "b001_0000".U // addw:      SEXT((src1 + src2)[31:0])
214675acc68SYinan Xu    def oddaddw    = "b001_0001".U // oddaddw:   SEXT((src1[0] + src2)[31:0])
215675acc68SYinan Xu    def subw       = "b001_0010".U // subw:      SEXT((src1 - src2)[31:0])
21654711376Ssinsanction    def lui32addw  = "b001_0011".U // lui32addw: SEXT(SEXT(src2[11:0], 32) + {src2[31:12], 12'b0}, 64)
217ee8ff153Szfw
218675acc68SYinan Xu    def addwbit    = "b001_0100".U // addwbit:   (src1 + src2)[0]
219675acc68SYinan Xu    def addwbyte   = "b001_0101".U // addwbyte:  (src1 + src2)[7:0]
220675acc68SYinan Xu    def addwzexth  = "b001_0110".U // addwzexth: ZEXT((src1  + src2)[15:0])
221675acc68SYinan Xu    def addwsexth  = "b001_0111".U // addwsexth: SEXT((src1  + src2)[15:0])
222ee8ff153Szfw
223675acc68SYinan Xu    def sllw       = "b001_1000".U // sllw:     SEXT((src1 << src2)[31:0])
224675acc68SYinan Xu    def srlw       = "b001_1001".U // srlw:     SEXT((src1[31:0] >> src2)[31:0])
225675acc68SYinan Xu    def sraw       = "b001_1010".U // sraw:     SEXT((src1[31:0] >> src2)[31:0])
226675acc68SYinan Xu    def rolw       = "b001_1100".U
227675acc68SYinan Xu    def rorw       = "b001_1101".U
228675acc68SYinan Xu
229675acc68SYinan Xu    // ADD-op
230675acc68SYinan Xu    def adduw      = "b010_0000".U // adduw:  src1[31:0]  + src2
231675acc68SYinan Xu    def add        = "b010_0001".U // add:     src1        + src2
232675acc68SYinan Xu    def oddadd     = "b010_0010".U // oddadd:  src1[0]     + src2
233fe528fd6Ssinsanction    def lui32add   = "b010_0011".U // lui32add: SEXT(src2[11:0]) + {src2[63:12], 12'b0}
234675acc68SYinan Xu
235675acc68SYinan Xu    def sr29add    = "b010_0100".U // sr29add: src1[63:29] + src2
236675acc68SYinan Xu    def sr30add    = "b010_0101".U // sr30add: src1[63:30] + src2
237675acc68SYinan Xu    def sr31add    = "b010_0110".U // sr31add: src1[63:31] + src2
238675acc68SYinan Xu    def sr32add    = "b010_0111".U // sr32add: src1[63:32] + src2
239675acc68SYinan Xu
240675acc68SYinan Xu    def sh1adduw   = "b010_1000".U // sh1adduw: {src1[31:0], 1'b0} + src2
241675acc68SYinan Xu    def sh1add     = "b010_1001".U // sh1add: {src1[62:0], 1'b0} + src2
242675acc68SYinan Xu    def sh2adduw   = "b010_1010".U // sh2add_uw: {src1[31:0], 2'b0} + src2
243675acc68SYinan Xu    def sh2add     = "b010_1011".U // sh2add: {src1[61:0], 2'b0} + src2
244675acc68SYinan Xu    def sh3adduw   = "b010_1100".U // sh3add_uw: {src1[31:0], 3'b0} + src2
245675acc68SYinan Xu    def sh3add     = "b010_1101".U // sh3add: {src1[60:0], 3'b0} + src2
246675acc68SYinan Xu    def sh4add     = "b010_1111".U // sh4add: {src1[59:0], 4'b0} + src2
247675acc68SYinan Xu
248675acc68SYinan Xu    // SUB-op: src1 - src2
249675acc68SYinan Xu    def sub        = "b011_0000".U
250675acc68SYinan Xu    def sltu       = "b011_0001".U
251675acc68SYinan Xu    def slt        = "b011_0010".U
252675acc68SYinan Xu    def maxu       = "b011_0100".U
253675acc68SYinan Xu    def minu       = "b011_0101".U
254675acc68SYinan Xu    def max        = "b011_0110".U
255675acc68SYinan Xu    def min        = "b011_0111".U
256675acc68SYinan Xu
257675acc68SYinan Xu    // branch
258675acc68SYinan Xu    def beq        = "b111_0000".U
259675acc68SYinan Xu    def bne        = "b111_0010".U
260675acc68SYinan Xu    def blt        = "b111_1000".U
261675acc68SYinan Xu    def bge        = "b111_1010".U
262675acc68SYinan Xu    def bltu       = "b111_1100".U
263675acc68SYinan Xu    def bgeu       = "b111_1110".U
264675acc68SYinan Xu
265675acc68SYinan Xu    // misc optype
266675acc68SYinan Xu    def and        = "b100_0000".U
267675acc68SYinan Xu    def andn       = "b100_0001".U
268675acc68SYinan Xu    def or         = "b100_0010".U
269675acc68SYinan Xu    def orn        = "b100_0011".U
270675acc68SYinan Xu    def xor        = "b100_0100".U
271675acc68SYinan Xu    def xnor       = "b100_0101".U
272675acc68SYinan Xu    def orcb       = "b100_0110".U
273675acc68SYinan Xu
274675acc68SYinan Xu    def sextb      = "b100_1000".U
275675acc68SYinan Xu    def packh      = "b100_1001".U
276675acc68SYinan Xu    def sexth      = "b100_1010".U
277675acc68SYinan Xu    def packw      = "b100_1011".U
278675acc68SYinan Xu
279675acc68SYinan Xu    def revb       = "b101_0000".U
280675acc68SYinan Xu    def rev8       = "b101_0001".U
281675acc68SYinan Xu    def pack       = "b101_0010".U
282675acc68SYinan Xu    def orh48      = "b101_0011".U
283675acc68SYinan Xu
284675acc68SYinan Xu    def szewl1     = "b101_1000".U
285675acc68SYinan Xu    def szewl2     = "b101_1001".U
286675acc68SYinan Xu    def szewl3     = "b101_1010".U
287675acc68SYinan Xu    def byte2      = "b101_1011".U
288675acc68SYinan Xu
289675acc68SYinan Xu    def andlsb     = "b110_0000".U
290675acc68SYinan Xu    def andzexth   = "b110_0001".U
291675acc68SYinan Xu    def orlsb      = "b110_0010".U
292675acc68SYinan Xu    def orzexth    = "b110_0011".U
293675acc68SYinan Xu    def xorlsb     = "b110_0100".U
294675acc68SYinan Xu    def xorzexth   = "b110_0101".U
295675acc68SYinan Xu    def orcblsb    = "b110_0110".U
296675acc68SYinan Xu    def orcbzexth  = "b110_0111".U
297675acc68SYinan Xu
298675acc68SYinan Xu    def isAddw(func: UInt) = func(6, 4) === "b001".U && !func(3) && !func(1)
299675acc68SYinan Xu    def isSimpleLogic(func: UInt) = func(6, 4) === "b100".U && !func(0)
300675acc68SYinan Xu    def logicToLsb(func: UInt) = Cat("b110".U(3.W), func(3, 1), 0.U(1.W))
301675acc68SYinan Xu    def logicToZexth(func: UInt) = Cat("b110".U(3.W), func(3, 1), 1.U(1.W))
302675acc68SYinan Xu
30357a10886SXuan Hu    def apply() = UInt(FuOpTypeWidth.W)
3042225d46eSJiawei Lin  }
3052225d46eSJiawei Lin
306d91483a6Sfdy  object VSETOpType {
307a8db15d8Sfdy    val setVlmaxBit = 0
308a8db15d8Sfdy    val keepVlBit   = 1
309a8db15d8Sfdy    // destTypeBit == 0: write vl to rd
310a8db15d8Sfdy    // destTypeBit == 1: write vconfig
311a8db15d8Sfdy    val destTypeBit = 5
312a8db15d8Sfdy
313a32c56f4SXuan Hu    // vsetvli's uop
314a32c56f4SXuan Hu    //   rs1!=x0, normal
315a32c56f4SXuan Hu    //     uop0: r(rs1), w(vconfig)     | x[rs1],vtypei  -> vconfig
316a32c56f4SXuan Hu    //     uop1: r(rs1), w(rd)          | x[rs1],vtypei  -> x[rd]
317a32c56f4SXuan Hu    def uvsetvcfg_xi        = "b1010_0000".U
318a32c56f4SXuan Hu    def uvsetrd_xi          = "b1000_0000".U
319a32c56f4SXuan Hu    //   rs1==x0, rd!=x0, set vl to vlmax, set rd to vlmax, set vtype
320a32c56f4SXuan Hu    //     uop0: w(vconfig)             | vlmax, vtypei  -> vconfig
321a32c56f4SXuan Hu    //     uop1: w(rd)                  | vlmax, vtypei  -> x[rd]
322a32c56f4SXuan Hu    def uvsetvcfg_vlmax_i   = "b1010_0001".U
323a32c56f4SXuan Hu    def uvsetrd_vlmax_i     = "b1000_0001".U
324a32c56f4SXuan Hu    //   rs1==x0, rd==x0, keep vl, set vtype
325a32c56f4SXuan Hu    //     uop0: r(vconfig), w(vconfig) | ld_vconfig.vl, vtypei -> vconfig
326a32c56f4SXuan Hu    def uvsetvcfg_keep_v    = "b1010_0010".U
327d91483a6Sfdy
328a32c56f4SXuan Hu    // vsetvl's uop
329a32c56f4SXuan Hu    //   rs1!=x0, normal
330a32c56f4SXuan Hu    //     uop0: r(rs1,rs2), w(vconfig) | x[rs1],x[rs2]  -> vconfig
331a32c56f4SXuan Hu    //     uop1: r(rs1,rs2), w(rd)      | x[rs1],x[rs2]  -> x[rd]
332a32c56f4SXuan Hu    def uvsetvcfg_xx        = "b0110_0000".U
333a32c56f4SXuan Hu    def uvsetrd_xx          = "b0100_0000".U
334a32c56f4SXuan Hu    //   rs1==x0, rd!=x0, set vl to vlmax, set rd to vlmax, set vtype
335a32c56f4SXuan Hu    //     uop0: r(rs2), w(vconfig)     | vlmax, vtypei  -> vconfig
336a32c56f4SXuan Hu    //     uop1: r(rs2), w(rd)          | vlmax, vtypei  -> x[rd]
337a32c56f4SXuan Hu    def uvsetvcfg_vlmax_x   = "b0110_0001".U
338a32c56f4SXuan Hu    def uvsetrd_vlmax_x     = "b0100_0001".U
339a32c56f4SXuan Hu    //   rs1==x0, rd==x0, keep vl, set vtype
340a32c56f4SXuan Hu    //     uop0: r(rs2), w(vtmp)             | x[rs2]               -> vtmp
341a32c56f4SXuan Hu    //     uop0: r(vconfig,vtmp), w(vconfig) | old_vconfig.vl, vtmp -> vconfig
342a32c56f4SXuan Hu    def uvmv_v_x            = "b0110_0010".U
343a32c56f4SXuan Hu    def uvsetvcfg_vv        = "b0111_0010".U
344a32c56f4SXuan Hu
345a32c56f4SXuan Hu    // vsetivli's uop
346a32c56f4SXuan Hu    //     uop0: w(vconfig)             | vli, vtypei    -> vconfig
347a32c56f4SXuan Hu    //     uop1: w(rd)                  | vli, vtypei    -> x[rd]
348a32c56f4SXuan Hu    def uvsetvcfg_ii        = "b0010_0000".U
349a32c56f4SXuan Hu    def uvsetrd_ii          = "b0000_0000".U
350a32c56f4SXuan Hu
351a32c56f4SXuan Hu    def isVsetvl  (func: UInt)  = func(6)
352a32c56f4SXuan Hu    def isVsetvli (func: UInt)  = func(7)
353a32c56f4SXuan Hu    def isVsetivli(func: UInt)  = func(7, 6) === 0.U
354a32c56f4SXuan Hu    def isNormal  (func: UInt)  = func(1, 0) === 0.U
355a8db15d8Sfdy    def isSetVlmax(func: UInt)  = func(setVlmaxBit)
356a8db15d8Sfdy    def isKeepVl  (func: UInt)  = func(keepVlBit)
357a32c56f4SXuan Hu    // RG: region
358a32c56f4SXuan Hu    def writeIntRG(func: UInt)  = !func(5)
359a32c56f4SXuan Hu    def writeVecRG(func: UInt)  = func(5)
360a32c56f4SXuan Hu    def readIntRG (func: UInt)  = !func(4)
361a32c56f4SXuan Hu    def readVecRG (func: UInt)  = func(4)
362a8db15d8Sfdy    // modify fuOpType
363a8db15d8Sfdy    def switchDest(func: UInt)  = func ^ (1 << destTypeBit).U
364a8db15d8Sfdy    def keepVl(func: UInt)      = func | (1 << keepVlBit).U
365a8db15d8Sfdy    def setVlmax(func: UInt)    = func | (1 << setVlmaxBit).U
366d91483a6Sfdy  }
367d91483a6Sfdy
3683b739f49SXuan Hu  object BRUOpType {
3693b739f49SXuan Hu    // branch
3703b739f49SXuan Hu    def beq        = "b000_000".U
3713b739f49SXuan Hu    def bne        = "b000_001".U
3723b739f49SXuan Hu    def blt        = "b000_100".U
3733b739f49SXuan Hu    def bge        = "b000_101".U
3743b739f49SXuan Hu    def bltu       = "b001_000".U
3753b739f49SXuan Hu    def bgeu       = "b001_001".U
3763b739f49SXuan Hu
3773b739f49SXuan Hu    def getBranchType(func: UInt) = func(3, 1)
3783b739f49SXuan Hu    def isBranchInvert(func: UInt) = func(0)
3793b739f49SXuan Hu  }
3803b739f49SXuan Hu
3813b739f49SXuan Hu  object MULOpType {
3823b739f49SXuan Hu    // mul
3833b739f49SXuan Hu    // bit encoding: | type (2bit) | isWord(1bit) | opcode(2bit) |
3843b739f49SXuan Hu    def mul    = "b00000".U
3853b739f49SXuan Hu    def mulh   = "b00001".U
3863b739f49SXuan Hu    def mulhsu = "b00010".U
3873b739f49SXuan Hu    def mulhu  = "b00011".U
3883b739f49SXuan Hu    def mulw   = "b00100".U
3893b739f49SXuan Hu
3903b739f49SXuan Hu    def mulw7  = "b01100".U
3913b739f49SXuan Hu    def isSign(op: UInt) = !op(1)
3923b739f49SXuan Hu    def isW(op: UInt) = op(2)
3933b739f49SXuan Hu    def isH(op: UInt) = op(1, 0) =/= 0.U
3943b739f49SXuan Hu    def getOp(op: UInt) = Cat(op(3), op(1, 0))
3953b739f49SXuan Hu  }
3963b739f49SXuan Hu
3973b739f49SXuan Hu  object DIVOpType {
3983b739f49SXuan Hu    // div
3993b739f49SXuan Hu    // bit encoding: | type (2bit) | isWord(1bit) | isSign(1bit) | opcode(1bit) |
4003b739f49SXuan Hu    def div    = "b10000".U
4013b739f49SXuan Hu    def divu   = "b10010".U
4023b739f49SXuan Hu    def rem    = "b10001".U
4033b739f49SXuan Hu    def remu   = "b10011".U
4043b739f49SXuan Hu
4053b739f49SXuan Hu    def divw   = "b10100".U
4063b739f49SXuan Hu    def divuw  = "b10110".U
4073b739f49SXuan Hu    def remw   = "b10101".U
4083b739f49SXuan Hu    def remuw  = "b10111".U
4093b739f49SXuan Hu
4103b739f49SXuan Hu    def isSign(op: UInt) = !op(1)
4113b739f49SXuan Hu    def isW(op: UInt) = op(2)
4123b739f49SXuan Hu    def isH(op: UInt) = op(0)
4133b739f49SXuan Hu  }
4143b739f49SXuan Hu
4152225d46eSJiawei Lin  object MDUOpType {
4162225d46eSJiawei Lin    // mul
4172225d46eSJiawei Lin    // bit encoding: | type (2bit) | isWord(1bit) | opcode(2bit) |
4182225d46eSJiawei Lin    def mul    = "b00000".U
4192225d46eSJiawei Lin    def mulh   = "b00001".U
4202225d46eSJiawei Lin    def mulhsu = "b00010".U
4212225d46eSJiawei Lin    def mulhu  = "b00011".U
4222225d46eSJiawei Lin    def mulw   = "b00100".U
4232225d46eSJiawei Lin
42488825c5cSYinan Xu    def mulw7  = "b01100".U
42588825c5cSYinan Xu
4262225d46eSJiawei Lin    // div
4272225d46eSJiawei Lin    // bit encoding: | type (2bit) | isWord(1bit) | isSign(1bit) | opcode(1bit) |
42888825c5cSYinan Xu    def div    = "b10000".U
42988825c5cSYinan Xu    def divu   = "b10010".U
43088825c5cSYinan Xu    def rem    = "b10001".U
43188825c5cSYinan Xu    def remu   = "b10011".U
4322225d46eSJiawei Lin
43388825c5cSYinan Xu    def divw   = "b10100".U
43488825c5cSYinan Xu    def divuw  = "b10110".U
43588825c5cSYinan Xu    def remw   = "b10101".U
43688825c5cSYinan Xu    def remuw  = "b10111".U
4372225d46eSJiawei Lin
43888825c5cSYinan Xu    def isMul(op: UInt) = !op(4)
43988825c5cSYinan Xu    def isDiv(op: UInt) = op(4)
4402225d46eSJiawei Lin
4412225d46eSJiawei Lin    def isDivSign(op: UInt) = isDiv(op) && !op(1)
4422225d46eSJiawei Lin    def isW(op: UInt) = op(2)
4432225d46eSJiawei Lin    def isH(op: UInt) = (isDiv(op) && op(0)) || (isMul(op) && op(1, 0) =/= 0.U)
4442225d46eSJiawei Lin    def getMulOp(op: UInt) = op(1, 0)
4452225d46eSJiawei Lin  }
4462225d46eSJiawei Lin
4472225d46eSJiawei Lin  object LSUOpType {
448d200f594SWilliam Wang    // load pipeline
4492225d46eSJiawei Lin
450d200f594SWilliam Wang    // normal load
451d200f594SWilliam Wang    // Note: bit(1, 0) are size, DO NOT CHANGE
452d200f594SWilliam Wang    // bit encoding: | load 0 | is unsigned(1bit) | size(2bit) |
453d200f594SWilliam Wang    def lb       = "b0000".U
454d200f594SWilliam Wang    def lh       = "b0001".U
455d200f594SWilliam Wang    def lw       = "b0010".U
456d200f594SWilliam Wang    def ld       = "b0011".U
457d200f594SWilliam Wang    def lbu      = "b0100".U
458d200f594SWilliam Wang    def lhu      = "b0101".U
459d200f594SWilliam Wang    def lwu      = "b0110".U
460ca18a0b4SWilliam Wang
461d200f594SWilliam Wang    // Zicbop software prefetch
462d200f594SWilliam Wang    // bit encoding: | prefetch 1 | 0 | prefetch type (2bit) |
463d200f594SWilliam Wang    def prefetch_i = "b1000".U // TODO
464d200f594SWilliam Wang    def prefetch_r = "b1001".U
465d200f594SWilliam Wang    def prefetch_w = "b1010".U
466ca18a0b4SWilliam Wang
467d200f594SWilliam Wang    def isPrefetch(op: UInt): Bool = op(3)
468d200f594SWilliam Wang
469d200f594SWilliam Wang    // store pipeline
470d200f594SWilliam Wang    // normal store
471d200f594SWilliam Wang    // bit encoding: | store 00 | size(2bit) |
472d200f594SWilliam Wang    def sb       = "b0000".U
473d200f594SWilliam Wang    def sh       = "b0001".U
474d200f594SWilliam Wang    def sw       = "b0010".U
475d200f594SWilliam Wang    def sd       = "b0011".U
476d200f594SWilliam Wang
477d200f594SWilliam Wang    // l1 cache op
478d200f594SWilliam Wang    // bit encoding: | cbo_zero 01 | size(2bit) 11 |
479d200f594SWilliam Wang    def cbo_zero  = "b0111".U
480d200f594SWilliam Wang
481d200f594SWilliam Wang    // llc op
482d200f594SWilliam Wang    // bit encoding: | prefetch 11 | suboptype(2bit) |
483d200f594SWilliam Wang    def cbo_clean = "b1100".U
484d200f594SWilliam Wang    def cbo_flush = "b1101".U
485d200f594SWilliam Wang    def cbo_inval = "b1110".U
486d200f594SWilliam Wang
487d200f594SWilliam Wang    def isCbo(op: UInt): Bool = op(3, 2) === "b11".U
4882225d46eSJiawei Lin
4892225d46eSJiawei Lin    // atomics
4902225d46eSJiawei Lin    // bit(1, 0) are size
4912225d46eSJiawei Lin    // since atomics use a different fu type
4922225d46eSJiawei Lin    // so we can safely reuse other load/store's encodings
493d200f594SWilliam Wang    // bit encoding: | optype(4bit) | size (2bit) |
4942225d46eSJiawei Lin    def lr_w      = "b000010".U
4952225d46eSJiawei Lin    def sc_w      = "b000110".U
4962225d46eSJiawei Lin    def amoswap_w = "b001010".U
4972225d46eSJiawei Lin    def amoadd_w  = "b001110".U
4982225d46eSJiawei Lin    def amoxor_w  = "b010010".U
4992225d46eSJiawei Lin    def amoand_w  = "b010110".U
5002225d46eSJiawei Lin    def amoor_w   = "b011010".U
5012225d46eSJiawei Lin    def amomin_w  = "b011110".U
5022225d46eSJiawei Lin    def amomax_w  = "b100010".U
5032225d46eSJiawei Lin    def amominu_w = "b100110".U
5042225d46eSJiawei Lin    def amomaxu_w = "b101010".U
5052225d46eSJiawei Lin
5062225d46eSJiawei Lin    def lr_d      = "b000011".U
5072225d46eSJiawei Lin    def sc_d      = "b000111".U
5082225d46eSJiawei Lin    def amoswap_d = "b001011".U
5092225d46eSJiawei Lin    def amoadd_d  = "b001111".U
5102225d46eSJiawei Lin    def amoxor_d  = "b010011".U
5112225d46eSJiawei Lin    def amoand_d  = "b010111".U
5122225d46eSJiawei Lin    def amoor_d   = "b011011".U
5132225d46eSJiawei Lin    def amomin_d  = "b011111".U
5142225d46eSJiawei Lin    def amomax_d  = "b100011".U
5152225d46eSJiawei Lin    def amominu_d = "b100111".U
5162225d46eSJiawei Lin    def amomaxu_d = "b101011".U
517b6982e83SLemover
518b6982e83SLemover    def size(op: UInt) = op(1,0)
5192225d46eSJiawei Lin  }
5202225d46eSJiawei Lin
5213feeca58Szfw  object BKUOpType {
522ee8ff153Szfw
5233feeca58Szfw    def clmul       = "b000000".U
5243feeca58Szfw    def clmulh      = "b000001".U
5253feeca58Szfw    def clmulr      = "b000010".U
5263feeca58Szfw    def xpermn      = "b000100".U
5273feeca58Szfw    def xpermb      = "b000101".U
528ee8ff153Szfw
5293feeca58Szfw    def clz         = "b001000".U
5303feeca58Szfw    def clzw        = "b001001".U
5313feeca58Szfw    def ctz         = "b001010".U
5323feeca58Szfw    def ctzw        = "b001011".U
5333feeca58Szfw    def cpop        = "b001100".U
5343feeca58Szfw    def cpopw       = "b001101".U
53507596dc6Szfw
5363feeca58Szfw    // 01xxxx is reserve
5373feeca58Szfw    def aes64es     = "b100000".U
5383feeca58Szfw    def aes64esm    = "b100001".U
5393feeca58Szfw    def aes64ds     = "b100010".U
5403feeca58Szfw    def aes64dsm    = "b100011".U
5413feeca58Szfw    def aes64im     = "b100100".U
5423feeca58Szfw    def aes64ks1i   = "b100101".U
5433feeca58Szfw    def aes64ks2    = "b100110".U
5443feeca58Szfw
5453feeca58Szfw    // merge to two instruction sm4ks & sm4ed
54619bcce38SFawang Zhang    def sm4ed0      = "b101000".U
54719bcce38SFawang Zhang    def sm4ed1      = "b101001".U
54819bcce38SFawang Zhang    def sm4ed2      = "b101010".U
54919bcce38SFawang Zhang    def sm4ed3      = "b101011".U
55019bcce38SFawang Zhang    def sm4ks0      = "b101100".U
55119bcce38SFawang Zhang    def sm4ks1      = "b101101".U
55219bcce38SFawang Zhang    def sm4ks2      = "b101110".U
55319bcce38SFawang Zhang    def sm4ks3      = "b101111".U
5543feeca58Szfw
5553feeca58Szfw    def sha256sum0  = "b110000".U
5563feeca58Szfw    def sha256sum1  = "b110001".U
5573feeca58Szfw    def sha256sig0  = "b110010".U
5583feeca58Szfw    def sha256sig1  = "b110011".U
5593feeca58Szfw    def sha512sum0  = "b110100".U
5603feeca58Szfw    def sha512sum1  = "b110101".U
5613feeca58Szfw    def sha512sig0  = "b110110".U
5623feeca58Szfw    def sha512sig1  = "b110111".U
5633feeca58Szfw
5643feeca58Szfw    def sm3p0       = "b111000".U
5653feeca58Szfw    def sm3p1       = "b111001".U
566ee8ff153Szfw  }
567ee8ff153Szfw
5682225d46eSJiawei Lin  object BTBtype {
5692225d46eSJiawei Lin    def B = "b00".U  // branch
5702225d46eSJiawei Lin    def J = "b01".U  // jump
5712225d46eSJiawei Lin    def I = "b10".U  // indirect
5722225d46eSJiawei Lin    def R = "b11".U  // return
5732225d46eSJiawei Lin
5742225d46eSJiawei Lin    def apply() = UInt(2.W)
5752225d46eSJiawei Lin  }
5762225d46eSJiawei Lin
5772225d46eSJiawei Lin  object SelImm {
578ee8ff153Szfw    def IMM_X  = "b0111".U
579d91483a6Sfdy    def IMM_S  = "b1110".U
580ee8ff153Szfw    def IMM_SB = "b0001".U
581ee8ff153Szfw    def IMM_U  = "b0010".U
582ee8ff153Szfw    def IMM_UJ = "b0011".U
583ee8ff153Szfw    def IMM_I  = "b0100".U
584ee8ff153Szfw    def IMM_Z  = "b0101".U
585ee8ff153Szfw    def INVALID_INSTR = "b0110".U
586ee8ff153Szfw    def IMM_B6 = "b1000".U
5872225d46eSJiawei Lin
58858c35d23Shuxuan0307    def IMM_OPIVIS = "b1001".U
58958c35d23Shuxuan0307    def IMM_OPIVIU = "b1010".U
590912e2179SXuan Hu    def IMM_VSETVLI   = "b1100".U
591912e2179SXuan Hu    def IMM_VSETIVLI  = "b1101".U
592fe528fd6Ssinsanction    def IMM_LUI32 = "b1011".U
59358c35d23Shuxuan0307
59457a10886SXuan Hu    def X      = BitPat("b0000")
5956e7c9679Shuxuan0307
596ee8ff153Szfw    def apply() = UInt(4.W)
5970655b1a0SXuan Hu
5980655b1a0SXuan Hu    def mkString(immType: UInt) : String = {
5990655b1a0SXuan Hu      val strMap = Map(
6000655b1a0SXuan Hu        IMM_S.litValue         -> "S",
6010655b1a0SXuan Hu        IMM_SB.litValue        -> "SB",
6020655b1a0SXuan Hu        IMM_U.litValue         -> "U",
6030655b1a0SXuan Hu        IMM_UJ.litValue        -> "UJ",
6040655b1a0SXuan Hu        IMM_I.litValue         -> "I",
6050655b1a0SXuan Hu        IMM_Z.litValue         -> "Z",
6060655b1a0SXuan Hu        IMM_B6.litValue        -> "B6",
6070655b1a0SXuan Hu        IMM_OPIVIS.litValue    -> "VIS",
6080655b1a0SXuan Hu        IMM_OPIVIU.litValue    -> "VIU",
6090655b1a0SXuan Hu        IMM_VSETVLI.litValue   -> "VSETVLI",
6100655b1a0SXuan Hu        IMM_VSETIVLI.litValue  -> "VSETIVLI",
611fe528fd6Ssinsanction        IMM_LUI32.litValue     -> "LUI32",
6120655b1a0SXuan Hu        INVALID_INSTR.litValue -> "INVALID",
6130655b1a0SXuan Hu      )
6140655b1a0SXuan Hu      strMap(immType.litValue)
6150655b1a0SXuan Hu    }
6162225d46eSJiawei Lin  }
6172225d46eSJiawei Lin
618e2695e90SzhanglyGit  object UopSplitType {
619d91483a6Sfdy    def SCA_SIM          = "b000000".U //
620d91483a6Sfdy    def DIR              = "b010001".U // dirty: vset
621d91483a6Sfdy    def VEC_VVV          = "b010010".U // VEC_VVV
622d91483a6Sfdy    def VEC_VXV          = "b010011".U // VEC_VXV
623d91483a6Sfdy    def VEC_0XV          = "b010100".U // VEC_0XV
624d91483a6Sfdy    def VEC_VVW          = "b010101".U // VEC_VVW
625d91483a6Sfdy    def VEC_WVW          = "b010110".U // VEC_WVW
626d91483a6Sfdy    def VEC_VXW          = "b010111".U // VEC_VXW
627d91483a6Sfdy    def VEC_WXW          = "b011000".U // VEC_WXW
628d91483a6Sfdy    def VEC_WVV          = "b011001".U // VEC_WVV
629d91483a6Sfdy    def VEC_WXV          = "b011010".U // VEC_WXV
630d91483a6Sfdy    def VEC_EXT2         = "b011011".U // VF2 0 -> V
631d91483a6Sfdy    def VEC_EXT4         = "b011100".U // VF4 0 -> V
632d91483a6Sfdy    def VEC_EXT8         = "b011101".U // VF8 0 -> V
633d91483a6Sfdy    def VEC_VVM          = "b011110".U // VEC_VVM
634d91483a6Sfdy    def VEC_VXM          = "b011111".U // VEC_VXM
635d91483a6Sfdy    def VEC_SLIDE1UP     = "b100000".U // vslide1up.vx
636d91483a6Sfdy    def VEC_FSLIDE1UP    = "b100001".U // vfslide1up.vf
637d91483a6Sfdy    def VEC_SLIDE1DOWN   = "b100010".U // vslide1down.vx
638d91483a6Sfdy    def VEC_FSLIDE1DOWN  = "b100011".U // vfslide1down.vf
639d91483a6Sfdy    def VEC_VRED         = "b100100".U // VEC_VRED
640d91483a6Sfdy    def VEC_SLIDEUP      = "b100101".U // VEC_SLIDEUP
641d91483a6Sfdy    def VEC_SLIDEDOWN    = "b100111".U // VEC_SLIDEDOWN
642d91483a6Sfdy    def VEC_M0X          = "b101001".U // VEC_M0X  0MV
643d91483a6Sfdy    def VEC_MVV          = "b101010".U // VEC_MVV  VMV
644d91483a6Sfdy    def VEC_M0X_VFIRST   = "b101011".U //
64584260280Sczw    def VEC_VWW          = "b101100".U //
64665df1368Sczw    def VEC_RGATHER      = "b101101".U // vrgather.vv, vrgather.vi
64765df1368Sczw    def VEC_RGATHER_VX   = "b101110".U // vrgather.vx
64865df1368Sczw    def VEC_RGATHEREI16  = "b101111".U // vrgatherei16.vv
649adf68ff3Sczw    def VEC_COMPRESS     = "b110000".U // vcompress.vm
650*c4501a6fSZiyue-Zhang    def VEC_US_LDST      = "b110001".U // vector unit-strided load/store
651*c4501a6fSZiyue-Zhang    def VEC_S_LDST       = "b110010".U // vector strided load/store
652*c4501a6fSZiyue-Zhang    def VEC_I_LDST       = "b110011".U // vector indexed load/store
653684d7aceSxiaofeibao-xjtu    def VEC_VFV          = "b111000".U // VEC_VFV
6543748ec56Sxiaofeibao-xjtu    def VEC_VFW          = "b111001".U // VEC_VFW
6553748ec56Sxiaofeibao-xjtu    def VEC_WFW          = "b111010".U // VEC_WVW
656f06d6d60Sxiaofeibao-xjtu    def VEC_VFM          = "b111011".U // VEC_VFM
657582849ffSxiaofeibao-xjtu    def VEC_VFRED        = "b111100".U // VEC_VFRED
658b94b1889Sxiaofeibao-xjtu    def VEC_VFREDOSUM    = "b111101".U // VEC_VFREDOSUM
659d91483a6Sfdy    def VEC_M0M          = "b000000".U // VEC_M0M
660d91483a6Sfdy    def VEC_MMM          = "b000000".U // VEC_MMM
6610a34fc22SZiyue Zhang    def VEC_MVNR         = "b000100".U // vmvnr
662d91483a6Sfdy    def dummy     = "b111111".U
663d91483a6Sfdy
664d91483a6Sfdy    def X = BitPat("b000000")
665d91483a6Sfdy
666d91483a6Sfdy    def apply() = UInt(6.W)
667e2695e90SzhanglyGit    def needSplit(UopSplitType: UInt) = UopSplitType(4) || UopSplitType(5)
668d91483a6Sfdy  }
669d91483a6Sfdy
6706ab6918fSYinan Xu  object ExceptionNO {
6716ab6918fSYinan Xu    def instrAddrMisaligned = 0
6726ab6918fSYinan Xu    def instrAccessFault    = 1
6736ab6918fSYinan Xu    def illegalInstr        = 2
6746ab6918fSYinan Xu    def breakPoint          = 3
6756ab6918fSYinan Xu    def loadAddrMisaligned  = 4
6766ab6918fSYinan Xu    def loadAccessFault     = 5
6776ab6918fSYinan Xu    def storeAddrMisaligned = 6
6786ab6918fSYinan Xu    def storeAccessFault    = 7
6796ab6918fSYinan Xu    def ecallU              = 8
6806ab6918fSYinan Xu    def ecallS              = 9
6816ab6918fSYinan Xu    def ecallM              = 11
6826ab6918fSYinan Xu    def instrPageFault      = 12
6836ab6918fSYinan Xu    def loadPageFault       = 13
6846ab6918fSYinan Xu    // def singleStep          = 14
6856ab6918fSYinan Xu    def storePageFault      = 15
6866ab6918fSYinan Xu    def priorities = Seq(
6876ab6918fSYinan Xu      breakPoint, // TODO: different BP has different priority
6886ab6918fSYinan Xu      instrPageFault,
6896ab6918fSYinan Xu      instrAccessFault,
6906ab6918fSYinan Xu      illegalInstr,
6916ab6918fSYinan Xu      instrAddrMisaligned,
6926ab6918fSYinan Xu      ecallM, ecallS, ecallU,
693d880177dSYinan Xu      storeAddrMisaligned,
694d880177dSYinan Xu      loadAddrMisaligned,
6956ab6918fSYinan Xu      storePageFault,
6966ab6918fSYinan Xu      loadPageFault,
6976ab6918fSYinan Xu      storeAccessFault,
698d880177dSYinan Xu      loadAccessFault
6996ab6918fSYinan Xu    )
7006ab6918fSYinan Xu    def all = priorities.distinct.sorted
7016ab6918fSYinan Xu    def frontendSet = Seq(
7026ab6918fSYinan Xu      instrAddrMisaligned,
7036ab6918fSYinan Xu      instrAccessFault,
7046ab6918fSYinan Xu      illegalInstr,
7056ab6918fSYinan Xu      instrPageFault
7066ab6918fSYinan Xu    )
7076ab6918fSYinan Xu    def partialSelect(vec: Vec[Bool], select: Seq[Int]): Vec[Bool] = {
7086ab6918fSYinan Xu      val new_vec = Wire(ExceptionVec())
7096ab6918fSYinan Xu      new_vec.foreach(_ := false.B)
7106ab6918fSYinan Xu      select.foreach(i => new_vec(i) := vec(i))
7116ab6918fSYinan Xu      new_vec
7126ab6918fSYinan Xu    }
7136ab6918fSYinan Xu    def selectFrontend(vec: Vec[Bool]): Vec[Bool] = partialSelect(vec, frontendSet)
7146ab6918fSYinan Xu    def selectAll(vec: Vec[Bool]): Vec[Bool] = partialSelect(vec, ExceptionNO.all)
7156ab6918fSYinan Xu    def selectByFu(vec:Vec[Bool], fuConfig: FuConfig): Vec[Bool] =
7166ab6918fSYinan Xu      partialSelect(vec, fuConfig.exceptionOut)
7176ab6918fSYinan Xu  }
7186ab6918fSYinan Xu
719d2b20d1aSTang Haojin  object TopDownCounters extends Enumeration {
720d2b20d1aSTang Haojin    val NoStall = Value("NoStall") // Base
721d2b20d1aSTang Haojin    // frontend
722d2b20d1aSTang Haojin    val OverrideBubble = Value("OverrideBubble")
723d2b20d1aSTang Haojin    val FtqUpdateBubble = Value("FtqUpdateBubble")
724d2b20d1aSTang Haojin    // val ControlRedirectBubble = Value("ControlRedirectBubble")
725d2b20d1aSTang Haojin    val TAGEMissBubble = Value("TAGEMissBubble")
726d2b20d1aSTang Haojin    val SCMissBubble = Value("SCMissBubble")
727d2b20d1aSTang Haojin    val ITTAGEMissBubble = Value("ITTAGEMissBubble")
728d2b20d1aSTang Haojin    val RASMissBubble = Value("RASMissBubble")
729d2b20d1aSTang Haojin    val MemVioRedirectBubble = Value("MemVioRedirectBubble")
730d2b20d1aSTang Haojin    val OtherRedirectBubble = Value("OtherRedirectBubble")
731d2b20d1aSTang Haojin    val FtqFullStall = Value("FtqFullStall")
732d2b20d1aSTang Haojin
733d2b20d1aSTang Haojin    val ICacheMissBubble = Value("ICacheMissBubble")
734d2b20d1aSTang Haojin    val ITLBMissBubble = Value("ITLBMissBubble")
735d2b20d1aSTang Haojin    val BTBMissBubble = Value("BTBMissBubble")
736d2b20d1aSTang Haojin    val FetchFragBubble = Value("FetchFragBubble")
737d2b20d1aSTang Haojin
738d2b20d1aSTang Haojin    // backend
739d2b20d1aSTang Haojin    // long inst stall at rob head
740d2b20d1aSTang Haojin    val DivStall = Value("DivStall") // int div, float div/sqrt
741d2b20d1aSTang Haojin    val IntNotReadyStall = Value("IntNotReadyStall") // int-inst at rob head not issue
742d2b20d1aSTang Haojin    val FPNotReadyStall = Value("FPNotReadyStall") // fp-inst at rob head not issue
743d2b20d1aSTang Haojin    val MemNotReadyStall = Value("MemNotReadyStall") // mem-inst at rob head not issue
744d2b20d1aSTang Haojin    // freelist full
745d2b20d1aSTang Haojin    val IntFlStall = Value("IntFlStall")
746d2b20d1aSTang Haojin    val FpFlStall = Value("FpFlStall")
747d2b20d1aSTang Haojin    // dispatch queue full
748d2b20d1aSTang Haojin    val IntDqStall = Value("IntDqStall")
749d2b20d1aSTang Haojin    val FpDqStall = Value("FpDqStall")
750d2b20d1aSTang Haojin    val LsDqStall = Value("LsDqStall")
751d2b20d1aSTang Haojin
752d2b20d1aSTang Haojin    // memblock
753d2b20d1aSTang Haojin    val LoadTLBStall = Value("LoadTLBStall")
754d2b20d1aSTang Haojin    val LoadL1Stall = Value("LoadL1Stall")
755d2b20d1aSTang Haojin    val LoadL2Stall = Value("LoadL2Stall")
756d2b20d1aSTang Haojin    val LoadL3Stall = Value("LoadL3Stall")
757d2b20d1aSTang Haojin    val LoadMemStall = Value("LoadMemStall")
758d2b20d1aSTang Haojin    val StoreStall = Value("StoreStall") // include store tlb miss
759d2b20d1aSTang Haojin    val AtomicStall = Value("AtomicStall") // atomic, load reserved, store conditional
760d2b20d1aSTang Haojin
761d2b20d1aSTang Haojin    // xs replay (different to gem5)
762d2b20d1aSTang Haojin    val LoadVioReplayStall = Value("LoadVioReplayStall")
763d2b20d1aSTang Haojin    val LoadMSHRReplayStall = Value("LoadMSHRReplayStall")
764d2b20d1aSTang Haojin
765d2b20d1aSTang Haojin    // bad speculation
766d2b20d1aSTang Haojin    val ControlRecoveryStall = Value("ControlRecoveryStall")
767d2b20d1aSTang Haojin    val MemVioRecoveryStall = Value("MemVioRecoveryStall")
768d2b20d1aSTang Haojin    val OtherRecoveryStall = Value("OtherRecoveryStall")
769d2b20d1aSTang Haojin
770d2b20d1aSTang Haojin    val FlushedInsts = Value("FlushedInsts") // control flushed, memvio flushed, others
771d2b20d1aSTang Haojin
772d2b20d1aSTang Haojin    val OtherCoreStall = Value("OtherCoreStall")
773d2b20d1aSTang Haojin
774d2b20d1aSTang Haojin    val NumStallReasons = Value("NumStallReasons")
775d2b20d1aSTang Haojin  }
7769a2e6b8aSLinJiawei}
777