xref: /XiangShan/src/main/scala/xiangshan/package.scala (revision 72d67441efaccb60ed9255708fd7c8141bb6b787)
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._
196ab6918fSYinan Xuimport xiangshan.ExceptionNO._
202225d46eSJiawei Linimport xiangshan.backend.fu._
212225d46eSJiawei Linimport xiangshan.backend.fu.fpu._
226827759bSZhangZifeiimport xiangshan.backend.fu.vector._
238f3b164bSXuan Huimport xiangshan.backend.issue._
24730cfbc0SXuan Huimport xiangshan.backend.fu.FuConfig
252225d46eSJiawei Lin
269a2e6b8aSLinJiaweipackage object xiangshan {
279ee9f926SYikeZhou  object SrcType {
281285b047SXuan Hu    def imm = "b000".U
291285b047SXuan Hu    def pc  = "b000".U
301285b047SXuan Hu    def xp  = "b001".U
311285b047SXuan Hu    def fp  = "b010".U
321285b047SXuan Hu    def vp  = "b100".U
33*72d67441SXuan Hu    def no  = "b000".U // this src read no reg but cannot be Any value
3404b56283SZhangZifei
351285b047SXuan Hu    // alias
361285b047SXuan Hu    def reg = this.xp
371a3df1feSYikeZhou    def DC  = imm // Don't Care
3857a10886SXuan Hu    def X   = BitPat("b000")
394d24c305SYikeZhou
4004b56283SZhangZifei    def isPc(srcType: UInt) = srcType===pc
4104b56283SZhangZifei    def isImm(srcType: UInt) = srcType===imm
421285b047SXuan Hu    def isReg(srcType: UInt) = srcType(0)
439ca09953SXuan Hu    def isXp(srcType: UInt) = srcType(0)
442b4e8253SYinan Xu    def isFp(srcType: UInt) = srcType(1)
451285b047SXuan Hu    def isVp(srcType: UInt) = srcType(2)
461285b047SXuan Hu    def isPcOrImm(srcType: UInt) = isPc(srcType) || isImm(srcType)
479ca09953SXuan Hu    def isNotReg(srcType: UInt): Bool = !srcType.orR
48351e22f2SXuan Hu    def isVfp(srcType: UInt) = isVp(srcType) || isFp(srcType)
491285b047SXuan Hu    def apply() = UInt(3.W)
509a2e6b8aSLinJiawei  }
519a2e6b8aSLinJiawei
529a2e6b8aSLinJiawei  object SrcState {
53100aa93cSYinan Xu    def busy    = "b0".U
54100aa93cSYinan Xu    def rdy     = "b1".U
55100aa93cSYinan Xu    // def specRdy = "b10".U // speculative ready, for future use
56100aa93cSYinan Xu    def apply() = UInt(1.W)
579ca09953SXuan Hu
589ca09953SXuan Hu    def isReady(state: UInt): Bool = state === this.rdy
599ca09953SXuan Hu    def isBusy(state: UInt): Bool = state === this.busy
609a2e6b8aSLinJiawei  }
619a2e6b8aSLinJiawei
629019e3efSXuan Hu  def FuOpTypeWidth = 9
632225d46eSJiawei Lin  object FuOpType {
6457a10886SXuan Hu    def apply() = UInt(FuOpTypeWidth.W)
6557a10886SXuan Hu    def X = BitPat("b00000000")
66ebd97ecbSzhanglinjuan  }
67518d8658SYinan Xu
687f2b7720SXuan Hu  object VlduType {
6957a10886SXuan Hu    def dummy = 0.U
707f2b7720SXuan Hu  }
717f2b7720SXuan Hu
727f2b7720SXuan Hu  object VstuType {
7357a10886SXuan Hu    def dummy = 0.U
747f2b7720SXuan Hu  }
757f2b7720SXuan Hu
76a3edac52SYinan Xu  object CommitType {
77c3abb8b6SYinan Xu    def NORMAL = "b000".U  // int/fp
78c3abb8b6SYinan Xu    def BRANCH = "b001".U  // branch
79c3abb8b6SYinan Xu    def LOAD   = "b010".U  // load
80c3abb8b6SYinan Xu    def STORE  = "b011".U  // store
81518d8658SYinan Xu
82c3abb8b6SYinan Xu    def apply() = UInt(3.W)
83c3abb8b6SYinan Xu    def isFused(commitType: UInt): Bool = commitType(2)
84c3abb8b6SYinan Xu    def isLoadStore(commitType: UInt): Bool = !isFused(commitType) && commitType(1)
85c3abb8b6SYinan Xu    def lsInstIsStore(commitType: UInt): Bool = commitType(0)
86c3abb8b6SYinan Xu    def isStore(commitType: UInt): Bool = isLoadStore(commitType) && lsInstIsStore(commitType)
87c3abb8b6SYinan Xu    def isBranch(commitType: UInt): Bool = commitType(0) && !commitType(1) && !isFused(commitType)
88518d8658SYinan Xu  }
89bfb958a3SYinan Xu
90bfb958a3SYinan Xu  object RedirectLevel {
912d7c7105SYinan Xu    def flushAfter = "b0".U
922d7c7105SYinan Xu    def flush      = "b1".U
93bfb958a3SYinan Xu
942d7c7105SYinan Xu    def apply() = UInt(1.W)
952d7c7105SYinan Xu    // def isUnconditional(level: UInt) = level(1)
96bfb958a3SYinan Xu    def flushItself(level: UInt) = level(0)
972d7c7105SYinan Xu    // def isException(level: UInt) = level(1) && level(0)
98bfb958a3SYinan Xu  }
99baf8def6SYinan Xu
100baf8def6SYinan Xu  object ExceptionVec {
101da3bf434SMaxpicca-Li    val ExceptionVecSize = 16
102da3bf434SMaxpicca-Li    def apply() = Vec(ExceptionVecSize, Bool())
103baf8def6SYinan Xu  }
104a8e04b1dSYinan Xu
105c60c1ab4SWilliam Wang  object PMAMode {
1068d9a04fcSWilliam Wang    def R = "b1".U << 0 //readable
1078d9a04fcSWilliam Wang    def W = "b1".U << 1 //writeable
1088d9a04fcSWilliam Wang    def X = "b1".U << 2 //executable
1098d9a04fcSWilliam Wang    def I = "b1".U << 3 //cacheable: icache
1108d9a04fcSWilliam Wang    def D = "b1".U << 4 //cacheable: dcache
1118d9a04fcSWilliam Wang    def S = "b1".U << 5 //enable speculative access
112cff68e26SWilliam Wang    def A = "b1".U << 6 //enable atomic operation, A imply R & W
1138d9a04fcSWilliam Wang    def C = "b1".U << 7 //if it is cacheable is configable
114c60c1ab4SWilliam Wang    def Reserved = "b0".U
115c60c1ab4SWilliam Wang
116c60c1ab4SWilliam Wang    def apply() = UInt(7.W)
117c60c1ab4SWilliam Wang
118c60c1ab4SWilliam Wang    def read(mode: UInt) = mode(0)
119c60c1ab4SWilliam Wang    def write(mode: UInt) = mode(1)
120c60c1ab4SWilliam Wang    def execute(mode: UInt) = mode(2)
121c60c1ab4SWilliam Wang    def icache(mode: UInt) = mode(3)
122c60c1ab4SWilliam Wang    def dcache(mode: UInt) = mode(4)
123c60c1ab4SWilliam Wang    def speculate(mode: UInt) = mode(5)
124c60c1ab4SWilliam Wang    def atomic(mode: UInt) = mode(6)
125c60c1ab4SWilliam Wang    def configable_cache(mode: UInt) = mode(7)
126c60c1ab4SWilliam Wang
127c60c1ab4SWilliam Wang    def strToMode(s: String) = {
128423b9255SWilliam Wang      var result = 0.U(8.W)
129c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("R") >= 0) result = result + R
130c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("W") >= 0) result = result + W
131c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("X") >= 0) result = result + X
132c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("I") >= 0) result = result + I
133c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("D") >= 0) result = result + D
134c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("S") >= 0) result = result + S
135c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("A") >= 0) result = result + A
136c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("C") >= 0) result = result + C
137c60c1ab4SWilliam Wang      result
138c60c1ab4SWilliam Wang    }
139c60c1ab4SWilliam Wang  }
1402225d46eSJiawei Lin
1412225d46eSJiawei Lin
1422225d46eSJiawei Lin  object CSROpType {
1432225d46eSJiawei Lin    def jmp  = "b000".U
1442225d46eSJiawei Lin    def wrt  = "b001".U
1452225d46eSJiawei Lin    def set  = "b010".U
1462225d46eSJiawei Lin    def clr  = "b011".U
147b6900d94SYinan Xu    def wfi  = "b100".U
1482225d46eSJiawei Lin    def wrti = "b101".U
1492225d46eSJiawei Lin    def seti = "b110".U
1502225d46eSJiawei Lin    def clri = "b111".U
1515d669833SYinan Xu    def needAccess(op: UInt): Bool = op(1, 0) =/= 0.U
1522225d46eSJiawei Lin  }
1532225d46eSJiawei Lin
1542225d46eSJiawei Lin  // jump
1552225d46eSJiawei Lin  object JumpOpType {
1562225d46eSJiawei Lin    def jal  = "b00".U
1572225d46eSJiawei Lin    def jalr = "b01".U
1582225d46eSJiawei Lin    def auipc = "b10".U
1592225d46eSJiawei Lin//    def call = "b11_011".U
1602225d46eSJiawei Lin//    def ret  = "b11_100".U
1612225d46eSJiawei Lin    def jumpOpisJalr(op: UInt) = op(0)
1622225d46eSJiawei Lin    def jumpOpisAuipc(op: UInt) = op(1)
1632225d46eSJiawei Lin  }
1642225d46eSJiawei Lin
1652225d46eSJiawei Lin  object FenceOpType {
1662225d46eSJiawei Lin    def fence  = "b10000".U
1672225d46eSJiawei Lin    def sfence = "b10001".U
1682225d46eSJiawei Lin    def fencei = "b10010".U
169af2f7849Shappy-lx    def nofence= "b00000".U
1702225d46eSJiawei Lin  }
1712225d46eSJiawei Lin
1722225d46eSJiawei Lin  object ALUOpType {
173ee8ff153Szfw    // shift optype
174675acc68SYinan Xu    def slliuw     = "b000_0000".U // slliuw: ZEXT(src1[31:0]) << shamt
175675acc68SYinan Xu    def sll        = "b000_0001".U // sll:     src1 << src2
176ee8ff153Szfw
177675acc68SYinan Xu    def bclr       = "b000_0010".U // bclr:    src1 & ~(1 << src2[5:0])
178675acc68SYinan Xu    def bset       = "b000_0011".U // bset:    src1 | (1 << src2[5:0])
179675acc68SYinan Xu    def binv       = "b000_0100".U // binv:    src1 ^ ~(1 << src2[5:0])
180ee8ff153Szfw
181675acc68SYinan Xu    def srl        = "b000_0101".U // srl:     src1 >> src2
182675acc68SYinan Xu    def bext       = "b000_0110".U // bext:    (src1 >> src2)[0]
183675acc68SYinan Xu    def sra        = "b000_0111".U // sra:     src1 >> src2 (arithmetic)
184ee8ff153Szfw
1857b441e5eSYinan Xu    def rol        = "b000_1001".U // rol:     (src1 << src2) | (src1 >> (xlen - src2))
1867b441e5eSYinan Xu    def ror        = "b000_1011".U // ror:     (src1 >> src2) | (src1 << (xlen - src2))
187184a1958Szfw
188ee8ff153Szfw    // RV64 32bit optype
189675acc68SYinan Xu    def addw       = "b001_0000".U // addw:      SEXT((src1 + src2)[31:0])
190675acc68SYinan Xu    def oddaddw    = "b001_0001".U // oddaddw:   SEXT((src1[0] + src2)[31:0])
191675acc68SYinan Xu    def subw       = "b001_0010".U // subw:      SEXT((src1 - src2)[31:0])
19254711376Ssinsanction    def lui32addw  = "b001_0011".U // lui32addw: SEXT(SEXT(src2[11:0], 32) + {src2[31:12], 12'b0}, 64)
193ee8ff153Szfw
194675acc68SYinan Xu    def addwbit    = "b001_0100".U // addwbit:   (src1 + src2)[0]
195675acc68SYinan Xu    def addwbyte   = "b001_0101".U // addwbyte:  (src1 + src2)[7:0]
196675acc68SYinan Xu    def addwzexth  = "b001_0110".U // addwzexth: ZEXT((src1  + src2)[15:0])
197675acc68SYinan Xu    def addwsexth  = "b001_0111".U // addwsexth: SEXT((src1  + src2)[15:0])
198ee8ff153Szfw
199675acc68SYinan Xu    def sllw       = "b001_1000".U // sllw:     SEXT((src1 << src2)[31:0])
200675acc68SYinan Xu    def srlw       = "b001_1001".U // srlw:     SEXT((src1[31:0] >> src2)[31:0])
201675acc68SYinan Xu    def sraw       = "b001_1010".U // sraw:     SEXT((src1[31:0] >> src2)[31:0])
202675acc68SYinan Xu    def rolw       = "b001_1100".U
203675acc68SYinan Xu    def rorw       = "b001_1101".U
204675acc68SYinan Xu
205675acc68SYinan Xu    // ADD-op
206675acc68SYinan Xu    def adduw      = "b010_0000".U // adduw:  src1[31:0]  + src2
207675acc68SYinan Xu    def add        = "b010_0001".U // add:     src1        + src2
208675acc68SYinan Xu    def oddadd     = "b010_0010".U // oddadd:  src1[0]     + src2
209fe528fd6Ssinsanction    def lui32add   = "b010_0011".U // lui32add: SEXT(src2[11:0]) + {src2[63:12], 12'b0}
210675acc68SYinan Xu
211675acc68SYinan Xu    def sr29add    = "b010_0100".U // sr29add: src1[63:29] + src2
212675acc68SYinan Xu    def sr30add    = "b010_0101".U // sr30add: src1[63:30] + src2
213675acc68SYinan Xu    def sr31add    = "b010_0110".U // sr31add: src1[63:31] + src2
214675acc68SYinan Xu    def sr32add    = "b010_0111".U // sr32add: src1[63:32] + src2
215675acc68SYinan Xu
216675acc68SYinan Xu    def sh1adduw   = "b010_1000".U // sh1adduw: {src1[31:0], 1'b0} + src2
217675acc68SYinan Xu    def sh1add     = "b010_1001".U // sh1add: {src1[62:0], 1'b0} + src2
218675acc68SYinan Xu    def sh2adduw   = "b010_1010".U // sh2add_uw: {src1[31:0], 2'b0} + src2
219675acc68SYinan Xu    def sh2add     = "b010_1011".U // sh2add: {src1[61:0], 2'b0} + src2
220675acc68SYinan Xu    def sh3adduw   = "b010_1100".U // sh3add_uw: {src1[31:0], 3'b0} + src2
221675acc68SYinan Xu    def sh3add     = "b010_1101".U // sh3add: {src1[60:0], 3'b0} + src2
222675acc68SYinan Xu    def sh4add     = "b010_1111".U // sh4add: {src1[59:0], 4'b0} + src2
223675acc68SYinan Xu
224675acc68SYinan Xu    // SUB-op: src1 - src2
225675acc68SYinan Xu    def sub        = "b011_0000".U
226675acc68SYinan Xu    def sltu       = "b011_0001".U
227675acc68SYinan Xu    def slt        = "b011_0010".U
228675acc68SYinan Xu    def maxu       = "b011_0100".U
229675acc68SYinan Xu    def minu       = "b011_0101".U
230675acc68SYinan Xu    def max        = "b011_0110".U
231675acc68SYinan Xu    def min        = "b011_0111".U
232675acc68SYinan Xu
233675acc68SYinan Xu    // branch
234675acc68SYinan Xu    def beq        = "b111_0000".U
235675acc68SYinan Xu    def bne        = "b111_0010".U
236675acc68SYinan Xu    def blt        = "b111_1000".U
237675acc68SYinan Xu    def bge        = "b111_1010".U
238675acc68SYinan Xu    def bltu       = "b111_1100".U
239675acc68SYinan Xu    def bgeu       = "b111_1110".U
240675acc68SYinan Xu
241675acc68SYinan Xu    // misc optype
242675acc68SYinan Xu    def and        = "b100_0000".U
243675acc68SYinan Xu    def andn       = "b100_0001".U
244675acc68SYinan Xu    def or         = "b100_0010".U
245675acc68SYinan Xu    def orn        = "b100_0011".U
246675acc68SYinan Xu    def xor        = "b100_0100".U
247675acc68SYinan Xu    def xnor       = "b100_0101".U
248675acc68SYinan Xu    def orcb       = "b100_0110".U
249675acc68SYinan Xu
250675acc68SYinan Xu    def sextb      = "b100_1000".U
251675acc68SYinan Xu    def packh      = "b100_1001".U
252675acc68SYinan Xu    def sexth      = "b100_1010".U
253675acc68SYinan Xu    def packw      = "b100_1011".U
254675acc68SYinan Xu
255675acc68SYinan Xu    def revb       = "b101_0000".U
256675acc68SYinan Xu    def rev8       = "b101_0001".U
257675acc68SYinan Xu    def pack       = "b101_0010".U
258675acc68SYinan Xu    def orh48      = "b101_0011".U
259675acc68SYinan Xu
260675acc68SYinan Xu    def szewl1     = "b101_1000".U
261675acc68SYinan Xu    def szewl2     = "b101_1001".U
262675acc68SYinan Xu    def szewl3     = "b101_1010".U
263675acc68SYinan Xu    def byte2      = "b101_1011".U
264675acc68SYinan Xu
265675acc68SYinan Xu    def andlsb     = "b110_0000".U
266675acc68SYinan Xu    def andzexth   = "b110_0001".U
267675acc68SYinan Xu    def orlsb      = "b110_0010".U
268675acc68SYinan Xu    def orzexth    = "b110_0011".U
269675acc68SYinan Xu    def xorlsb     = "b110_0100".U
270675acc68SYinan Xu    def xorzexth   = "b110_0101".U
271675acc68SYinan Xu    def orcblsb    = "b110_0110".U
272675acc68SYinan Xu    def orcbzexth  = "b110_0111".U
273675acc68SYinan Xu
274675acc68SYinan Xu    def isAddw(func: UInt) = func(6, 4) === "b001".U && !func(3) && !func(1)
275675acc68SYinan Xu    def isSimpleLogic(func: UInt) = func(6, 4) === "b100".U && !func(0)
276675acc68SYinan Xu    def logicToLsb(func: UInt) = Cat("b110".U(3.W), func(3, 1), 0.U(1.W))
277675acc68SYinan Xu    def logicToZexth(func: UInt) = Cat("b110".U(3.W), func(3, 1), 1.U(1.W))
278675acc68SYinan Xu
27957a10886SXuan Hu    def apply() = UInt(FuOpTypeWidth.W)
2802225d46eSJiawei Lin  }
2812225d46eSJiawei Lin
282d91483a6Sfdy  object VSETOpType {
283a8db15d8Sfdy    val setVlmaxBit = 0
284a8db15d8Sfdy    val keepVlBit   = 1
285a8db15d8Sfdy    // destTypeBit == 0: write vl to rd
286a8db15d8Sfdy    // destTypeBit == 1: write vconfig
287a8db15d8Sfdy    val destTypeBit = 5
288a8db15d8Sfdy
289a32c56f4SXuan Hu    // vsetvli's uop
290a32c56f4SXuan Hu    //   rs1!=x0, normal
291a32c56f4SXuan Hu    //     uop0: r(rs1), w(vconfig)     | x[rs1],vtypei  -> vconfig
292a32c56f4SXuan Hu    //     uop1: r(rs1), w(rd)          | x[rs1],vtypei  -> x[rd]
293a32c56f4SXuan Hu    def uvsetvcfg_xi        = "b1010_0000".U
294a32c56f4SXuan Hu    def uvsetrd_xi          = "b1000_0000".U
295a32c56f4SXuan Hu    //   rs1==x0, rd!=x0, set vl to vlmax, set rd to vlmax, set vtype
296a32c56f4SXuan Hu    //     uop0: w(vconfig)             | vlmax, vtypei  -> vconfig
297a32c56f4SXuan Hu    //     uop1: w(rd)                  | vlmax, vtypei  -> x[rd]
298a32c56f4SXuan Hu    def uvsetvcfg_vlmax_i   = "b1010_0001".U
299a32c56f4SXuan Hu    def uvsetrd_vlmax_i     = "b1000_0001".U
300a32c56f4SXuan Hu    //   rs1==x0, rd==x0, keep vl, set vtype
301a32c56f4SXuan Hu    //     uop0: r(vconfig), w(vconfig) | ld_vconfig.vl, vtypei -> vconfig
302a32c56f4SXuan Hu    def uvsetvcfg_keep_v    = "b1010_0010".U
303d91483a6Sfdy
304a32c56f4SXuan Hu    // vsetvl's uop
305a32c56f4SXuan Hu    //   rs1!=x0, normal
306a32c56f4SXuan Hu    //     uop0: r(rs1,rs2), w(vconfig) | x[rs1],x[rs2]  -> vconfig
307a32c56f4SXuan Hu    //     uop1: r(rs1,rs2), w(rd)      | x[rs1],x[rs2]  -> x[rd]
308a32c56f4SXuan Hu    def uvsetvcfg_xx        = "b0110_0000".U
309a32c56f4SXuan Hu    def uvsetrd_xx          = "b0100_0000".U
310a32c56f4SXuan Hu    //   rs1==x0, rd!=x0, set vl to vlmax, set rd to vlmax, set vtype
311a32c56f4SXuan Hu    //     uop0: r(rs2), w(vconfig)     | vlmax, vtypei  -> vconfig
312a32c56f4SXuan Hu    //     uop1: r(rs2), w(rd)          | vlmax, vtypei  -> x[rd]
313a32c56f4SXuan Hu    def uvsetvcfg_vlmax_x   = "b0110_0001".U
314a32c56f4SXuan Hu    def uvsetrd_vlmax_x     = "b0100_0001".U
315a32c56f4SXuan Hu    //   rs1==x0, rd==x0, keep vl, set vtype
316a32c56f4SXuan Hu    //     uop0: r(rs2), w(vtmp)             | x[rs2]               -> vtmp
317a32c56f4SXuan Hu    //     uop0: r(vconfig,vtmp), w(vconfig) | old_vconfig.vl, vtmp -> vconfig
318a32c56f4SXuan Hu    def uvmv_v_x            = "b0110_0010".U
319a32c56f4SXuan Hu    def uvsetvcfg_vv        = "b0111_0010".U
320a32c56f4SXuan Hu
321a32c56f4SXuan Hu    // vsetivli's uop
322a32c56f4SXuan Hu    //     uop0: w(vconfig)             | vli, vtypei    -> vconfig
323a32c56f4SXuan Hu    //     uop1: w(rd)                  | vli, vtypei    -> x[rd]
324a32c56f4SXuan Hu    def uvsetvcfg_ii        = "b0010_0000".U
325a32c56f4SXuan Hu    def uvsetrd_ii          = "b0000_0000".U
326a32c56f4SXuan Hu
327a32c56f4SXuan Hu    def isVsetvl  (func: UInt)  = func(6)
328a32c56f4SXuan Hu    def isVsetvli (func: UInt)  = func(7)
329a32c56f4SXuan Hu    def isVsetivli(func: UInt)  = func(7, 6) === 0.U
330a32c56f4SXuan Hu    def isNormal  (func: UInt)  = func(1, 0) === 0.U
331a8db15d8Sfdy    def isSetVlmax(func: UInt)  = func(setVlmaxBit)
332a8db15d8Sfdy    def isKeepVl  (func: UInt)  = func(keepVlBit)
333a32c56f4SXuan Hu    // RG: region
334a32c56f4SXuan Hu    def writeIntRG(func: UInt)  = !func(5)
335a32c56f4SXuan Hu    def writeVecRG(func: UInt)  = func(5)
336a32c56f4SXuan Hu    def readIntRG (func: UInt)  = !func(4)
337a32c56f4SXuan Hu    def readVecRG (func: UInt)  = func(4)
338a8db15d8Sfdy    // modify fuOpType
339a8db15d8Sfdy    def switchDest(func: UInt)  = func ^ (1 << destTypeBit).U
340a8db15d8Sfdy    def keepVl(func: UInt)      = func | (1 << keepVlBit).U
341a8db15d8Sfdy    def setVlmax(func: UInt)    = func | (1 << setVlmaxBit).U
342d91483a6Sfdy  }
343d91483a6Sfdy
3443b739f49SXuan Hu  object BRUOpType {
3453b739f49SXuan Hu    // branch
3463b739f49SXuan Hu    def beq        = "b000_000".U
3473b739f49SXuan Hu    def bne        = "b000_001".U
3483b739f49SXuan Hu    def blt        = "b000_100".U
3493b739f49SXuan Hu    def bge        = "b000_101".U
3503b739f49SXuan Hu    def bltu       = "b001_000".U
3513b739f49SXuan Hu    def bgeu       = "b001_001".U
3523b739f49SXuan Hu
3533b739f49SXuan Hu    def getBranchType(func: UInt) = func(3, 1)
3543b739f49SXuan Hu    def isBranchInvert(func: UInt) = func(0)
3553b739f49SXuan Hu  }
3563b739f49SXuan Hu
3573b739f49SXuan Hu  object MULOpType {
3583b739f49SXuan Hu    // mul
3593b739f49SXuan Hu    // bit encoding: | type (2bit) | isWord(1bit) | opcode(2bit) |
3603b739f49SXuan Hu    def mul    = "b00000".U
3613b739f49SXuan Hu    def mulh   = "b00001".U
3623b739f49SXuan Hu    def mulhsu = "b00010".U
3633b739f49SXuan Hu    def mulhu  = "b00011".U
3643b739f49SXuan Hu    def mulw   = "b00100".U
3653b739f49SXuan Hu
3663b739f49SXuan Hu    def mulw7  = "b01100".U
3673b739f49SXuan Hu    def isSign(op: UInt) = !op(1)
3683b739f49SXuan Hu    def isW(op: UInt) = op(2)
3693b739f49SXuan Hu    def isH(op: UInt) = op(1, 0) =/= 0.U
3703b739f49SXuan Hu    def getOp(op: UInt) = Cat(op(3), op(1, 0))
3713b739f49SXuan Hu  }
3723b739f49SXuan Hu
3733b739f49SXuan Hu  object DIVOpType {
3743b739f49SXuan Hu    // div
3753b739f49SXuan Hu    // bit encoding: | type (2bit) | isWord(1bit) | isSign(1bit) | opcode(1bit) |
3763b739f49SXuan Hu    def div    = "b10000".U
3773b739f49SXuan Hu    def divu   = "b10010".U
3783b739f49SXuan Hu    def rem    = "b10001".U
3793b739f49SXuan Hu    def remu   = "b10011".U
3803b739f49SXuan Hu
3813b739f49SXuan Hu    def divw   = "b10100".U
3823b739f49SXuan Hu    def divuw  = "b10110".U
3833b739f49SXuan Hu    def remw   = "b10101".U
3843b739f49SXuan Hu    def remuw  = "b10111".U
3853b739f49SXuan Hu
3863b739f49SXuan Hu    def isSign(op: UInt) = !op(1)
3873b739f49SXuan Hu    def isW(op: UInt) = op(2)
3883b739f49SXuan Hu    def isH(op: UInt) = op(0)
3893b739f49SXuan Hu  }
3903b739f49SXuan Hu
3912225d46eSJiawei Lin  object MDUOpType {
3922225d46eSJiawei Lin    // mul
3932225d46eSJiawei Lin    // bit encoding: | type (2bit) | isWord(1bit) | opcode(2bit) |
3942225d46eSJiawei Lin    def mul    = "b00000".U
3952225d46eSJiawei Lin    def mulh   = "b00001".U
3962225d46eSJiawei Lin    def mulhsu = "b00010".U
3972225d46eSJiawei Lin    def mulhu  = "b00011".U
3982225d46eSJiawei Lin    def mulw   = "b00100".U
3992225d46eSJiawei Lin
40088825c5cSYinan Xu    def mulw7  = "b01100".U
40188825c5cSYinan Xu
4022225d46eSJiawei Lin    // div
4032225d46eSJiawei Lin    // bit encoding: | type (2bit) | isWord(1bit) | isSign(1bit) | opcode(1bit) |
40488825c5cSYinan Xu    def div    = "b10000".U
40588825c5cSYinan Xu    def divu   = "b10010".U
40688825c5cSYinan Xu    def rem    = "b10001".U
40788825c5cSYinan Xu    def remu   = "b10011".U
4082225d46eSJiawei Lin
40988825c5cSYinan Xu    def divw   = "b10100".U
41088825c5cSYinan Xu    def divuw  = "b10110".U
41188825c5cSYinan Xu    def remw   = "b10101".U
41288825c5cSYinan Xu    def remuw  = "b10111".U
4132225d46eSJiawei Lin
41488825c5cSYinan Xu    def isMul(op: UInt) = !op(4)
41588825c5cSYinan Xu    def isDiv(op: UInt) = op(4)
4162225d46eSJiawei Lin
4172225d46eSJiawei Lin    def isDivSign(op: UInt) = isDiv(op) && !op(1)
4182225d46eSJiawei Lin    def isW(op: UInt) = op(2)
4192225d46eSJiawei Lin    def isH(op: UInt) = (isDiv(op) && op(0)) || (isMul(op) && op(1, 0) =/= 0.U)
4202225d46eSJiawei Lin    def getMulOp(op: UInt) = op(1, 0)
4212225d46eSJiawei Lin  }
4222225d46eSJiawei Lin
4232225d46eSJiawei Lin  object LSUOpType {
424d200f594SWilliam Wang    // load pipeline
4252225d46eSJiawei Lin
426d200f594SWilliam Wang    // normal load
427d200f594SWilliam Wang    // Note: bit(1, 0) are size, DO NOT CHANGE
428d200f594SWilliam Wang    // bit encoding: | load 0 | is unsigned(1bit) | size(2bit) |
429d200f594SWilliam Wang    def lb       = "b0000".U
430d200f594SWilliam Wang    def lh       = "b0001".U
431d200f594SWilliam Wang    def lw       = "b0010".U
432d200f594SWilliam Wang    def ld       = "b0011".U
433d200f594SWilliam Wang    def lbu      = "b0100".U
434d200f594SWilliam Wang    def lhu      = "b0101".U
435d200f594SWilliam Wang    def lwu      = "b0110".U
436ca18a0b4SWilliam Wang
437d200f594SWilliam Wang    // Zicbop software prefetch
438d200f594SWilliam Wang    // bit encoding: | prefetch 1 | 0 | prefetch type (2bit) |
439d200f594SWilliam Wang    def prefetch_i = "b1000".U // TODO
440d200f594SWilliam Wang    def prefetch_r = "b1001".U
441d200f594SWilliam Wang    def prefetch_w = "b1010".U
442ca18a0b4SWilliam Wang
443d200f594SWilliam Wang    def isPrefetch(op: UInt): Bool = op(3)
444d200f594SWilliam Wang
445d200f594SWilliam Wang    // store pipeline
446d200f594SWilliam Wang    // normal store
447d200f594SWilliam Wang    // bit encoding: | store 00 | size(2bit) |
448d200f594SWilliam Wang    def sb       = "b0000".U
449d200f594SWilliam Wang    def sh       = "b0001".U
450d200f594SWilliam Wang    def sw       = "b0010".U
451d200f594SWilliam Wang    def sd       = "b0011".U
452d200f594SWilliam Wang
453d200f594SWilliam Wang    // l1 cache op
454d200f594SWilliam Wang    // bit encoding: | cbo_zero 01 | size(2bit) 11 |
455d200f594SWilliam Wang    def cbo_zero  = "b0111".U
456d200f594SWilliam Wang
457d200f594SWilliam Wang    // llc op
458d200f594SWilliam Wang    // bit encoding: | prefetch 11 | suboptype(2bit) |
459d200f594SWilliam Wang    def cbo_clean = "b1100".U
460d200f594SWilliam Wang    def cbo_flush = "b1101".U
461d200f594SWilliam Wang    def cbo_inval = "b1110".U
462d200f594SWilliam Wang
463d200f594SWilliam Wang    def isCbo(op: UInt): Bool = op(3, 2) === "b11".U
4642225d46eSJiawei Lin
4652225d46eSJiawei Lin    // atomics
4662225d46eSJiawei Lin    // bit(1, 0) are size
4672225d46eSJiawei Lin    // since atomics use a different fu type
4682225d46eSJiawei Lin    // so we can safely reuse other load/store's encodings
469d200f594SWilliam Wang    // bit encoding: | optype(4bit) | size (2bit) |
4702225d46eSJiawei Lin    def lr_w      = "b000010".U
4712225d46eSJiawei Lin    def sc_w      = "b000110".U
4722225d46eSJiawei Lin    def amoswap_w = "b001010".U
4732225d46eSJiawei Lin    def amoadd_w  = "b001110".U
4742225d46eSJiawei Lin    def amoxor_w  = "b010010".U
4752225d46eSJiawei Lin    def amoand_w  = "b010110".U
4762225d46eSJiawei Lin    def amoor_w   = "b011010".U
4772225d46eSJiawei Lin    def amomin_w  = "b011110".U
4782225d46eSJiawei Lin    def amomax_w  = "b100010".U
4792225d46eSJiawei Lin    def amominu_w = "b100110".U
4802225d46eSJiawei Lin    def amomaxu_w = "b101010".U
4812225d46eSJiawei Lin
4822225d46eSJiawei Lin    def lr_d      = "b000011".U
4832225d46eSJiawei Lin    def sc_d      = "b000111".U
4842225d46eSJiawei Lin    def amoswap_d = "b001011".U
4852225d46eSJiawei Lin    def amoadd_d  = "b001111".U
4862225d46eSJiawei Lin    def amoxor_d  = "b010011".U
4872225d46eSJiawei Lin    def amoand_d  = "b010111".U
4882225d46eSJiawei Lin    def amoor_d   = "b011011".U
4892225d46eSJiawei Lin    def amomin_d  = "b011111".U
4902225d46eSJiawei Lin    def amomax_d  = "b100011".U
4912225d46eSJiawei Lin    def amominu_d = "b100111".U
4922225d46eSJiawei Lin    def amomaxu_d = "b101011".U
493b6982e83SLemover
494b6982e83SLemover    def size(op: UInt) = op(1,0)
4952225d46eSJiawei Lin  }
4962225d46eSJiawei Lin
4973feeca58Szfw  object BKUOpType {
498ee8ff153Szfw
4993feeca58Szfw    def clmul       = "b000000".U
5003feeca58Szfw    def clmulh      = "b000001".U
5013feeca58Szfw    def clmulr      = "b000010".U
5023feeca58Szfw    def xpermn      = "b000100".U
5033feeca58Szfw    def xpermb      = "b000101".U
504ee8ff153Szfw
5053feeca58Szfw    def clz         = "b001000".U
5063feeca58Szfw    def clzw        = "b001001".U
5073feeca58Szfw    def ctz         = "b001010".U
5083feeca58Szfw    def ctzw        = "b001011".U
5093feeca58Szfw    def cpop        = "b001100".U
5103feeca58Szfw    def cpopw       = "b001101".U
51107596dc6Szfw
5123feeca58Szfw    // 01xxxx is reserve
5133feeca58Szfw    def aes64es     = "b100000".U
5143feeca58Szfw    def aes64esm    = "b100001".U
5153feeca58Szfw    def aes64ds     = "b100010".U
5163feeca58Szfw    def aes64dsm    = "b100011".U
5173feeca58Szfw    def aes64im     = "b100100".U
5183feeca58Szfw    def aes64ks1i   = "b100101".U
5193feeca58Szfw    def aes64ks2    = "b100110".U
5203feeca58Szfw
5213feeca58Szfw    // merge to two instruction sm4ks & sm4ed
52219bcce38SFawang Zhang    def sm4ed0      = "b101000".U
52319bcce38SFawang Zhang    def sm4ed1      = "b101001".U
52419bcce38SFawang Zhang    def sm4ed2      = "b101010".U
52519bcce38SFawang Zhang    def sm4ed3      = "b101011".U
52619bcce38SFawang Zhang    def sm4ks0      = "b101100".U
52719bcce38SFawang Zhang    def sm4ks1      = "b101101".U
52819bcce38SFawang Zhang    def sm4ks2      = "b101110".U
52919bcce38SFawang Zhang    def sm4ks3      = "b101111".U
5303feeca58Szfw
5313feeca58Szfw    def sha256sum0  = "b110000".U
5323feeca58Szfw    def sha256sum1  = "b110001".U
5333feeca58Szfw    def sha256sig0  = "b110010".U
5343feeca58Szfw    def sha256sig1  = "b110011".U
5353feeca58Szfw    def sha512sum0  = "b110100".U
5363feeca58Szfw    def sha512sum1  = "b110101".U
5373feeca58Szfw    def sha512sig0  = "b110110".U
5383feeca58Szfw    def sha512sig1  = "b110111".U
5393feeca58Szfw
5403feeca58Szfw    def sm3p0       = "b111000".U
5413feeca58Szfw    def sm3p1       = "b111001".U
542ee8ff153Szfw  }
543ee8ff153Szfw
5442225d46eSJiawei Lin  object BTBtype {
5452225d46eSJiawei Lin    def B = "b00".U  // branch
5462225d46eSJiawei Lin    def J = "b01".U  // jump
5472225d46eSJiawei Lin    def I = "b10".U  // indirect
5482225d46eSJiawei Lin    def R = "b11".U  // return
5492225d46eSJiawei Lin
5502225d46eSJiawei Lin    def apply() = UInt(2.W)
5512225d46eSJiawei Lin  }
5522225d46eSJiawei Lin
5532225d46eSJiawei Lin  object SelImm {
554ee8ff153Szfw    def IMM_X  = "b0111".U
555d91483a6Sfdy    def IMM_S  = "b1110".U
556ee8ff153Szfw    def IMM_SB = "b0001".U
557ee8ff153Szfw    def IMM_U  = "b0010".U
558ee8ff153Szfw    def IMM_UJ = "b0011".U
559ee8ff153Szfw    def IMM_I  = "b0100".U
560ee8ff153Szfw    def IMM_Z  = "b0101".U
561ee8ff153Szfw    def INVALID_INSTR = "b0110".U
562ee8ff153Szfw    def IMM_B6 = "b1000".U
5632225d46eSJiawei Lin
56458c35d23Shuxuan0307    def IMM_OPIVIS = "b1001".U
56558c35d23Shuxuan0307    def IMM_OPIVIU = "b1010".U
566912e2179SXuan Hu    def IMM_VSETVLI   = "b1100".U
567912e2179SXuan Hu    def IMM_VSETIVLI  = "b1101".U
568fe528fd6Ssinsanction    def IMM_LUI32 = "b1011".U
56958c35d23Shuxuan0307
57057a10886SXuan Hu    def X      = BitPat("b0000")
5716e7c9679Shuxuan0307
572ee8ff153Szfw    def apply() = UInt(4.W)
5730655b1a0SXuan Hu
5740655b1a0SXuan Hu    def mkString(immType: UInt) : String = {
5750655b1a0SXuan Hu      val strMap = Map(
5760655b1a0SXuan Hu        IMM_S.litValue         -> "S",
5770655b1a0SXuan Hu        IMM_SB.litValue        -> "SB",
5780655b1a0SXuan Hu        IMM_U.litValue         -> "U",
5790655b1a0SXuan Hu        IMM_UJ.litValue        -> "UJ",
5800655b1a0SXuan Hu        IMM_I.litValue         -> "I",
5810655b1a0SXuan Hu        IMM_Z.litValue         -> "Z",
5820655b1a0SXuan Hu        IMM_B6.litValue        -> "B6",
5830655b1a0SXuan Hu        IMM_OPIVIS.litValue    -> "VIS",
5840655b1a0SXuan Hu        IMM_OPIVIU.litValue    -> "VIU",
5850655b1a0SXuan Hu        IMM_VSETVLI.litValue   -> "VSETVLI",
5860655b1a0SXuan Hu        IMM_VSETIVLI.litValue  -> "VSETIVLI",
587fe528fd6Ssinsanction        IMM_LUI32.litValue     -> "LUI32",
5880655b1a0SXuan Hu        INVALID_INSTR.litValue -> "INVALID",
5890655b1a0SXuan Hu      )
5900655b1a0SXuan Hu      strMap(immType.litValue)
5910655b1a0SXuan Hu    }
5922225d46eSJiawei Lin  }
5932225d46eSJiawei Lin
594e2695e90SzhanglyGit  object UopSplitType {
595d91483a6Sfdy    def SCA_SIM          = "b000000".U //
596d91483a6Sfdy    def DIR              = "b010001".U // dirty: vset
597d91483a6Sfdy    def VEC_VVV          = "b010010".U // VEC_VVV
598d91483a6Sfdy    def VEC_VXV          = "b010011".U // VEC_VXV
599d91483a6Sfdy    def VEC_0XV          = "b010100".U // VEC_0XV
600d91483a6Sfdy    def VEC_VVW          = "b010101".U // VEC_VVW
601d91483a6Sfdy    def VEC_WVW          = "b010110".U // VEC_WVW
602d91483a6Sfdy    def VEC_VXW          = "b010111".U // VEC_VXW
603d91483a6Sfdy    def VEC_WXW          = "b011000".U // VEC_WXW
604d91483a6Sfdy    def VEC_WVV          = "b011001".U // VEC_WVV
605d91483a6Sfdy    def VEC_WXV          = "b011010".U // VEC_WXV
606d91483a6Sfdy    def VEC_EXT2         = "b011011".U // VF2 0 -> V
607d91483a6Sfdy    def VEC_EXT4         = "b011100".U // VF4 0 -> V
608d91483a6Sfdy    def VEC_EXT8         = "b011101".U // VF8 0 -> V
609d91483a6Sfdy    def VEC_VVM          = "b011110".U // VEC_VVM
610d91483a6Sfdy    def VEC_VXM          = "b011111".U // VEC_VXM
611d91483a6Sfdy    def VEC_SLIDE1UP     = "b100000".U // vslide1up.vx
612d91483a6Sfdy    def VEC_FSLIDE1UP    = "b100001".U // vfslide1up.vf
613d91483a6Sfdy    def VEC_SLIDE1DOWN   = "b100010".U // vslide1down.vx
614d91483a6Sfdy    def VEC_FSLIDE1DOWN  = "b100011".U // vfslide1down.vf
615d91483a6Sfdy    def VEC_VRED         = "b100100".U // VEC_VRED
616d91483a6Sfdy    def VEC_SLIDEUP      = "b100101".U // VEC_SLIDEUP
617d91483a6Sfdy    def VEC_ISLIDEUP     = "b100110".U // VEC_ISLIDEUP
618d91483a6Sfdy    def VEC_SLIDEDOWN    = "b100111".U // VEC_SLIDEDOWN
619d91483a6Sfdy    def VEC_ISLIDEDOWN   = "b101000".U // VEC_ISLIDEDOWN
620d91483a6Sfdy    def VEC_M0X          = "b101001".U // VEC_M0X  0MV
621d91483a6Sfdy    def VEC_MVV          = "b101010".U // VEC_MVV  VMV
622d91483a6Sfdy    def VEC_M0X_VFIRST   = "b101011".U //
62384260280Sczw    def VEC_VWW          = "b101100".U //
62465df1368Sczw    def VEC_RGATHER      = "b101101".U // vrgather.vv, vrgather.vi
62565df1368Sczw    def VEC_RGATHER_VX   = "b101110".U // vrgather.vx
62665df1368Sczw    def VEC_RGATHEREI16  = "b101111".U // vrgatherei16.vv
627adf68ff3Sczw    def VEC_COMPRESS     = "b110000".U // vcompress.vm
6284ee69032SzhanglyGit    def VEC_US_LD        = "b110001".U // vector unit strided load
629684d7aceSxiaofeibao-xjtu    def VEC_VFV          = "b111000".U // VEC_VFV
6303748ec56Sxiaofeibao-xjtu    def VEC_VFW          = "b111001".U // VEC_VFW
6313748ec56Sxiaofeibao-xjtu    def VEC_WFW          = "b111010".U // VEC_WVW
632f06d6d60Sxiaofeibao-xjtu    def VEC_VFM          = "b111011".U // VEC_VFM
633582849ffSxiaofeibao-xjtu    def VEC_VFRED        = "b111100".U // VEC_VFRED
634b94b1889Sxiaofeibao-xjtu    def VEC_VFREDOSUM    = "b111101".U // VEC_VFREDOSUM
635d91483a6Sfdy    def VEC_M0M          = "b000000".U // VEC_M0M
636d91483a6Sfdy    def VEC_MMM          = "b000000".U // VEC_MMM
637d91483a6Sfdy    def dummy     = "b111111".U
638d91483a6Sfdy
639d91483a6Sfdy    def X = BitPat("b000000")
640d91483a6Sfdy
641d91483a6Sfdy    def apply() = UInt(6.W)
642e2695e90SzhanglyGit    def needSplit(UopSplitType: UInt) = UopSplitType(4) || UopSplitType(5)
643d91483a6Sfdy  }
644d91483a6Sfdy
6456ab6918fSYinan Xu  object ExceptionNO {
6466ab6918fSYinan Xu    def instrAddrMisaligned = 0
6476ab6918fSYinan Xu    def instrAccessFault    = 1
6486ab6918fSYinan Xu    def illegalInstr        = 2
6496ab6918fSYinan Xu    def breakPoint          = 3
6506ab6918fSYinan Xu    def loadAddrMisaligned  = 4
6516ab6918fSYinan Xu    def loadAccessFault     = 5
6526ab6918fSYinan Xu    def storeAddrMisaligned = 6
6536ab6918fSYinan Xu    def storeAccessFault    = 7
6546ab6918fSYinan Xu    def ecallU              = 8
6556ab6918fSYinan Xu    def ecallS              = 9
6566ab6918fSYinan Xu    def ecallM              = 11
6576ab6918fSYinan Xu    def instrPageFault      = 12
6586ab6918fSYinan Xu    def loadPageFault       = 13
6596ab6918fSYinan Xu    // def singleStep          = 14
6606ab6918fSYinan Xu    def storePageFault      = 15
6616ab6918fSYinan Xu    def priorities = Seq(
6626ab6918fSYinan Xu      breakPoint, // TODO: different BP has different priority
6636ab6918fSYinan Xu      instrPageFault,
6646ab6918fSYinan Xu      instrAccessFault,
6656ab6918fSYinan Xu      illegalInstr,
6666ab6918fSYinan Xu      instrAddrMisaligned,
6676ab6918fSYinan Xu      ecallM, ecallS, ecallU,
668d880177dSYinan Xu      storeAddrMisaligned,
669d880177dSYinan Xu      loadAddrMisaligned,
6706ab6918fSYinan Xu      storePageFault,
6716ab6918fSYinan Xu      loadPageFault,
6726ab6918fSYinan Xu      storeAccessFault,
673d880177dSYinan Xu      loadAccessFault
6746ab6918fSYinan Xu    )
6756ab6918fSYinan Xu    def all = priorities.distinct.sorted
6766ab6918fSYinan Xu    def frontendSet = Seq(
6776ab6918fSYinan Xu      instrAddrMisaligned,
6786ab6918fSYinan Xu      instrAccessFault,
6796ab6918fSYinan Xu      illegalInstr,
6806ab6918fSYinan Xu      instrPageFault
6816ab6918fSYinan Xu    )
6826ab6918fSYinan Xu    def partialSelect(vec: Vec[Bool], select: Seq[Int]): Vec[Bool] = {
6836ab6918fSYinan Xu      val new_vec = Wire(ExceptionVec())
6846ab6918fSYinan Xu      new_vec.foreach(_ := false.B)
6856ab6918fSYinan Xu      select.foreach(i => new_vec(i) := vec(i))
6866ab6918fSYinan Xu      new_vec
6876ab6918fSYinan Xu    }
6886ab6918fSYinan Xu    def selectFrontend(vec: Vec[Bool]): Vec[Bool] = partialSelect(vec, frontendSet)
6896ab6918fSYinan Xu    def selectAll(vec: Vec[Bool]): Vec[Bool] = partialSelect(vec, ExceptionNO.all)
6906ab6918fSYinan Xu    def selectByFu(vec:Vec[Bool], fuConfig: FuConfig): Vec[Bool] =
6916ab6918fSYinan Xu      partialSelect(vec, fuConfig.exceptionOut)
6926ab6918fSYinan Xu  }
6936ab6918fSYinan Xu
694d2b20d1aSTang Haojin  // indicates where the memory access request comes from
695d2b20d1aSTang Haojin  // a dupliacte of this is in HuanCun.common and CoupledL2.common
696d2b20d1aSTang Haojin  // TODO: consider moving it to Utility, so that they could share the same definition
697d2b20d1aSTang Haojin  object MemReqSource extends Enumeration {
698d2b20d1aSTang Haojin    val NoWhere = Value("NoWhere")
699d2b20d1aSTang Haojin
700d2b20d1aSTang Haojin    val CPUInst = Value("CPUInst")
701d2b20d1aSTang Haojin    val CPULoadData = Value("CPULoadData")
702d2b20d1aSTang Haojin    val CPUStoreData = Value("CPUStoreData")
703d2b20d1aSTang Haojin    val CPUAtomicData = Value("CPUAtomicData")
704d2b20d1aSTang Haojin    val L1InstPrefetch = Value("L1InstPrefetch")
705d2b20d1aSTang Haojin    val L1DataPrefetch = Value("L1DataPrefetch")
706d2b20d1aSTang Haojin    val PTW = Value("PTW")
707d2b20d1aSTang Haojin    val L2Prefetch = Value("L2Prefetch")
708d2b20d1aSTang Haojin    val ReqSourceCount = Value("ReqSourceCount")
709d2b20d1aSTang Haojin
710d2b20d1aSTang Haojin    val reqSourceBits = log2Ceil(ReqSourceCount.id)
711d2b20d1aSTang Haojin  }
712d2b20d1aSTang Haojin
713d2b20d1aSTang Haojin  object TopDownCounters extends Enumeration {
714d2b20d1aSTang Haojin    val NoStall = Value("NoStall") // Base
715d2b20d1aSTang Haojin    // frontend
716d2b20d1aSTang Haojin    val OverrideBubble = Value("OverrideBubble")
717d2b20d1aSTang Haojin    val FtqUpdateBubble = Value("FtqUpdateBubble")
718d2b20d1aSTang Haojin    // val ControlRedirectBubble = Value("ControlRedirectBubble")
719d2b20d1aSTang Haojin    val TAGEMissBubble = Value("TAGEMissBubble")
720d2b20d1aSTang Haojin    val SCMissBubble = Value("SCMissBubble")
721d2b20d1aSTang Haojin    val ITTAGEMissBubble = Value("ITTAGEMissBubble")
722d2b20d1aSTang Haojin    val RASMissBubble = Value("RASMissBubble")
723d2b20d1aSTang Haojin    val MemVioRedirectBubble = Value("MemVioRedirectBubble")
724d2b20d1aSTang Haojin    val OtherRedirectBubble = Value("OtherRedirectBubble")
725d2b20d1aSTang Haojin    val FtqFullStall = Value("FtqFullStall")
726d2b20d1aSTang Haojin
727d2b20d1aSTang Haojin    val ICacheMissBubble = Value("ICacheMissBubble")
728d2b20d1aSTang Haojin    val ITLBMissBubble = Value("ITLBMissBubble")
729d2b20d1aSTang Haojin    val BTBMissBubble = Value("BTBMissBubble")
730d2b20d1aSTang Haojin    val FetchFragBubble = Value("FetchFragBubble")
731d2b20d1aSTang Haojin
732d2b20d1aSTang Haojin    // backend
733d2b20d1aSTang Haojin    // long inst stall at rob head
734d2b20d1aSTang Haojin    val DivStall = Value("DivStall") // int div, float div/sqrt
735d2b20d1aSTang Haojin    val IntNotReadyStall = Value("IntNotReadyStall") // int-inst at rob head not issue
736d2b20d1aSTang Haojin    val FPNotReadyStall = Value("FPNotReadyStall") // fp-inst at rob head not issue
737d2b20d1aSTang Haojin    val MemNotReadyStall = Value("MemNotReadyStall") // mem-inst at rob head not issue
738d2b20d1aSTang Haojin    // freelist full
739d2b20d1aSTang Haojin    val IntFlStall = Value("IntFlStall")
740d2b20d1aSTang Haojin    val FpFlStall = Value("FpFlStall")
741d2b20d1aSTang Haojin    // dispatch queue full
742d2b20d1aSTang Haojin    val IntDqStall = Value("IntDqStall")
743d2b20d1aSTang Haojin    val FpDqStall = Value("FpDqStall")
744d2b20d1aSTang Haojin    val LsDqStall = Value("LsDqStall")
745d2b20d1aSTang Haojin
746d2b20d1aSTang Haojin    // memblock
747d2b20d1aSTang Haojin    val LoadTLBStall = Value("LoadTLBStall")
748d2b20d1aSTang Haojin    val LoadL1Stall = Value("LoadL1Stall")
749d2b20d1aSTang Haojin    val LoadL2Stall = Value("LoadL2Stall")
750d2b20d1aSTang Haojin    val LoadL3Stall = Value("LoadL3Stall")
751d2b20d1aSTang Haojin    val LoadMemStall = Value("LoadMemStall")
752d2b20d1aSTang Haojin    val StoreStall = Value("StoreStall") // include store tlb miss
753d2b20d1aSTang Haojin    val AtomicStall = Value("AtomicStall") // atomic, load reserved, store conditional
754d2b20d1aSTang Haojin
755d2b20d1aSTang Haojin    // xs replay (different to gem5)
756d2b20d1aSTang Haojin    val LoadVioReplayStall = Value("LoadVioReplayStall")
757d2b20d1aSTang Haojin    val LoadMSHRReplayStall = Value("LoadMSHRReplayStall")
758d2b20d1aSTang Haojin
759d2b20d1aSTang Haojin    // bad speculation
760d2b20d1aSTang Haojin    val ControlRecoveryStall = Value("ControlRecoveryStall")
761d2b20d1aSTang Haojin    val MemVioRecoveryStall = Value("MemVioRecoveryStall")
762d2b20d1aSTang Haojin    val OtherRecoveryStall = Value("OtherRecoveryStall")
763d2b20d1aSTang Haojin
764d2b20d1aSTang Haojin    val FlushedInsts = Value("FlushedInsts") // control flushed, memvio flushed, others
765d2b20d1aSTang Haojin
766d2b20d1aSTang Haojin    val OtherCoreStall = Value("OtherCoreStall")
767d2b20d1aSTang Haojin
768d2b20d1aSTang Haojin    val NumStallReasons = Value("NumStallReasons")
769d2b20d1aSTang Haojin  }
7709a2e6b8aSLinJiawei}
771