xref: /XiangShan/src/main/scala/xiangshan/package.scala (revision d91483a658064c7276ee0181b0c527a3e2a7d2ee)
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
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 {
100da3bf434SMaxpicca-Li    val ExceptionVecSize = 16
101da3bf434SMaxpicca-Li    def apply() = Vec(ExceptionVecSize, Bool())
102baf8def6SYinan Xu  }
103a8e04b1dSYinan Xu
104c60c1ab4SWilliam Wang  object PMAMode {
1058d9a04fcSWilliam Wang    def R = "b1".U << 0 //readable
1068d9a04fcSWilliam Wang    def W = "b1".U << 1 //writeable
1078d9a04fcSWilliam Wang    def X = "b1".U << 2 //executable
1088d9a04fcSWilliam Wang    def I = "b1".U << 3 //cacheable: icache
1098d9a04fcSWilliam Wang    def D = "b1".U << 4 //cacheable: dcache
1108d9a04fcSWilliam Wang    def S = "b1".U << 5 //enable speculative access
111cff68e26SWilliam Wang    def A = "b1".U << 6 //enable atomic operation, A imply R & W
1128d9a04fcSWilliam Wang    def C = "b1".U << 7 //if it is cacheable is configable
113c60c1ab4SWilliam Wang    def Reserved = "b0".U
114c60c1ab4SWilliam Wang
115c60c1ab4SWilliam Wang    def apply() = UInt(7.W)
116c60c1ab4SWilliam Wang
117c60c1ab4SWilliam Wang    def read(mode: UInt) = mode(0)
118c60c1ab4SWilliam Wang    def write(mode: UInt) = mode(1)
119c60c1ab4SWilliam Wang    def execute(mode: UInt) = mode(2)
120c60c1ab4SWilliam Wang    def icache(mode: UInt) = mode(3)
121c60c1ab4SWilliam Wang    def dcache(mode: UInt) = mode(4)
122c60c1ab4SWilliam Wang    def speculate(mode: UInt) = mode(5)
123c60c1ab4SWilliam Wang    def atomic(mode: UInt) = mode(6)
124c60c1ab4SWilliam Wang    def configable_cache(mode: UInt) = mode(7)
125c60c1ab4SWilliam Wang
126c60c1ab4SWilliam Wang    def strToMode(s: String) = {
127423b9255SWilliam Wang      var result = 0.U(8.W)
128c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("R") >= 0) result = result + R
129c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("W") >= 0) result = result + W
130c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("X") >= 0) result = result + X
131c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("I") >= 0) result = result + I
132c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("D") >= 0) result = result + D
133c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("S") >= 0) result = result + S
134c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("A") >= 0) result = result + A
135c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("C") >= 0) result = result + C
136c60c1ab4SWilliam Wang      result
137c60c1ab4SWilliam Wang    }
138c60c1ab4SWilliam Wang  }
1392225d46eSJiawei Lin
1402225d46eSJiawei Lin
1412225d46eSJiawei Lin  object CSROpType {
1422225d46eSJiawei Lin    def jmp  = "b000".U
1432225d46eSJiawei Lin    def wrt  = "b001".U
1442225d46eSJiawei Lin    def set  = "b010".U
1452225d46eSJiawei Lin    def clr  = "b011".U
146b6900d94SYinan Xu    def wfi  = "b100".U
1472225d46eSJiawei Lin    def wrti = "b101".U
1482225d46eSJiawei Lin    def seti = "b110".U
1492225d46eSJiawei Lin    def clri = "b111".U
1505d669833SYinan Xu    def needAccess(op: UInt): Bool = op(1, 0) =/= 0.U
1512225d46eSJiawei Lin  }
1522225d46eSJiawei Lin
1532225d46eSJiawei Lin  // jump
1542225d46eSJiawei Lin  object JumpOpType {
1552225d46eSJiawei Lin    def jal  = "b00".U
1562225d46eSJiawei Lin    def jalr = "b01".U
1572225d46eSJiawei Lin    def auipc = "b10".U
1582225d46eSJiawei Lin//    def call = "b11_011".U
1592225d46eSJiawei Lin//    def ret  = "b11_100".U
1602225d46eSJiawei Lin    def jumpOpisJalr(op: UInt) = op(0)
1612225d46eSJiawei Lin    def jumpOpisAuipc(op: UInt) = op(1)
1622225d46eSJiawei Lin  }
1632225d46eSJiawei Lin
1642225d46eSJiawei Lin  object FenceOpType {
1652225d46eSJiawei Lin    def fence  = "b10000".U
1662225d46eSJiawei Lin    def sfence = "b10001".U
1672225d46eSJiawei Lin    def fencei = "b10010".U
168af2f7849Shappy-lx    def nofence= "b00000".U
1692225d46eSJiawei Lin  }
1702225d46eSJiawei Lin
1712225d46eSJiawei Lin  object ALUOpType {
172ee8ff153Szfw    // shift optype
173675acc68SYinan Xu    def slliuw     = "b000_0000".U // slliuw: ZEXT(src1[31:0]) << shamt
174675acc68SYinan Xu    def sll        = "b000_0001".U // sll:     src1 << src2
175ee8ff153Szfw
176675acc68SYinan Xu    def bclr       = "b000_0010".U // bclr:    src1 & ~(1 << src2[5:0])
177675acc68SYinan Xu    def bset       = "b000_0011".U // bset:    src1 | (1 << src2[5:0])
178675acc68SYinan Xu    def binv       = "b000_0100".U // binv:    src1 ^ ~(1 << src2[5:0])
179ee8ff153Szfw
180675acc68SYinan Xu    def srl        = "b000_0101".U // srl:     src1 >> src2
181675acc68SYinan Xu    def bext       = "b000_0110".U // bext:    (src1 >> src2)[0]
182675acc68SYinan Xu    def sra        = "b000_0111".U // sra:     src1 >> src2 (arithmetic)
183ee8ff153Szfw
1847b441e5eSYinan Xu    def rol        = "b000_1001".U // rol:     (src1 << src2) | (src1 >> (xlen - src2))
1857b441e5eSYinan Xu    def ror        = "b000_1011".U // ror:     (src1 >> src2) | (src1 << (xlen - src2))
186184a1958Szfw
187ee8ff153Szfw    // RV64 32bit optype
188675acc68SYinan Xu    def addw       = "b001_0000".U // addw:      SEXT((src1 + src2)[31:0])
189675acc68SYinan Xu    def oddaddw    = "b001_0001".U // oddaddw:   SEXT((src1[0] + src2)[31:0])
190675acc68SYinan Xu    def subw       = "b001_0010".U // subw:      SEXT((src1 - src2)[31:0])
191ee8ff153Szfw
192675acc68SYinan Xu    def addwbit    = "b001_0100".U // addwbit:   (src1 + src2)[0]
193675acc68SYinan Xu    def addwbyte   = "b001_0101".U // addwbyte:  (src1 + src2)[7:0]
194675acc68SYinan Xu    def addwzexth  = "b001_0110".U // addwzexth: ZEXT((src1  + src2)[15:0])
195675acc68SYinan Xu    def addwsexth  = "b001_0111".U // addwsexth: SEXT((src1  + src2)[15:0])
196ee8ff153Szfw
197675acc68SYinan Xu    def sllw       = "b001_1000".U // sllw:     SEXT((src1 << src2)[31:0])
198675acc68SYinan Xu    def srlw       = "b001_1001".U // srlw:     SEXT((src1[31:0] >> src2)[31:0])
199675acc68SYinan Xu    def sraw       = "b001_1010".U // sraw:     SEXT((src1[31:0] >> src2)[31:0])
200675acc68SYinan Xu    def rolw       = "b001_1100".U
201675acc68SYinan Xu    def rorw       = "b001_1101".U
202675acc68SYinan Xu
203675acc68SYinan Xu    // ADD-op
204675acc68SYinan Xu    def adduw      = "b010_0000".U // adduw:  src1[31:0]  + src2
205675acc68SYinan Xu    def add        = "b010_0001".U // add:     src1        + src2
206675acc68SYinan Xu    def oddadd     = "b010_0010".U // oddadd:  src1[0]     + src2
207675acc68SYinan Xu
208675acc68SYinan Xu    def sr29add    = "b010_0100".U // sr29add: src1[63:29] + src2
209675acc68SYinan Xu    def sr30add    = "b010_0101".U // sr30add: src1[63:30] + src2
210675acc68SYinan Xu    def sr31add    = "b010_0110".U // sr31add: src1[63:31] + src2
211675acc68SYinan Xu    def sr32add    = "b010_0111".U // sr32add: src1[63:32] + src2
212675acc68SYinan Xu
213675acc68SYinan Xu    def sh1adduw   = "b010_1000".U // sh1adduw: {src1[31:0], 1'b0} + src2
214675acc68SYinan Xu    def sh1add     = "b010_1001".U // sh1add: {src1[62:0], 1'b0} + src2
215675acc68SYinan Xu    def sh2adduw   = "b010_1010".U // sh2add_uw: {src1[31:0], 2'b0} + src2
216675acc68SYinan Xu    def sh2add     = "b010_1011".U // sh2add: {src1[61:0], 2'b0} + src2
217675acc68SYinan Xu    def sh3adduw   = "b010_1100".U // sh3add_uw: {src1[31:0], 3'b0} + src2
218675acc68SYinan Xu    def sh3add     = "b010_1101".U // sh3add: {src1[60:0], 3'b0} + src2
219675acc68SYinan Xu    def sh4add     = "b010_1111".U // sh4add: {src1[59:0], 4'b0} + src2
220675acc68SYinan Xu
221675acc68SYinan Xu    // SUB-op: src1 - src2
222675acc68SYinan Xu    def sub        = "b011_0000".U
223675acc68SYinan Xu    def sltu       = "b011_0001".U
224675acc68SYinan Xu    def slt        = "b011_0010".U
225675acc68SYinan Xu    def maxu       = "b011_0100".U
226675acc68SYinan Xu    def minu       = "b011_0101".U
227675acc68SYinan Xu    def max        = "b011_0110".U
228675acc68SYinan Xu    def min        = "b011_0111".U
229675acc68SYinan Xu
230675acc68SYinan Xu    // branch
231675acc68SYinan Xu    def beq        = "b111_0000".U
232675acc68SYinan Xu    def bne        = "b111_0010".U
233675acc68SYinan Xu    def blt        = "b111_1000".U
234675acc68SYinan Xu    def bge        = "b111_1010".U
235675acc68SYinan Xu    def bltu       = "b111_1100".U
236675acc68SYinan Xu    def bgeu       = "b111_1110".U
237675acc68SYinan Xu
238675acc68SYinan Xu    // misc optype
239675acc68SYinan Xu    def and        = "b100_0000".U
240675acc68SYinan Xu    def andn       = "b100_0001".U
241675acc68SYinan Xu    def or         = "b100_0010".U
242675acc68SYinan Xu    def orn        = "b100_0011".U
243675acc68SYinan Xu    def xor        = "b100_0100".U
244675acc68SYinan Xu    def xnor       = "b100_0101".U
245675acc68SYinan Xu    def orcb       = "b100_0110".U
246675acc68SYinan Xu
247675acc68SYinan Xu    def sextb      = "b100_1000".U
248675acc68SYinan Xu    def packh      = "b100_1001".U
249675acc68SYinan Xu    def sexth      = "b100_1010".U
250675acc68SYinan Xu    def packw      = "b100_1011".U
251675acc68SYinan Xu
252675acc68SYinan Xu    def revb       = "b101_0000".U
253675acc68SYinan Xu    def rev8       = "b101_0001".U
254675acc68SYinan Xu    def pack       = "b101_0010".U
255675acc68SYinan Xu    def orh48      = "b101_0011".U
256675acc68SYinan Xu
257675acc68SYinan Xu    def szewl1     = "b101_1000".U
258675acc68SYinan Xu    def szewl2     = "b101_1001".U
259675acc68SYinan Xu    def szewl3     = "b101_1010".U
260675acc68SYinan Xu    def byte2      = "b101_1011".U
261675acc68SYinan Xu
262675acc68SYinan Xu    def andlsb     = "b110_0000".U
263675acc68SYinan Xu    def andzexth   = "b110_0001".U
264675acc68SYinan Xu    def orlsb      = "b110_0010".U
265675acc68SYinan Xu    def orzexth    = "b110_0011".U
266675acc68SYinan Xu    def xorlsb     = "b110_0100".U
267675acc68SYinan Xu    def xorzexth   = "b110_0101".U
268675acc68SYinan Xu    def orcblsb    = "b110_0110".U
269675acc68SYinan Xu    def orcbzexth  = "b110_0111".U
270675acc68SYinan Xu
271675acc68SYinan Xu    def isAddw(func: UInt) = func(6, 4) === "b001".U && !func(3) && !func(1)
272675acc68SYinan Xu    def isSimpleLogic(func: UInt) = func(6, 4) === "b100".U && !func(0)
273675acc68SYinan Xu    def logicToLsb(func: UInt) = Cat("b110".U(3.W), func(3, 1), 0.U(1.W))
274675acc68SYinan Xu    def logicToZexth(func: UInt) = Cat("b110".U(3.W), func(3, 1), 1.U(1.W))
275675acc68SYinan Xu
27657a10886SXuan Hu    def apply() = UInt(FuOpTypeWidth.W)
2772225d46eSJiawei Lin  }
2782225d46eSJiawei Lin
279*d91483a6Sfdy  object VSETOpType {
280*d91483a6Sfdy    // o: set vl to old vl
281*d91483a6Sfdy    // m: set vl to vlmax
282*d91483a6Sfdy    def uvset_xi = "b0000_0000".U
283*d91483a6Sfdy    def uvset_xi_o = "b0000_1000".U
284*d91483a6Sfdy    def uvset_xi_m = "b0001_0000".U
285*d91483a6Sfdy    def uvsetvl_xi = "b0000_0100".U
286*d91483a6Sfdy    def uvsetvl_xi_o = "b0000_1100".U
287*d91483a6Sfdy    def uvset_xx = "b0000_0001".U
288*d91483a6Sfdy    def uvset_xx_o = "b0000_1001".U
289*d91483a6Sfdy    def uvset_xx_m = "b0001_0001".U
290*d91483a6Sfdy    def uvsetvl_xx = "b0000_0101".U
291*d91483a6Sfdy    def uvsetvl_xx_o = "b0000_1101".U
292*d91483a6Sfdy    def uvset_ii = "b0000_0010".U
293*d91483a6Sfdy    def uvsetvl_ii = "b0000_0110".U
294*d91483a6Sfdy
295*d91483a6Sfdy    def isVsetvl(func: UInt) = func(0)
296*d91483a6Sfdy    def isVsetvli(func: UInt) = !func(1, 0).orR
297*d91483a6Sfdy    def isVsetivli(func: UInt) = func(1)
298*d91483a6Sfdy    def oldvlFlag(func: UInt) = func(3)
299*d91483a6Sfdy    def vlmaxFlag(func: UInt) = func(4)
300*d91483a6Sfdy    def convert2uvsetvl(func: UInt) = Cat(func(7, 3), "b1".U, func(1, 0))
301*d91483a6Sfdy    def convert2oldvl(func: UInt) = Cat(func(7, 4), "b1".U, func(2, 0))
302*d91483a6Sfdy    def convert2vlmax(func: UInt) = Cat(func(7, 5), "b1".U, func(3, 0))
303*d91483a6Sfdy  }
304*d91483a6Sfdy
3053b739f49SXuan Hu  object BRUOpType {
3063b739f49SXuan Hu    // branch
3073b739f49SXuan Hu    def beq        = "b000_000".U
3083b739f49SXuan Hu    def bne        = "b000_001".U
3093b739f49SXuan Hu    def blt        = "b000_100".U
3103b739f49SXuan Hu    def bge        = "b000_101".U
3113b739f49SXuan Hu    def bltu       = "b001_000".U
3123b739f49SXuan Hu    def bgeu       = "b001_001".U
3133b739f49SXuan Hu
3143b739f49SXuan Hu    def getBranchType(func: UInt) = func(3, 1)
3153b739f49SXuan Hu    def isBranchInvert(func: UInt) = func(0)
3163b739f49SXuan Hu  }
3173b739f49SXuan Hu
3183b739f49SXuan Hu  object MULOpType {
3193b739f49SXuan Hu    // mul
3203b739f49SXuan Hu    // bit encoding: | type (2bit) | isWord(1bit) | opcode(2bit) |
3213b739f49SXuan Hu    def mul    = "b00000".U
3223b739f49SXuan Hu    def mulh   = "b00001".U
3233b739f49SXuan Hu    def mulhsu = "b00010".U
3243b739f49SXuan Hu    def mulhu  = "b00011".U
3253b739f49SXuan Hu    def mulw   = "b00100".U
3263b739f49SXuan Hu
3273b739f49SXuan Hu    def mulw7  = "b01100".U
3283b739f49SXuan Hu    def isSign(op: UInt) = !op(1)
3293b739f49SXuan Hu    def isW(op: UInt) = op(2)
3303b739f49SXuan Hu    def isH(op: UInt) = op(1, 0) =/= 0.U
3313b739f49SXuan Hu    def getOp(op: UInt) = Cat(op(3), op(1, 0))
3323b739f49SXuan Hu  }
3333b739f49SXuan Hu
3343b739f49SXuan Hu  object DIVOpType {
3353b739f49SXuan Hu    // div
3363b739f49SXuan Hu    // bit encoding: | type (2bit) | isWord(1bit) | isSign(1bit) | opcode(1bit) |
3373b739f49SXuan Hu    def div    = "b10000".U
3383b739f49SXuan Hu    def divu   = "b10010".U
3393b739f49SXuan Hu    def rem    = "b10001".U
3403b739f49SXuan Hu    def remu   = "b10011".U
3413b739f49SXuan Hu
3423b739f49SXuan Hu    def divw   = "b10100".U
3433b739f49SXuan Hu    def divuw  = "b10110".U
3443b739f49SXuan Hu    def remw   = "b10101".U
3453b739f49SXuan Hu    def remuw  = "b10111".U
3463b739f49SXuan Hu
3473b739f49SXuan Hu    def isSign(op: UInt) = !op(1)
3483b739f49SXuan Hu    def isW(op: UInt) = op(2)
3493b739f49SXuan Hu    def isH(op: UInt) = op(0)
3503b739f49SXuan Hu  }
3513b739f49SXuan Hu
3522225d46eSJiawei Lin  object MDUOpType {
3532225d46eSJiawei Lin    // mul
3542225d46eSJiawei Lin    // bit encoding: | type (2bit) | isWord(1bit) | opcode(2bit) |
3552225d46eSJiawei Lin    def mul    = "b00000".U
3562225d46eSJiawei Lin    def mulh   = "b00001".U
3572225d46eSJiawei Lin    def mulhsu = "b00010".U
3582225d46eSJiawei Lin    def mulhu  = "b00011".U
3592225d46eSJiawei Lin    def mulw   = "b00100".U
3602225d46eSJiawei Lin
36188825c5cSYinan Xu    def mulw7  = "b01100".U
36288825c5cSYinan Xu
3632225d46eSJiawei Lin    // div
3642225d46eSJiawei Lin    // bit encoding: | type (2bit) | isWord(1bit) | isSign(1bit) | opcode(1bit) |
36588825c5cSYinan Xu    def div    = "b10000".U
36688825c5cSYinan Xu    def divu   = "b10010".U
36788825c5cSYinan Xu    def rem    = "b10001".U
36888825c5cSYinan Xu    def remu   = "b10011".U
3692225d46eSJiawei Lin
37088825c5cSYinan Xu    def divw   = "b10100".U
37188825c5cSYinan Xu    def divuw  = "b10110".U
37288825c5cSYinan Xu    def remw   = "b10101".U
37388825c5cSYinan Xu    def remuw  = "b10111".U
3742225d46eSJiawei Lin
37588825c5cSYinan Xu    def isMul(op: UInt) = !op(4)
37688825c5cSYinan Xu    def isDiv(op: UInt) = op(4)
3772225d46eSJiawei Lin
3782225d46eSJiawei Lin    def isDivSign(op: UInt) = isDiv(op) && !op(1)
3792225d46eSJiawei Lin    def isW(op: UInt) = op(2)
3802225d46eSJiawei Lin    def isH(op: UInt) = (isDiv(op) && op(0)) || (isMul(op) && op(1, 0) =/= 0.U)
3812225d46eSJiawei Lin    def getMulOp(op: UInt) = op(1, 0)
3822225d46eSJiawei Lin  }
3832225d46eSJiawei Lin
3842225d46eSJiawei Lin  object LSUOpType {
385d200f594SWilliam Wang    // load pipeline
3862225d46eSJiawei Lin
387d200f594SWilliam Wang    // normal load
388d200f594SWilliam Wang    // Note: bit(1, 0) are size, DO NOT CHANGE
389d200f594SWilliam Wang    // bit encoding: | load 0 | is unsigned(1bit) | size(2bit) |
390d200f594SWilliam Wang    def lb       = "b0000".U
391d200f594SWilliam Wang    def lh       = "b0001".U
392d200f594SWilliam Wang    def lw       = "b0010".U
393d200f594SWilliam Wang    def ld       = "b0011".U
394d200f594SWilliam Wang    def lbu      = "b0100".U
395d200f594SWilliam Wang    def lhu      = "b0101".U
396d200f594SWilliam Wang    def lwu      = "b0110".U
397ca18a0b4SWilliam Wang
398d200f594SWilliam Wang    // Zicbop software prefetch
399d200f594SWilliam Wang    // bit encoding: | prefetch 1 | 0 | prefetch type (2bit) |
400d200f594SWilliam Wang    def prefetch_i = "b1000".U // TODO
401d200f594SWilliam Wang    def prefetch_r = "b1001".U
402d200f594SWilliam Wang    def prefetch_w = "b1010".U
403ca18a0b4SWilliam Wang
404d200f594SWilliam Wang    def isPrefetch(op: UInt): Bool = op(3)
405d200f594SWilliam Wang
406d200f594SWilliam Wang    // store pipeline
407d200f594SWilliam Wang    // normal store
408d200f594SWilliam Wang    // bit encoding: | store 00 | size(2bit) |
409d200f594SWilliam Wang    def sb       = "b0000".U
410d200f594SWilliam Wang    def sh       = "b0001".U
411d200f594SWilliam Wang    def sw       = "b0010".U
412d200f594SWilliam Wang    def sd       = "b0011".U
413d200f594SWilliam Wang
414d200f594SWilliam Wang    // l1 cache op
415d200f594SWilliam Wang    // bit encoding: | cbo_zero 01 | size(2bit) 11 |
416d200f594SWilliam Wang    def cbo_zero  = "b0111".U
417d200f594SWilliam Wang
418d200f594SWilliam Wang    // llc op
419d200f594SWilliam Wang    // bit encoding: | prefetch 11 | suboptype(2bit) |
420d200f594SWilliam Wang    def cbo_clean = "b1100".U
421d200f594SWilliam Wang    def cbo_flush = "b1101".U
422d200f594SWilliam Wang    def cbo_inval = "b1110".U
423d200f594SWilliam Wang
424d200f594SWilliam Wang    def isCbo(op: UInt): Bool = op(3, 2) === "b11".U
4252225d46eSJiawei Lin
4262225d46eSJiawei Lin    // atomics
4272225d46eSJiawei Lin    // bit(1, 0) are size
4282225d46eSJiawei Lin    // since atomics use a different fu type
4292225d46eSJiawei Lin    // so we can safely reuse other load/store's encodings
430d200f594SWilliam Wang    // bit encoding: | optype(4bit) | size (2bit) |
4312225d46eSJiawei Lin    def lr_w      = "b000010".U
4322225d46eSJiawei Lin    def sc_w      = "b000110".U
4332225d46eSJiawei Lin    def amoswap_w = "b001010".U
4342225d46eSJiawei Lin    def amoadd_w  = "b001110".U
4352225d46eSJiawei Lin    def amoxor_w  = "b010010".U
4362225d46eSJiawei Lin    def amoand_w  = "b010110".U
4372225d46eSJiawei Lin    def amoor_w   = "b011010".U
4382225d46eSJiawei Lin    def amomin_w  = "b011110".U
4392225d46eSJiawei Lin    def amomax_w  = "b100010".U
4402225d46eSJiawei Lin    def amominu_w = "b100110".U
4412225d46eSJiawei Lin    def amomaxu_w = "b101010".U
4422225d46eSJiawei Lin
4432225d46eSJiawei Lin    def lr_d      = "b000011".U
4442225d46eSJiawei Lin    def sc_d      = "b000111".U
4452225d46eSJiawei Lin    def amoswap_d = "b001011".U
4462225d46eSJiawei Lin    def amoadd_d  = "b001111".U
4472225d46eSJiawei Lin    def amoxor_d  = "b010011".U
4482225d46eSJiawei Lin    def amoand_d  = "b010111".U
4492225d46eSJiawei Lin    def amoor_d   = "b011011".U
4502225d46eSJiawei Lin    def amomin_d  = "b011111".U
4512225d46eSJiawei Lin    def amomax_d  = "b100011".U
4522225d46eSJiawei Lin    def amominu_d = "b100111".U
4532225d46eSJiawei Lin    def amomaxu_d = "b101011".U
454b6982e83SLemover
455b6982e83SLemover    def size(op: UInt) = op(1,0)
4562225d46eSJiawei Lin  }
4572225d46eSJiawei Lin
4583feeca58Szfw  object BKUOpType {
459ee8ff153Szfw
4603feeca58Szfw    def clmul       = "b000000".U
4613feeca58Szfw    def clmulh      = "b000001".U
4623feeca58Szfw    def clmulr      = "b000010".U
4633feeca58Szfw    def xpermn      = "b000100".U
4643feeca58Szfw    def xpermb      = "b000101".U
465ee8ff153Szfw
4663feeca58Szfw    def clz         = "b001000".U
4673feeca58Szfw    def clzw        = "b001001".U
4683feeca58Szfw    def ctz         = "b001010".U
4693feeca58Szfw    def ctzw        = "b001011".U
4703feeca58Szfw    def cpop        = "b001100".U
4713feeca58Szfw    def cpopw       = "b001101".U
47207596dc6Szfw
4733feeca58Szfw    // 01xxxx is reserve
4743feeca58Szfw    def aes64es     = "b100000".U
4753feeca58Szfw    def aes64esm    = "b100001".U
4763feeca58Szfw    def aes64ds     = "b100010".U
4773feeca58Szfw    def aes64dsm    = "b100011".U
4783feeca58Szfw    def aes64im     = "b100100".U
4793feeca58Szfw    def aes64ks1i   = "b100101".U
4803feeca58Szfw    def aes64ks2    = "b100110".U
4813feeca58Szfw
4823feeca58Szfw    // merge to two instruction sm4ks & sm4ed
48319bcce38SFawang Zhang    def sm4ed0      = "b101000".U
48419bcce38SFawang Zhang    def sm4ed1      = "b101001".U
48519bcce38SFawang Zhang    def sm4ed2      = "b101010".U
48619bcce38SFawang Zhang    def sm4ed3      = "b101011".U
48719bcce38SFawang Zhang    def sm4ks0      = "b101100".U
48819bcce38SFawang Zhang    def sm4ks1      = "b101101".U
48919bcce38SFawang Zhang    def sm4ks2      = "b101110".U
49019bcce38SFawang Zhang    def sm4ks3      = "b101111".U
4913feeca58Szfw
4923feeca58Szfw    def sha256sum0  = "b110000".U
4933feeca58Szfw    def sha256sum1  = "b110001".U
4943feeca58Szfw    def sha256sig0  = "b110010".U
4953feeca58Szfw    def sha256sig1  = "b110011".U
4963feeca58Szfw    def sha512sum0  = "b110100".U
4973feeca58Szfw    def sha512sum1  = "b110101".U
4983feeca58Szfw    def sha512sig0  = "b110110".U
4993feeca58Szfw    def sha512sig1  = "b110111".U
5003feeca58Szfw
5013feeca58Szfw    def sm3p0       = "b111000".U
5023feeca58Szfw    def sm3p1       = "b111001".U
503ee8ff153Szfw  }
504ee8ff153Szfw
5052225d46eSJiawei Lin  object BTBtype {
5062225d46eSJiawei Lin    def B = "b00".U  // branch
5072225d46eSJiawei Lin    def J = "b01".U  // jump
5082225d46eSJiawei Lin    def I = "b10".U  // indirect
5092225d46eSJiawei Lin    def R = "b11".U  // return
5102225d46eSJiawei Lin
5112225d46eSJiawei Lin    def apply() = UInt(2.W)
5122225d46eSJiawei Lin  }
5132225d46eSJiawei Lin
5142225d46eSJiawei Lin  object SelImm {
515ee8ff153Szfw    def IMM_X  = "b0111".U
516*d91483a6Sfdy    def IMM_S  = "b1110".U
517ee8ff153Szfw    def IMM_SB = "b0001".U
518ee8ff153Szfw    def IMM_U  = "b0010".U
519ee8ff153Szfw    def IMM_UJ = "b0011".U
520ee8ff153Szfw    def IMM_I  = "b0100".U
521ee8ff153Szfw    def IMM_Z  = "b0101".U
522ee8ff153Szfw    def INVALID_INSTR = "b0110".U
523ee8ff153Szfw    def IMM_B6 = "b1000".U
5242225d46eSJiawei Lin
52558c35d23Shuxuan0307    def IMM_OPIVIS = "b1001".U
52658c35d23Shuxuan0307    def IMM_OPIVIU = "b1010".U
527912e2179SXuan Hu    def IMM_VSETVLI   = "b1100".U
528912e2179SXuan Hu    def IMM_VSETIVLI  = "b1101".U
52958c35d23Shuxuan0307
53057a10886SXuan Hu    def X      = BitPat("b0000")
5316e7c9679Shuxuan0307
532ee8ff153Szfw    def apply() = UInt(4.W)
5332225d46eSJiawei Lin  }
5342225d46eSJiawei Lin
535*d91483a6Sfdy  object UopDivType {
536*d91483a6Sfdy    def SCA_SIM = "b000000".U //
537*d91483a6Sfdy    def DIR     = "b010001".U // dirty: vset
538*d91483a6Sfdy    def VEC_VVV = "b010010".U // VEC_VVV
539*d91483a6Sfdy    def VEC_VXV = "b010011".U // VEC_VXV
540*d91483a6Sfdy    def VEC_0XV = "b010100".U // VEC_0XV
541*d91483a6Sfdy    def VEC_VVW = "b010101".U // VEC_VVW
542*d91483a6Sfdy    def VEC_WVW = "b010110".U // VEC_WVW
543*d91483a6Sfdy    def VEC_VXW = "b010111".U // VEC_VXW
544*d91483a6Sfdy    def VEC_WXW = "b011000".U // VEC_WXW
545*d91483a6Sfdy    def VEC_WVV = "b011001".U // VEC_WVV
546*d91483a6Sfdy    def VEC_WXV = "b011010".U // VEC_WXV
547*d91483a6Sfdy    def VEC_EXT2 = "b011011".U // VF2 0 -> V
548*d91483a6Sfdy    def VEC_EXT4 = "b011100".U // VF4 0 -> V
549*d91483a6Sfdy    def VEC_EXT8 = "b011101".U // VF8 0 -> V
550*d91483a6Sfdy    def VEC_VVM = "b011110".U // VEC_VVM
551*d91483a6Sfdy    def VEC_VXM = "b011111".U // VEC_VXM
552*d91483a6Sfdy    def VEC_SLIDE1UP = "b100000".U // vslide1up.vx
553*d91483a6Sfdy    def VEC_FSLIDE1UP = "b100001".U // vfslide1up.vf
554*d91483a6Sfdy    def VEC_SLIDE1DOWN = "b100010".U // vslide1down.vx
555*d91483a6Sfdy    def VEC_FSLIDE1DOWN = "b100011".U // vfslide1down.vf
556*d91483a6Sfdy    def VEC_VRED = "b100100".U // VEC_VRED
557*d91483a6Sfdy    def VEC_SLIDEUP = "b100101".U // VEC_SLIDEUP
558*d91483a6Sfdy    def VEC_ISLIDEUP = "b100110".U // VEC_ISLIDEUP
559*d91483a6Sfdy    def VEC_SLIDEDOWN = "b100111".U // VEC_SLIDEDOWN
560*d91483a6Sfdy    def VEC_ISLIDEDOWN = "b101000".U // VEC_ISLIDEDOWN
561*d91483a6Sfdy    def VEC_M0X = "b101001".U // VEC_M0X  0MV
562*d91483a6Sfdy    def VEC_MVV = "b101010".U // VEC_MVV  VMV
563*d91483a6Sfdy    def VEC_M0X_VFIRST = "b101011".U //
564*d91483a6Sfdy    def VEC_M0M = "b000000".U // VEC_M0M
565*d91483a6Sfdy    def VEC_MMM = "b000000".U // VEC_MMM
566*d91483a6Sfdy    def dummy = "b111111".U
567*d91483a6Sfdy
568*d91483a6Sfdy    def X = BitPat("b000000")
569*d91483a6Sfdy
570*d91483a6Sfdy    def apply() = UInt(6.W)
571*d91483a6Sfdy    def needSplit(UopDivType: UInt) = UopDivType(4) || UopDivType(5)
572*d91483a6Sfdy  }
573*d91483a6Sfdy
5746ab6918fSYinan Xu  object ExceptionNO {
5756ab6918fSYinan Xu    def instrAddrMisaligned = 0
5766ab6918fSYinan Xu    def instrAccessFault    = 1
5776ab6918fSYinan Xu    def illegalInstr        = 2
5786ab6918fSYinan Xu    def breakPoint          = 3
5796ab6918fSYinan Xu    def loadAddrMisaligned  = 4
5806ab6918fSYinan Xu    def loadAccessFault     = 5
5816ab6918fSYinan Xu    def storeAddrMisaligned = 6
5826ab6918fSYinan Xu    def storeAccessFault    = 7
5836ab6918fSYinan Xu    def ecallU              = 8
5846ab6918fSYinan Xu    def ecallS              = 9
5856ab6918fSYinan Xu    def ecallM              = 11
5866ab6918fSYinan Xu    def instrPageFault      = 12
5876ab6918fSYinan Xu    def loadPageFault       = 13
5886ab6918fSYinan Xu    // def singleStep          = 14
5896ab6918fSYinan Xu    def storePageFault      = 15
5906ab6918fSYinan Xu    def priorities = Seq(
5916ab6918fSYinan Xu      breakPoint, // TODO: different BP has different priority
5926ab6918fSYinan Xu      instrPageFault,
5936ab6918fSYinan Xu      instrAccessFault,
5946ab6918fSYinan Xu      illegalInstr,
5956ab6918fSYinan Xu      instrAddrMisaligned,
5966ab6918fSYinan Xu      ecallM, ecallS, ecallU,
597d880177dSYinan Xu      storeAddrMisaligned,
598d880177dSYinan Xu      loadAddrMisaligned,
5996ab6918fSYinan Xu      storePageFault,
6006ab6918fSYinan Xu      loadPageFault,
6016ab6918fSYinan Xu      storeAccessFault,
602d880177dSYinan Xu      loadAccessFault
6036ab6918fSYinan Xu    )
6046ab6918fSYinan Xu    def all = priorities.distinct.sorted
6056ab6918fSYinan Xu    def frontendSet = Seq(
6066ab6918fSYinan Xu      instrAddrMisaligned,
6076ab6918fSYinan Xu      instrAccessFault,
6086ab6918fSYinan Xu      illegalInstr,
6096ab6918fSYinan Xu      instrPageFault
6106ab6918fSYinan Xu    )
6116ab6918fSYinan Xu    def partialSelect(vec: Vec[Bool], select: Seq[Int]): Vec[Bool] = {
6126ab6918fSYinan Xu      val new_vec = Wire(ExceptionVec())
6136ab6918fSYinan Xu      new_vec.foreach(_ := false.B)
6146ab6918fSYinan Xu      select.foreach(i => new_vec(i) := vec(i))
6156ab6918fSYinan Xu      new_vec
6166ab6918fSYinan Xu    }
6176ab6918fSYinan Xu    def selectFrontend(vec: Vec[Bool]): Vec[Bool] = partialSelect(vec, frontendSet)
6186ab6918fSYinan Xu    def selectAll(vec: Vec[Bool]): Vec[Bool] = partialSelect(vec, ExceptionNO.all)
6196ab6918fSYinan Xu    def selectByFu(vec:Vec[Bool], fuConfig: FuConfig): Vec[Bool] =
6206ab6918fSYinan Xu      partialSelect(vec, fuConfig.exceptionOut)
6216ab6918fSYinan Xu  }
6229a2e6b8aSLinJiawei}
623