xref: /XiangShan/src/main/scala/xiangshan/package.scala (revision 730cfbc0bf03569aa07dd82ba3fb41eb7413e13c)
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._
24*730cfbc0SXuan 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
3304b56283SZhangZifei
341285b047SXuan Hu    // alias
351285b047SXuan Hu    def reg = this.xp
361a3df1feSYikeZhou    def DC  = imm // Don't Care
3757a10886SXuan Hu    def X   = BitPat("b000")
384d24c305SYikeZhou
3904b56283SZhangZifei    def isPc(srcType: UInt) = srcType===pc
4004b56283SZhangZifei    def isImm(srcType: UInt) = srcType===imm
411285b047SXuan Hu    def isReg(srcType: UInt) = srcType(0)
429ca09953SXuan Hu    def isXp(srcType: UInt) = srcType(0)
432b4e8253SYinan Xu    def isFp(srcType: UInt) = srcType(1)
441285b047SXuan Hu    def isVp(srcType: UInt) = srcType(2)
451285b047SXuan Hu    def isPcOrImm(srcType: UInt) = isPc(srcType) || isImm(srcType)
469ca09953SXuan Hu    def isNotReg(srcType: UInt): Bool = !srcType.orR
47351e22f2SXuan Hu    def isVfp(srcType: UInt) = isVp(srcType) || isFp(srcType)
481285b047SXuan Hu    def apply() = UInt(3.W)
499a2e6b8aSLinJiawei  }
509a2e6b8aSLinJiawei
519a2e6b8aSLinJiawei  object SrcState {
52100aa93cSYinan Xu    def busy    = "b0".U
53100aa93cSYinan Xu    def rdy     = "b1".U
54100aa93cSYinan Xu    // def specRdy = "b10".U // speculative ready, for future use
55100aa93cSYinan Xu    def apply() = UInt(1.W)
569ca09953SXuan Hu
579ca09953SXuan Hu    def isReady(state: UInt): Bool = state === this.rdy
589ca09953SXuan Hu    def isBusy(state: UInt): Bool = state === this.busy
599a2e6b8aSLinJiawei  }
609a2e6b8aSLinJiawei
6157a10886SXuan Hu  def FuOpTypeWidth = 8
622225d46eSJiawei Lin  object FuOpType {
6357a10886SXuan Hu    def apply() = UInt(FuOpTypeWidth.W)
6457a10886SXuan Hu    def X = BitPat("b00000000")
65ebd97ecbSzhanglinjuan  }
66518d8658SYinan Xu
677f2b7720SXuan Hu  object VlduType {
6857a10886SXuan Hu    def dummy = 0.U
697f2b7720SXuan Hu  }
707f2b7720SXuan Hu
717f2b7720SXuan Hu  object VstuType {
7257a10886SXuan Hu    def dummy = 0.U
737f2b7720SXuan Hu  }
747f2b7720SXuan Hu
75a3edac52SYinan Xu  object CommitType {
76c3abb8b6SYinan Xu    def NORMAL = "b000".U  // int/fp
77c3abb8b6SYinan Xu    def BRANCH = "b001".U  // branch
78c3abb8b6SYinan Xu    def LOAD   = "b010".U  // load
79c3abb8b6SYinan Xu    def STORE  = "b011".U  // store
80518d8658SYinan Xu
81c3abb8b6SYinan Xu    def apply() = UInt(3.W)
82c3abb8b6SYinan Xu    def isFused(commitType: UInt): Bool = commitType(2)
83c3abb8b6SYinan Xu    def isLoadStore(commitType: UInt): Bool = !isFused(commitType) && commitType(1)
84c3abb8b6SYinan Xu    def lsInstIsStore(commitType: UInt): Bool = commitType(0)
85c3abb8b6SYinan Xu    def isStore(commitType: UInt): Bool = isLoadStore(commitType) && lsInstIsStore(commitType)
86c3abb8b6SYinan Xu    def isBranch(commitType: UInt): Bool = commitType(0) && !commitType(1) && !isFused(commitType)
87518d8658SYinan Xu  }
88bfb958a3SYinan Xu
89bfb958a3SYinan Xu  object RedirectLevel {
902d7c7105SYinan Xu    def flushAfter = "b0".U
912d7c7105SYinan Xu    def flush      = "b1".U
92bfb958a3SYinan Xu
932d7c7105SYinan Xu    def apply() = UInt(1.W)
942d7c7105SYinan Xu    // def isUnconditional(level: UInt) = level(1)
95bfb958a3SYinan Xu    def flushItself(level: UInt) = level(0)
962d7c7105SYinan Xu    // def isException(level: UInt) = level(1) && level(0)
97bfb958a3SYinan Xu  }
98baf8def6SYinan Xu
99baf8def6SYinan Xu  object ExceptionVec {
100baf8def6SYinan Xu    def apply() = Vec(16, Bool())
101baf8def6SYinan Xu  }
102a8e04b1dSYinan Xu
103c60c1ab4SWilliam Wang  object PMAMode {
1048d9a04fcSWilliam Wang    def R = "b1".U << 0 //readable
1058d9a04fcSWilliam Wang    def W = "b1".U << 1 //writeable
1068d9a04fcSWilliam Wang    def X = "b1".U << 2 //executable
1078d9a04fcSWilliam Wang    def I = "b1".U << 3 //cacheable: icache
1088d9a04fcSWilliam Wang    def D = "b1".U << 4 //cacheable: dcache
1098d9a04fcSWilliam Wang    def S = "b1".U << 5 //enable speculative access
110cff68e26SWilliam Wang    def A = "b1".U << 6 //enable atomic operation, A imply R & W
1118d9a04fcSWilliam Wang    def C = "b1".U << 7 //if it is cacheable is configable
112c60c1ab4SWilliam Wang    def Reserved = "b0".U
113c60c1ab4SWilliam Wang
114c60c1ab4SWilliam Wang    def apply() = UInt(7.W)
115c60c1ab4SWilliam Wang
116c60c1ab4SWilliam Wang    def read(mode: UInt) = mode(0)
117c60c1ab4SWilliam Wang    def write(mode: UInt) = mode(1)
118c60c1ab4SWilliam Wang    def execute(mode: UInt) = mode(2)
119c60c1ab4SWilliam Wang    def icache(mode: UInt) = mode(3)
120c60c1ab4SWilliam Wang    def dcache(mode: UInt) = mode(4)
121c60c1ab4SWilliam Wang    def speculate(mode: UInt) = mode(5)
122c60c1ab4SWilliam Wang    def atomic(mode: UInt) = mode(6)
123c60c1ab4SWilliam Wang    def configable_cache(mode: UInt) = mode(7)
124c60c1ab4SWilliam Wang
125c60c1ab4SWilliam Wang    def strToMode(s: String) = {
126423b9255SWilliam Wang      var result = 0.U(8.W)
127c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("R") >= 0) result = result + R
128c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("W") >= 0) result = result + W
129c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("X") >= 0) result = result + X
130c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("I") >= 0) result = result + I
131c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("D") >= 0) result = result + D
132c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("S") >= 0) result = result + S
133c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("A") >= 0) result = result + A
134c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("C") >= 0) result = result + C
135c60c1ab4SWilliam Wang      result
136c60c1ab4SWilliam Wang    }
137c60c1ab4SWilliam Wang  }
1382225d46eSJiawei Lin
1392225d46eSJiawei Lin
1402225d46eSJiawei Lin  object CSROpType {
1412225d46eSJiawei Lin    def jmp  = "b000".U
1422225d46eSJiawei Lin    def wrt  = "b001".U
1432225d46eSJiawei Lin    def set  = "b010".U
1442225d46eSJiawei Lin    def clr  = "b011".U
145b6900d94SYinan Xu    def wfi  = "b100".U
1462225d46eSJiawei Lin    def wrti = "b101".U
1472225d46eSJiawei Lin    def seti = "b110".U
1482225d46eSJiawei Lin    def clri = "b111".U
1495d669833SYinan Xu    def needAccess(op: UInt): Bool = op(1, 0) =/= 0.U
1502225d46eSJiawei Lin  }
1512225d46eSJiawei Lin
1522225d46eSJiawei Lin  // jump
1532225d46eSJiawei Lin  object JumpOpType {
1542225d46eSJiawei Lin    def jal  = "b00".U
1552225d46eSJiawei Lin    def jalr = "b01".U
1562225d46eSJiawei Lin    def auipc = "b10".U
1572225d46eSJiawei Lin//    def call = "b11_011".U
1582225d46eSJiawei Lin//    def ret  = "b11_100".U
1592225d46eSJiawei Lin    def jumpOpisJalr(op: UInt) = op(0)
1602225d46eSJiawei Lin    def jumpOpisAuipc(op: UInt) = op(1)
1612225d46eSJiawei Lin  }
1622225d46eSJiawei Lin
1632225d46eSJiawei Lin  object FenceOpType {
1642225d46eSJiawei Lin    def fence  = "b10000".U
1652225d46eSJiawei Lin    def sfence = "b10001".U
1662225d46eSJiawei Lin    def fencei = "b10010".U
167af2f7849Shappy-lx    def nofence= "b00000".U
1682225d46eSJiawei Lin  }
1692225d46eSJiawei Lin
1702225d46eSJiawei Lin  object ALUOpType {
171ee8ff153Szfw    // shift optype
172675acc68SYinan Xu    def slliuw     = "b000_0000".U // slliuw: ZEXT(src1[31:0]) << shamt
173675acc68SYinan Xu    def sll        = "b000_0001".U // sll:     src1 << src2
174ee8ff153Szfw
175675acc68SYinan Xu    def bclr       = "b000_0010".U // bclr:    src1 & ~(1 << src2[5:0])
176675acc68SYinan Xu    def bset       = "b000_0011".U // bset:    src1 | (1 << src2[5:0])
177675acc68SYinan Xu    def binv       = "b000_0100".U // binv:    src1 ^ ~(1 << src2[5:0])
178ee8ff153Szfw
179675acc68SYinan Xu    def srl        = "b000_0101".U // srl:     src1 >> src2
180675acc68SYinan Xu    def bext       = "b000_0110".U // bext:    (src1 >> src2)[0]
181675acc68SYinan Xu    def sra        = "b000_0111".U // sra:     src1 >> src2 (arithmetic)
182ee8ff153Szfw
1837b441e5eSYinan Xu    def rol        = "b000_1001".U // rol:     (src1 << src2) | (src1 >> (xlen - src2))
1847b441e5eSYinan Xu    def ror        = "b000_1011".U // ror:     (src1 >> src2) | (src1 << (xlen - src2))
185184a1958Szfw
186ee8ff153Szfw    // RV64 32bit optype
187675acc68SYinan Xu    def addw       = "b001_0000".U // addw:      SEXT((src1 + src2)[31:0])
188675acc68SYinan Xu    def oddaddw    = "b001_0001".U // oddaddw:   SEXT((src1[0] + src2)[31:0])
189675acc68SYinan Xu    def subw       = "b001_0010".U // subw:      SEXT((src1 - src2)[31:0])
190ee8ff153Szfw
191675acc68SYinan Xu    def addwbit    = "b001_0100".U // addwbit:   (src1 + src2)[0]
192675acc68SYinan Xu    def addwbyte   = "b001_0101".U // addwbyte:  (src1 + src2)[7:0]
193675acc68SYinan Xu    def addwzexth  = "b001_0110".U // addwzexth: ZEXT((src1  + src2)[15:0])
194675acc68SYinan Xu    def addwsexth  = "b001_0111".U // addwsexth: SEXT((src1  + src2)[15:0])
195ee8ff153Szfw
196675acc68SYinan Xu    def sllw       = "b001_1000".U // sllw:     SEXT((src1 << src2)[31:0])
197675acc68SYinan Xu    def srlw       = "b001_1001".U // srlw:     SEXT((src1[31:0] >> src2)[31:0])
198675acc68SYinan Xu    def sraw       = "b001_1010".U // sraw:     SEXT((src1[31:0] >> src2)[31:0])
199675acc68SYinan Xu    def rolw       = "b001_1100".U
200675acc68SYinan Xu    def rorw       = "b001_1101".U
201675acc68SYinan Xu
202675acc68SYinan Xu    // ADD-op
203675acc68SYinan Xu    def adduw      = "b010_0000".U // adduw:  src1[31:0]  + src2
204675acc68SYinan Xu    def add        = "b010_0001".U // add:     src1        + src2
205675acc68SYinan Xu    def oddadd     = "b010_0010".U // oddadd:  src1[0]     + src2
206675acc68SYinan Xu
207675acc68SYinan Xu    def sr29add    = "b010_0100".U // sr29add: src1[63:29] + src2
208675acc68SYinan Xu    def sr30add    = "b010_0101".U // sr30add: src1[63:30] + src2
209675acc68SYinan Xu    def sr31add    = "b010_0110".U // sr31add: src1[63:31] + src2
210675acc68SYinan Xu    def sr32add    = "b010_0111".U // sr32add: src1[63:32] + src2
211675acc68SYinan Xu
212675acc68SYinan Xu    def sh1adduw   = "b010_1000".U // sh1adduw: {src1[31:0], 1'b0} + src2
213675acc68SYinan Xu    def sh1add     = "b010_1001".U // sh1add: {src1[62:0], 1'b0} + src2
214675acc68SYinan Xu    def sh2adduw   = "b010_1010".U // sh2add_uw: {src1[31:0], 2'b0} + src2
215675acc68SYinan Xu    def sh2add     = "b010_1011".U // sh2add: {src1[61:0], 2'b0} + src2
216675acc68SYinan Xu    def sh3adduw   = "b010_1100".U // sh3add_uw: {src1[31:0], 3'b0} + src2
217675acc68SYinan Xu    def sh3add     = "b010_1101".U // sh3add: {src1[60:0], 3'b0} + src2
218675acc68SYinan Xu    def sh4add     = "b010_1111".U // sh4add: {src1[59:0], 4'b0} + src2
219675acc68SYinan Xu
220675acc68SYinan Xu    // SUB-op: src1 - src2
221675acc68SYinan Xu    def sub        = "b011_0000".U
222675acc68SYinan Xu    def sltu       = "b011_0001".U
223675acc68SYinan Xu    def slt        = "b011_0010".U
224675acc68SYinan Xu    def maxu       = "b011_0100".U
225675acc68SYinan Xu    def minu       = "b011_0101".U
226675acc68SYinan Xu    def max        = "b011_0110".U
227675acc68SYinan Xu    def min        = "b011_0111".U
228675acc68SYinan Xu
229675acc68SYinan Xu    // branch
230675acc68SYinan Xu    def beq        = "b111_0000".U
231675acc68SYinan Xu    def bne        = "b111_0010".U
232675acc68SYinan Xu    def blt        = "b111_1000".U
233675acc68SYinan Xu    def bge        = "b111_1010".U
234675acc68SYinan Xu    def bltu       = "b111_1100".U
235675acc68SYinan Xu    def bgeu       = "b111_1110".U
236675acc68SYinan Xu
237675acc68SYinan Xu    // misc optype
238675acc68SYinan Xu    def and        = "b100_0000".U
239675acc68SYinan Xu    def andn       = "b100_0001".U
240675acc68SYinan Xu    def or         = "b100_0010".U
241675acc68SYinan Xu    def orn        = "b100_0011".U
242675acc68SYinan Xu    def xor        = "b100_0100".U
243675acc68SYinan Xu    def xnor       = "b100_0101".U
244675acc68SYinan Xu    def orcb       = "b100_0110".U
245675acc68SYinan Xu
246675acc68SYinan Xu    def sextb      = "b100_1000".U
247675acc68SYinan Xu    def packh      = "b100_1001".U
248675acc68SYinan Xu    def sexth      = "b100_1010".U
249675acc68SYinan Xu    def packw      = "b100_1011".U
250675acc68SYinan Xu
251675acc68SYinan Xu    def revb       = "b101_0000".U
252675acc68SYinan Xu    def rev8       = "b101_0001".U
253675acc68SYinan Xu    def pack       = "b101_0010".U
254675acc68SYinan Xu    def orh48      = "b101_0011".U
255675acc68SYinan Xu
256675acc68SYinan Xu    def szewl1     = "b101_1000".U
257675acc68SYinan Xu    def szewl2     = "b101_1001".U
258675acc68SYinan Xu    def szewl3     = "b101_1010".U
259675acc68SYinan Xu    def byte2      = "b101_1011".U
260675acc68SYinan Xu
261675acc68SYinan Xu    def andlsb     = "b110_0000".U
262675acc68SYinan Xu    def andzexth   = "b110_0001".U
263675acc68SYinan Xu    def orlsb      = "b110_0010".U
264675acc68SYinan Xu    def orzexth    = "b110_0011".U
265675acc68SYinan Xu    def xorlsb     = "b110_0100".U
266675acc68SYinan Xu    def xorzexth   = "b110_0101".U
267675acc68SYinan Xu    def orcblsb    = "b110_0110".U
268675acc68SYinan Xu    def orcbzexth  = "b110_0111".U
2694aa9ed34Sfdy    def vsetvli1    = "b1000_0000".U
2704aa9ed34Sfdy    def vsetvli2    = "b1000_0100".U
2714aa9ed34Sfdy    def vsetvl1     = "b1000_0001".U
2724aa9ed34Sfdy    def vsetvl2     = "b1000_0101".U
2734aa9ed34Sfdy    def vsetivli1   = "b1000_0010".U
2744aa9ed34Sfdy    def vsetivli2   = "b1000_0110".U
275675acc68SYinan Xu
276675acc68SYinan Xu    def isAddw(func: UInt) = func(6, 4) === "b001".U && !func(3) && !func(1)
277675acc68SYinan Xu    def isSimpleLogic(func: UInt) = func(6, 4) === "b100".U && !func(0)
278675acc68SYinan Xu    def logicToLsb(func: UInt) = Cat("b110".U(3.W), func(3, 1), 0.U(1.W))
279675acc68SYinan Xu    def logicToZexth(func: UInt) = Cat("b110".U(3.W), func(3, 1), 1.U(1.W))
2804aa9ed34Sfdy    def isVset(func: UInt) = func(7, 3) === "b1000_0".U
2814aa9ed34Sfdy    def isVsetvl(func: UInt) = isVset(func) && func(0)
2824aa9ed34Sfdy    def isVsetvli(func: UInt) = isVset(func) && !func(1, 0).orR
2834aa9ed34Sfdy    def vsetExchange(func: UInt) = Cat(func(7, 3), "b1".U, func(1, 0))
284675acc68SYinan Xu
28557a10886SXuan Hu    def apply() = UInt(FuOpTypeWidth.W)
2862225d46eSJiawei Lin  }
2872225d46eSJiawei Lin
2883b739f49SXuan Hu  object BRUOpType {
2893b739f49SXuan Hu    // branch
2903b739f49SXuan Hu    def beq        = "b000_000".U
2913b739f49SXuan Hu    def bne        = "b000_001".U
2923b739f49SXuan Hu    def blt        = "b000_100".U
2933b739f49SXuan Hu    def bge        = "b000_101".U
2943b739f49SXuan Hu    def bltu       = "b001_000".U
2953b739f49SXuan Hu    def bgeu       = "b001_001".U
2963b739f49SXuan Hu
2973b739f49SXuan Hu    def getBranchType(func: UInt) = func(3, 1)
2983b739f49SXuan Hu    def isBranchInvert(func: UInt) = func(0)
2993b739f49SXuan Hu  }
3003b739f49SXuan Hu
3013b739f49SXuan Hu  object MULOpType {
3023b739f49SXuan Hu    // mul
3033b739f49SXuan Hu    // bit encoding: | type (2bit) | isWord(1bit) | opcode(2bit) |
3043b739f49SXuan Hu    def mul    = "b00000".U
3053b739f49SXuan Hu    def mulh   = "b00001".U
3063b739f49SXuan Hu    def mulhsu = "b00010".U
3073b739f49SXuan Hu    def mulhu  = "b00011".U
3083b739f49SXuan Hu    def mulw   = "b00100".U
3093b739f49SXuan Hu
3103b739f49SXuan Hu    def mulw7  = "b01100".U
3113b739f49SXuan Hu    def isSign(op: UInt) = !op(1)
3123b739f49SXuan Hu    def isW(op: UInt) = op(2)
3133b739f49SXuan Hu    def isH(op: UInt) = op(1, 0) =/= 0.U
3143b739f49SXuan Hu    def getOp(op: UInt) = Cat(op(3), op(1, 0))
3153b739f49SXuan Hu  }
3163b739f49SXuan Hu
3173b739f49SXuan Hu  object DIVOpType {
3183b739f49SXuan Hu    // div
3193b739f49SXuan Hu    // bit encoding: | type (2bit) | isWord(1bit) | isSign(1bit) | opcode(1bit) |
3203b739f49SXuan Hu    def div    = "b10000".U
3213b739f49SXuan Hu    def divu   = "b10010".U
3223b739f49SXuan Hu    def rem    = "b10001".U
3233b739f49SXuan Hu    def remu   = "b10011".U
3243b739f49SXuan Hu
3253b739f49SXuan Hu    def divw   = "b10100".U
3263b739f49SXuan Hu    def divuw  = "b10110".U
3273b739f49SXuan Hu    def remw   = "b10101".U
3283b739f49SXuan Hu    def remuw  = "b10111".U
3293b739f49SXuan Hu
3303b739f49SXuan Hu    def isSign(op: UInt) = !op(1)
3313b739f49SXuan Hu    def isW(op: UInt) = op(2)
3323b739f49SXuan Hu    def isH(op: UInt) = op(0)
3333b739f49SXuan Hu  }
3343b739f49SXuan Hu
3352225d46eSJiawei Lin  object MDUOpType {
3362225d46eSJiawei Lin    // mul
3372225d46eSJiawei Lin    // bit encoding: | type (2bit) | isWord(1bit) | opcode(2bit) |
3382225d46eSJiawei Lin    def mul    = "b00000".U
3392225d46eSJiawei Lin    def mulh   = "b00001".U
3402225d46eSJiawei Lin    def mulhsu = "b00010".U
3412225d46eSJiawei Lin    def mulhu  = "b00011".U
3422225d46eSJiawei Lin    def mulw   = "b00100".U
3432225d46eSJiawei Lin
34488825c5cSYinan Xu    def mulw7  = "b01100".U
34588825c5cSYinan Xu
3462225d46eSJiawei Lin    // div
3472225d46eSJiawei Lin    // bit encoding: | type (2bit) | isWord(1bit) | isSign(1bit) | opcode(1bit) |
34888825c5cSYinan Xu    def div    = "b10000".U
34988825c5cSYinan Xu    def divu   = "b10010".U
35088825c5cSYinan Xu    def rem    = "b10001".U
35188825c5cSYinan Xu    def remu   = "b10011".U
3522225d46eSJiawei Lin
35388825c5cSYinan Xu    def divw   = "b10100".U
35488825c5cSYinan Xu    def divuw  = "b10110".U
35588825c5cSYinan Xu    def remw   = "b10101".U
35688825c5cSYinan Xu    def remuw  = "b10111".U
3572225d46eSJiawei Lin
35888825c5cSYinan Xu    def isMul(op: UInt) = !op(4)
35988825c5cSYinan Xu    def isDiv(op: UInt) = op(4)
3602225d46eSJiawei Lin
3612225d46eSJiawei Lin    def isDivSign(op: UInt) = isDiv(op) && !op(1)
3622225d46eSJiawei Lin    def isW(op: UInt) = op(2)
3632225d46eSJiawei Lin    def isH(op: UInt) = (isDiv(op) && op(0)) || (isMul(op) && op(1, 0) =/= 0.U)
3642225d46eSJiawei Lin    def getMulOp(op: UInt) = op(1, 0)
3652225d46eSJiawei Lin  }
3662225d46eSJiawei Lin
3672225d46eSJiawei Lin  object LSUOpType {
368d200f594SWilliam Wang    // load pipeline
3692225d46eSJiawei Lin
370d200f594SWilliam Wang    // normal load
371d200f594SWilliam Wang    // Note: bit(1, 0) are size, DO NOT CHANGE
372d200f594SWilliam Wang    // bit encoding: | load 0 | is unsigned(1bit) | size(2bit) |
373d200f594SWilliam Wang    def lb       = "b0000".U
374d200f594SWilliam Wang    def lh       = "b0001".U
375d200f594SWilliam Wang    def lw       = "b0010".U
376d200f594SWilliam Wang    def ld       = "b0011".U
377d200f594SWilliam Wang    def lbu      = "b0100".U
378d200f594SWilliam Wang    def lhu      = "b0101".U
379d200f594SWilliam Wang    def lwu      = "b0110".U
380ca18a0b4SWilliam Wang
381d200f594SWilliam Wang    // Zicbop software prefetch
382d200f594SWilliam Wang    // bit encoding: | prefetch 1 | 0 | prefetch type (2bit) |
383d200f594SWilliam Wang    def prefetch_i = "b1000".U // TODO
384d200f594SWilliam Wang    def prefetch_r = "b1001".U
385d200f594SWilliam Wang    def prefetch_w = "b1010".U
386ca18a0b4SWilliam Wang
387d200f594SWilliam Wang    def isPrefetch(op: UInt): Bool = op(3)
388d200f594SWilliam Wang
389d200f594SWilliam Wang    // store pipeline
390d200f594SWilliam Wang    // normal store
391d200f594SWilliam Wang    // bit encoding: | store 00 | size(2bit) |
392d200f594SWilliam Wang    def sb       = "b0000".U
393d200f594SWilliam Wang    def sh       = "b0001".U
394d200f594SWilliam Wang    def sw       = "b0010".U
395d200f594SWilliam Wang    def sd       = "b0011".U
396d200f594SWilliam Wang
397d200f594SWilliam Wang    // l1 cache op
398d200f594SWilliam Wang    // bit encoding: | cbo_zero 01 | size(2bit) 11 |
399d200f594SWilliam Wang    def cbo_zero  = "b0111".U
400d200f594SWilliam Wang
401d200f594SWilliam Wang    // llc op
402d200f594SWilliam Wang    // bit encoding: | prefetch 11 | suboptype(2bit) |
403d200f594SWilliam Wang    def cbo_clean = "b1100".U
404d200f594SWilliam Wang    def cbo_flush = "b1101".U
405d200f594SWilliam Wang    def cbo_inval = "b1110".U
406d200f594SWilliam Wang
407d200f594SWilliam Wang    def isCbo(op: UInt): Bool = op(3, 2) === "b11".U
4082225d46eSJiawei Lin
4092225d46eSJiawei Lin    // atomics
4102225d46eSJiawei Lin    // bit(1, 0) are size
4112225d46eSJiawei Lin    // since atomics use a different fu type
4122225d46eSJiawei Lin    // so we can safely reuse other load/store's encodings
413d200f594SWilliam Wang    // bit encoding: | optype(4bit) | size (2bit) |
4142225d46eSJiawei Lin    def lr_w      = "b000010".U
4152225d46eSJiawei Lin    def sc_w      = "b000110".U
4162225d46eSJiawei Lin    def amoswap_w = "b001010".U
4172225d46eSJiawei Lin    def amoadd_w  = "b001110".U
4182225d46eSJiawei Lin    def amoxor_w  = "b010010".U
4192225d46eSJiawei Lin    def amoand_w  = "b010110".U
4202225d46eSJiawei Lin    def amoor_w   = "b011010".U
4212225d46eSJiawei Lin    def amomin_w  = "b011110".U
4222225d46eSJiawei Lin    def amomax_w  = "b100010".U
4232225d46eSJiawei Lin    def amominu_w = "b100110".U
4242225d46eSJiawei Lin    def amomaxu_w = "b101010".U
4252225d46eSJiawei Lin
4262225d46eSJiawei Lin    def lr_d      = "b000011".U
4272225d46eSJiawei Lin    def sc_d      = "b000111".U
4282225d46eSJiawei Lin    def amoswap_d = "b001011".U
4292225d46eSJiawei Lin    def amoadd_d  = "b001111".U
4302225d46eSJiawei Lin    def amoxor_d  = "b010011".U
4312225d46eSJiawei Lin    def amoand_d  = "b010111".U
4322225d46eSJiawei Lin    def amoor_d   = "b011011".U
4332225d46eSJiawei Lin    def amomin_d  = "b011111".U
4342225d46eSJiawei Lin    def amomax_d  = "b100011".U
4352225d46eSJiawei Lin    def amominu_d = "b100111".U
4362225d46eSJiawei Lin    def amomaxu_d = "b101011".U
437b6982e83SLemover
438b6982e83SLemover    def size(op: UInt) = op(1,0)
4392225d46eSJiawei Lin  }
4402225d46eSJiawei Lin
4413feeca58Szfw  object BKUOpType {
442ee8ff153Szfw
4433feeca58Szfw    def clmul       = "b000000".U
4443feeca58Szfw    def clmulh      = "b000001".U
4453feeca58Szfw    def clmulr      = "b000010".U
4463feeca58Szfw    def xpermn      = "b000100".U
4473feeca58Szfw    def xpermb      = "b000101".U
448ee8ff153Szfw
4493feeca58Szfw    def clz         = "b001000".U
4503feeca58Szfw    def clzw        = "b001001".U
4513feeca58Szfw    def ctz         = "b001010".U
4523feeca58Szfw    def ctzw        = "b001011".U
4533feeca58Szfw    def cpop        = "b001100".U
4543feeca58Szfw    def cpopw       = "b001101".U
45507596dc6Szfw
4563feeca58Szfw    // 01xxxx is reserve
4573feeca58Szfw    def aes64es     = "b100000".U
4583feeca58Szfw    def aes64esm    = "b100001".U
4593feeca58Szfw    def aes64ds     = "b100010".U
4603feeca58Szfw    def aes64dsm    = "b100011".U
4613feeca58Szfw    def aes64im     = "b100100".U
4623feeca58Szfw    def aes64ks1i   = "b100101".U
4633feeca58Szfw    def aes64ks2    = "b100110".U
4643feeca58Szfw
4653feeca58Szfw    // merge to two instruction sm4ks & sm4ed
46619bcce38SFawang Zhang    def sm4ed0      = "b101000".U
46719bcce38SFawang Zhang    def sm4ed1      = "b101001".U
46819bcce38SFawang Zhang    def sm4ed2      = "b101010".U
46919bcce38SFawang Zhang    def sm4ed3      = "b101011".U
47019bcce38SFawang Zhang    def sm4ks0      = "b101100".U
47119bcce38SFawang Zhang    def sm4ks1      = "b101101".U
47219bcce38SFawang Zhang    def sm4ks2      = "b101110".U
47319bcce38SFawang Zhang    def sm4ks3      = "b101111".U
4743feeca58Szfw
4753feeca58Szfw    def sha256sum0  = "b110000".U
4763feeca58Szfw    def sha256sum1  = "b110001".U
4773feeca58Szfw    def sha256sig0  = "b110010".U
4783feeca58Szfw    def sha256sig1  = "b110011".U
4793feeca58Szfw    def sha512sum0  = "b110100".U
4803feeca58Szfw    def sha512sum1  = "b110101".U
4813feeca58Szfw    def sha512sig0  = "b110110".U
4823feeca58Szfw    def sha512sig1  = "b110111".U
4833feeca58Szfw
4843feeca58Szfw    def sm3p0       = "b111000".U
4853feeca58Szfw    def sm3p1       = "b111001".U
486ee8ff153Szfw  }
487ee8ff153Szfw
4882225d46eSJiawei Lin  object BTBtype {
4892225d46eSJiawei Lin    def B = "b00".U  // branch
4902225d46eSJiawei Lin    def J = "b01".U  // jump
4912225d46eSJiawei Lin    def I = "b10".U  // indirect
4922225d46eSJiawei Lin    def R = "b11".U  // return
4932225d46eSJiawei Lin
4942225d46eSJiawei Lin    def apply() = UInt(2.W)
4952225d46eSJiawei Lin  }
4962225d46eSJiawei Lin
4972225d46eSJiawei Lin  object SelImm {
498ee8ff153Szfw    def IMM_X  = "b0111".U
499ee8ff153Szfw    def IMM_S  = "b0000".U
500ee8ff153Szfw    def IMM_SB = "b0001".U
501ee8ff153Szfw    def IMM_U  = "b0010".U
502ee8ff153Szfw    def IMM_UJ = "b0011".U
503ee8ff153Szfw    def IMM_I  = "b0100".U
504ee8ff153Szfw    def IMM_Z  = "b0101".U
505ee8ff153Szfw    def INVALID_INSTR = "b0110".U
506ee8ff153Szfw    def IMM_B6 = "b1000".U
5072225d46eSJiawei Lin
50858c35d23Shuxuan0307    def IMM_OPIVIS = "b1001".U
50958c35d23Shuxuan0307    def IMM_OPIVIU = "b1010".U
510912e2179SXuan Hu    def IMM_VSETVLI   = "b1100".U
511912e2179SXuan Hu    def IMM_VSETIVLI  = "b1101".U
51258c35d23Shuxuan0307
51357a10886SXuan Hu    def X      = BitPat("b0000")
5146e7c9679Shuxuan0307
515ee8ff153Szfw    def apply() = UInt(4.W)
5162225d46eSJiawei Lin  }
5172225d46eSJiawei Lin
5186ab6918fSYinan Xu  object ExceptionNO {
5196ab6918fSYinan Xu    def instrAddrMisaligned = 0
5206ab6918fSYinan Xu    def instrAccessFault    = 1
5216ab6918fSYinan Xu    def illegalInstr        = 2
5226ab6918fSYinan Xu    def breakPoint          = 3
5236ab6918fSYinan Xu    def loadAddrMisaligned  = 4
5246ab6918fSYinan Xu    def loadAccessFault     = 5
5256ab6918fSYinan Xu    def storeAddrMisaligned = 6
5266ab6918fSYinan Xu    def storeAccessFault    = 7
5276ab6918fSYinan Xu    def ecallU              = 8
5286ab6918fSYinan Xu    def ecallS              = 9
5296ab6918fSYinan Xu    def ecallM              = 11
5306ab6918fSYinan Xu    def instrPageFault      = 12
5316ab6918fSYinan Xu    def loadPageFault       = 13
5326ab6918fSYinan Xu    // def singleStep          = 14
5336ab6918fSYinan Xu    def storePageFault      = 15
5346ab6918fSYinan Xu    def priorities = Seq(
5356ab6918fSYinan Xu      breakPoint, // TODO: different BP has different priority
5366ab6918fSYinan Xu      instrPageFault,
5376ab6918fSYinan Xu      instrAccessFault,
5386ab6918fSYinan Xu      illegalInstr,
5396ab6918fSYinan Xu      instrAddrMisaligned,
5406ab6918fSYinan Xu      ecallM, ecallS, ecallU,
541d880177dSYinan Xu      storeAddrMisaligned,
542d880177dSYinan Xu      loadAddrMisaligned,
5436ab6918fSYinan Xu      storePageFault,
5446ab6918fSYinan Xu      loadPageFault,
5456ab6918fSYinan Xu      storeAccessFault,
546d880177dSYinan Xu      loadAccessFault
5476ab6918fSYinan Xu    )
5486ab6918fSYinan Xu    def all = priorities.distinct.sorted
5496ab6918fSYinan Xu    def frontendSet = Seq(
5506ab6918fSYinan Xu      instrAddrMisaligned,
5516ab6918fSYinan Xu      instrAccessFault,
5526ab6918fSYinan Xu      illegalInstr,
5536ab6918fSYinan Xu      instrPageFault
5546ab6918fSYinan Xu    )
5556ab6918fSYinan Xu    def partialSelect(vec: Vec[Bool], select: Seq[Int]): Vec[Bool] = {
5566ab6918fSYinan Xu      val new_vec = Wire(ExceptionVec())
5576ab6918fSYinan Xu      new_vec.foreach(_ := false.B)
5586ab6918fSYinan Xu      select.foreach(i => new_vec(i) := vec(i))
5596ab6918fSYinan Xu      new_vec
5606ab6918fSYinan Xu    }
5616ab6918fSYinan Xu    def selectFrontend(vec: Vec[Bool]): Vec[Bool] = partialSelect(vec, frontendSet)
5626ab6918fSYinan Xu    def selectAll(vec: Vec[Bool]): Vec[Bool] = partialSelect(vec, ExceptionNO.all)
5636ab6918fSYinan Xu    def selectByFu(vec:Vec[Bool], fuConfig: FuConfig): Vec[Bool] =
5646ab6918fSYinan Xu      partialSelect(vec, fuConfig.exceptionOut)
5656ab6918fSYinan Xu  }
5669a2e6b8aSLinJiawei}
567