xref: /XiangShan/src/main/scala/xiangshan/package.scala (revision 3b739f49c5a26805be859c7231717ecc38aade30)
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._
208f3b164bSXuan Huimport xiangshan.backend.exu._
212225d46eSJiawei Linimport xiangshan.backend.fu._
222225d46eSJiawei Linimport xiangshan.backend.fu.fpu._
236827759bSZhangZifeiimport xiangshan.backend.fu.vector._
248f3b164bSXuan Huimport xiangshan.backend.issue._
25*3b739f49SXuan Huimport xiangshan.v2backend.FuConfig
262225d46eSJiawei Lin
279a2e6b8aSLinJiaweipackage object xiangshan {
289ee9f926SYikeZhou  object SrcType {
291285b047SXuan Hu    def imm = "b000".U
301285b047SXuan Hu    def pc  = "b000".U
311285b047SXuan Hu    def xp  = "b001".U
321285b047SXuan Hu    def fp  = "b010".U
331285b047SXuan Hu    def vp  = "b100".U
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
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
617f2b7720SXuan Hu  // Todo: Use OH instead
62*3b739f49SXuan Hu//  object FuType {
63*3b739f49SXuan Hu//    def jmp   = (BigInt(1) << 0).U
64*3b739f49SXuan Hu//    def brh   = (BigInt(1) << 1).U
65*3b739f49SXuan Hu//    def i2f   = (BigInt(1) << 2).U
66*3b739f49SXuan Hu//    def csr   = (BigInt(1) << 3).U
67*3b739f49SXuan Hu//    def alu   = (BigInt(1) << 4).U
68*3b739f49SXuan Hu//    def mul   = (BigInt(1) << 5).U
69*3b739f49SXuan Hu//    def div   = (BigInt(1) << 6).U
70*3b739f49SXuan Hu//    def fence = (BigInt(1) << 7).U
71*3b739f49SXuan Hu//    def bku   = (BigInt(1) << 8).U
72*3b739f49SXuan Hu//    def vset  = (BigInt(1) << 9).U
73*3b739f49SXuan Hu//
74*3b739f49SXuan Hu//    def fmac     = (BigInt(1) << 10).U
75*3b739f49SXuan Hu//    def fmisc    = (BigInt(1) << 11).U
76*3b739f49SXuan Hu//    def fDivSqrt = (BigInt(1) << 12).U
77*3b739f49SXuan Hu//
78*3b739f49SXuan Hu//    def ldu      = (BigInt(1) << 13).U
79*3b739f49SXuan Hu//    def stu      = (BigInt(1) << 14).U
80*3b739f49SXuan Hu//    def mou      = (BigInt(1) << 15).U // for amo, lr, sc, fence
81*3b739f49SXuan Hu//    def vipu     = (BigInt(1) << 16).U
82*3b739f49SXuan Hu//    def vfpu     = (BigInt(1) << 17).U
83*3b739f49SXuan Hu//    def vldu     = (BigInt(1) << 18).U
84*3b739f49SXuan Hu//    def vstu     = (BigInt(1) << 19).U
85*3b739f49SXuan Hu//    def X        = BitPat.dontCare(num)
86*3b739f49SXuan Hu//
87*3b739f49SXuan Hu//    def num = 20
88*3b739f49SXuan Hu//
89*3b739f49SXuan Hu//    def apply() = UInt(log2Up(num).W)
90*3b739f49SXuan Hu//
91*3b739f49SXuan Hu//    def isIntExu(fuType: UInt) = !fuType(3)
92*3b739f49SXuan Hu//    def isJumpExu(fuType: UInt) = fuType === jmp
93*3b739f49SXuan Hu//    def isFpExu(fuType: UInt) = fuType(3, 2) === "b10".U
94*3b739f49SXuan Hu//    def isMemExu(fuType: UInt) = fuType(3, 2) === "b11".U
95*3b739f49SXuan Hu//    def isLoadStore(fuType: UInt) = isMemExu(fuType) && !fuType(1)
96*3b739f49SXuan Hu//    def isStoreExu(fuType: UInt) = isMemExu(fuType) && fuType(0)
97*3b739f49SXuan Hu//    def isAMO(fuType: UInt) = fuType(1)
98*3b739f49SXuan Hu//    def isFence(fuType: UInt) = fuType === fence
99*3b739f49SXuan Hu//    def isSvinvalBegin(fuType: UInt, func: UInt, flush: Bool) = isFence(fuType) && func === FenceOpType.nofence && !flush
100*3b739f49SXuan Hu//    def isSvinval(fuType: UInt, func: UInt, flush: Bool) = isFence(fuType) && func === FenceOpType.sfence && !flush
101*3b739f49SXuan Hu//    def isSvinvalEnd(fuType: UInt, func: UInt, flush: Bool) = isFence(fuType) && func === FenceOpType.nofence && flush
102*3b739f49SXuan Hu//    def isVpu(fuType: UInt) = fuType(4)
103*3b739f49SXuan Hu//
104*3b739f49SXuan Hu//    def jmpCanAccept(fuType: UInt) = !fuType(2)
105*3b739f49SXuan Hu//    def mduCanAccept(fuType: UInt) = fuType(2) && !fuType(1) || fuType(2) && fuType(1) && fuType(0)
106*3b739f49SXuan Hu//    def aluCanAccept(fuType: UInt) = fuType(2) && fuType(1) && !fuType(0)
107*3b739f49SXuan Hu//
108*3b739f49SXuan Hu//    def fmacCanAccept(fuType: UInt) = !fuType(1)
109*3b739f49SXuan Hu//    def fmiscCanAccept(fuType: UInt) = fuType(1)
110*3b739f49SXuan Hu//
111*3b739f49SXuan Hu//    def loadCanAccept(fuType: UInt) = !fuType(0)
112*3b739f49SXuan Hu//    def storeCanAccept(fuType: UInt) = fuType(0)
113*3b739f49SXuan Hu//
114*3b739f49SXuan Hu//    def storeIsAMO(fuType: UInt) = fuType(1)
115*3b739f49SXuan Hu//
116*3b739f49SXuan Hu//    val functionNameMap = Map(
117*3b739f49SXuan Hu//      jmp.litValue() -> "jmp",
118*3b739f49SXuan Hu//      i2f.litValue() -> "int_to_float",
119*3b739f49SXuan Hu//      csr.litValue() -> "csr",
120*3b739f49SXuan Hu//      alu.litValue() -> "alu",
121*3b739f49SXuan Hu//      mul.litValue() -> "mul",
122*3b739f49SXuan Hu//      div.litValue() -> "div",
123*3b739f49SXuan Hu//      fence.litValue() -> "fence",
124*3b739f49SXuan Hu//      bku.litValue() -> "bku",
125*3b739f49SXuan Hu//      fmac.litValue() -> "fmac",
126*3b739f49SXuan Hu//      fmisc.litValue() -> "fmisc",
127*3b739f49SXuan Hu//      fDivSqrt.litValue() -> "fdiv_fsqrt",
128*3b739f49SXuan Hu//      ldu.litValue() -> "load",
129*3b739f49SXuan Hu//      stu.litValue() -> "store",
130*3b739f49SXuan Hu//      mou.litValue() -> "mou"
131*3b739f49SXuan Hu//    )
132*3b739f49SXuan Hu//  }
1339a2e6b8aSLinJiawei
13457a10886SXuan Hu  def FuOpTypeWidth = 8
1352225d46eSJiawei Lin  object FuOpType {
13657a10886SXuan Hu    def apply() = UInt(FuOpTypeWidth.W)
13757a10886SXuan Hu    def X = BitPat("b00000000")
138ebd97ecbSzhanglinjuan  }
139518d8658SYinan Xu
1403a2e64c4SZhangZifei  // move VipuType and VfpuType into YunSuan/package.scala
1413a2e64c4SZhangZifei  // object VipuType {
1423a2e64c4SZhangZifei  //   def dummy = 0.U(7.W)
1433a2e64c4SZhangZifei  // }
1447f2b7720SXuan Hu
1453a2e64c4SZhangZifei  // object VfpuType {
1463a2e64c4SZhangZifei  //   def dummy = 0.U(7.W)
1473a2e64c4SZhangZifei  // }
1487f2b7720SXuan Hu
1497f2b7720SXuan Hu  object VlduType {
15057a10886SXuan Hu    def dummy = 0.U
1517f2b7720SXuan Hu  }
1527f2b7720SXuan Hu
1537f2b7720SXuan Hu  object VstuType {
15457a10886SXuan Hu    def dummy = 0.U
1557f2b7720SXuan Hu  }
1567f2b7720SXuan Hu
157a3edac52SYinan Xu  object CommitType {
158c3abb8b6SYinan Xu    def NORMAL = "b000".U  // int/fp
159c3abb8b6SYinan Xu    def BRANCH = "b001".U  // branch
160c3abb8b6SYinan Xu    def LOAD   = "b010".U  // load
161c3abb8b6SYinan Xu    def STORE  = "b011".U  // store
162518d8658SYinan Xu
163c3abb8b6SYinan Xu    def apply() = UInt(3.W)
164c3abb8b6SYinan Xu    def isFused(commitType: UInt): Bool = commitType(2)
165c3abb8b6SYinan Xu    def isLoadStore(commitType: UInt): Bool = !isFused(commitType) && commitType(1)
166c3abb8b6SYinan Xu    def lsInstIsStore(commitType: UInt): Bool = commitType(0)
167c3abb8b6SYinan Xu    def isStore(commitType: UInt): Bool = isLoadStore(commitType) && lsInstIsStore(commitType)
168c3abb8b6SYinan Xu    def isBranch(commitType: UInt): Bool = commitType(0) && !commitType(1) && !isFused(commitType)
169518d8658SYinan Xu  }
170bfb958a3SYinan Xu
171bfb958a3SYinan Xu  object RedirectLevel {
1722d7c7105SYinan Xu    def flushAfter = "b0".U
1732d7c7105SYinan Xu    def flush      = "b1".U
174bfb958a3SYinan Xu
1752d7c7105SYinan Xu    def apply() = UInt(1.W)
1762d7c7105SYinan Xu    // def isUnconditional(level: UInt) = level(1)
177bfb958a3SYinan Xu    def flushItself(level: UInt) = level(0)
1782d7c7105SYinan Xu    // def isException(level: UInt) = level(1) && level(0)
179bfb958a3SYinan Xu  }
180baf8def6SYinan Xu
181baf8def6SYinan Xu  object ExceptionVec {
182baf8def6SYinan Xu    def apply() = Vec(16, Bool())
183baf8def6SYinan Xu  }
184a8e04b1dSYinan Xu
185c60c1ab4SWilliam Wang  object PMAMode {
1868d9a04fcSWilliam Wang    def R = "b1".U << 0 //readable
1878d9a04fcSWilliam Wang    def W = "b1".U << 1 //writeable
1888d9a04fcSWilliam Wang    def X = "b1".U << 2 //executable
1898d9a04fcSWilliam Wang    def I = "b1".U << 3 //cacheable: icache
1908d9a04fcSWilliam Wang    def D = "b1".U << 4 //cacheable: dcache
1918d9a04fcSWilliam Wang    def S = "b1".U << 5 //enable speculative access
192cff68e26SWilliam Wang    def A = "b1".U << 6 //enable atomic operation, A imply R & W
1938d9a04fcSWilliam Wang    def C = "b1".U << 7 //if it is cacheable is configable
194c60c1ab4SWilliam Wang    def Reserved = "b0".U
195c60c1ab4SWilliam Wang
196c60c1ab4SWilliam Wang    def apply() = UInt(7.W)
197c60c1ab4SWilliam Wang
198c60c1ab4SWilliam Wang    def read(mode: UInt) = mode(0)
199c60c1ab4SWilliam Wang    def write(mode: UInt) = mode(1)
200c60c1ab4SWilliam Wang    def execute(mode: UInt) = mode(2)
201c60c1ab4SWilliam Wang    def icache(mode: UInt) = mode(3)
202c60c1ab4SWilliam Wang    def dcache(mode: UInt) = mode(4)
203c60c1ab4SWilliam Wang    def speculate(mode: UInt) = mode(5)
204c60c1ab4SWilliam Wang    def atomic(mode: UInt) = mode(6)
205c60c1ab4SWilliam Wang    def configable_cache(mode: UInt) = mode(7)
206c60c1ab4SWilliam Wang
207c60c1ab4SWilliam Wang    def strToMode(s: String) = {
208423b9255SWilliam Wang      var result = 0.U(8.W)
209c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("R") >= 0) result = result + R
210c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("W") >= 0) result = result + W
211c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("X") >= 0) result = result + X
212c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("I") >= 0) result = result + I
213c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("D") >= 0) result = result + D
214c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("S") >= 0) result = result + S
215c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("A") >= 0) result = result + A
216c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("C") >= 0) result = result + C
217c60c1ab4SWilliam Wang      result
218c60c1ab4SWilliam Wang    }
219c60c1ab4SWilliam Wang  }
2202225d46eSJiawei Lin
2212225d46eSJiawei Lin
2222225d46eSJiawei Lin  object CSROpType {
2232225d46eSJiawei Lin    def jmp  = "b000".U
2242225d46eSJiawei Lin    def wrt  = "b001".U
2252225d46eSJiawei Lin    def set  = "b010".U
2262225d46eSJiawei Lin    def clr  = "b011".U
227b6900d94SYinan Xu    def wfi  = "b100".U
2282225d46eSJiawei Lin    def wrti = "b101".U
2292225d46eSJiawei Lin    def seti = "b110".U
2302225d46eSJiawei Lin    def clri = "b111".U
2315d669833SYinan Xu    def needAccess(op: UInt): Bool = op(1, 0) =/= 0.U
2322225d46eSJiawei Lin  }
2332225d46eSJiawei Lin
2342225d46eSJiawei Lin  // jump
2352225d46eSJiawei Lin  object JumpOpType {
2362225d46eSJiawei Lin    def jal  = "b00".U
2372225d46eSJiawei Lin    def jalr = "b01".U
2382225d46eSJiawei Lin    def auipc = "b10".U
2392225d46eSJiawei Lin//    def call = "b11_011".U
2402225d46eSJiawei Lin//    def ret  = "b11_100".U
2412225d46eSJiawei Lin    def jumpOpisJalr(op: UInt) = op(0)
2422225d46eSJiawei Lin    def jumpOpisAuipc(op: UInt) = op(1)
2432225d46eSJiawei Lin  }
2442225d46eSJiawei Lin
2452225d46eSJiawei Lin  object FenceOpType {
2462225d46eSJiawei Lin    def fence  = "b10000".U
2472225d46eSJiawei Lin    def sfence = "b10001".U
2482225d46eSJiawei Lin    def fencei = "b10010".U
249af2f7849Shappy-lx    def nofence= "b00000".U
2502225d46eSJiawei Lin  }
2512225d46eSJiawei Lin
2522225d46eSJiawei Lin  object ALUOpType {
253ee8ff153Szfw    // shift optype
254675acc68SYinan Xu    def slliuw     = "b000_0000".U // slliuw: ZEXT(src1[31:0]) << shamt
255675acc68SYinan Xu    def sll        = "b000_0001".U // sll:     src1 << src2
256ee8ff153Szfw
257675acc68SYinan Xu    def bclr       = "b000_0010".U // bclr:    src1 & ~(1 << src2[5:0])
258675acc68SYinan Xu    def bset       = "b000_0011".U // bset:    src1 | (1 << src2[5:0])
259675acc68SYinan Xu    def binv       = "b000_0100".U // binv:    src1 ^ ~(1 << src2[5:0])
260ee8ff153Szfw
261675acc68SYinan Xu    def srl        = "b000_0101".U // srl:     src1 >> src2
262675acc68SYinan Xu    def bext       = "b000_0110".U // bext:    (src1 >> src2)[0]
263675acc68SYinan Xu    def sra        = "b000_0111".U // sra:     src1 >> src2 (arithmetic)
264ee8ff153Szfw
2657b441e5eSYinan Xu    def rol        = "b000_1001".U // rol:     (src1 << src2) | (src1 >> (xlen - src2))
2667b441e5eSYinan Xu    def ror        = "b000_1011".U // ror:     (src1 >> src2) | (src1 << (xlen - src2))
267184a1958Szfw
268ee8ff153Szfw    // RV64 32bit optype
269675acc68SYinan Xu    def addw       = "b001_0000".U // addw:      SEXT((src1 + src2)[31:0])
270675acc68SYinan Xu    def oddaddw    = "b001_0001".U // oddaddw:   SEXT((src1[0] + src2)[31:0])
271675acc68SYinan Xu    def subw       = "b001_0010".U // subw:      SEXT((src1 - src2)[31:0])
272ee8ff153Szfw
273675acc68SYinan Xu    def addwbit    = "b001_0100".U // addwbit:   (src1 + src2)[0]
274675acc68SYinan Xu    def addwbyte   = "b001_0101".U // addwbyte:  (src1 + src2)[7:0]
275675acc68SYinan Xu    def addwzexth  = "b001_0110".U // addwzexth: ZEXT((src1  + src2)[15:0])
276675acc68SYinan Xu    def addwsexth  = "b001_0111".U // addwsexth: SEXT((src1  + src2)[15:0])
277ee8ff153Szfw
278675acc68SYinan Xu    def sllw       = "b001_1000".U // sllw:     SEXT((src1 << src2)[31:0])
279675acc68SYinan Xu    def srlw       = "b001_1001".U // srlw:     SEXT((src1[31:0] >> src2)[31:0])
280675acc68SYinan Xu    def sraw       = "b001_1010".U // sraw:     SEXT((src1[31:0] >> src2)[31:0])
281675acc68SYinan Xu    def rolw       = "b001_1100".U
282675acc68SYinan Xu    def rorw       = "b001_1101".U
283675acc68SYinan Xu
284675acc68SYinan Xu    // ADD-op
285675acc68SYinan Xu    def adduw      = "b010_0000".U // adduw:  src1[31:0]  + src2
286675acc68SYinan Xu    def add        = "b010_0001".U // add:     src1        + src2
287675acc68SYinan Xu    def oddadd     = "b010_0010".U // oddadd:  src1[0]     + src2
288675acc68SYinan Xu
289675acc68SYinan Xu    def sr29add    = "b010_0100".U // sr29add: src1[63:29] + src2
290675acc68SYinan Xu    def sr30add    = "b010_0101".U // sr30add: src1[63:30] + src2
291675acc68SYinan Xu    def sr31add    = "b010_0110".U // sr31add: src1[63:31] + src2
292675acc68SYinan Xu    def sr32add    = "b010_0111".U // sr32add: src1[63:32] + src2
293675acc68SYinan Xu
294675acc68SYinan Xu    def sh1adduw   = "b010_1000".U // sh1adduw: {src1[31:0], 1'b0} + src2
295675acc68SYinan Xu    def sh1add     = "b010_1001".U // sh1add: {src1[62:0], 1'b0} + src2
296675acc68SYinan Xu    def sh2adduw   = "b010_1010".U // sh2add_uw: {src1[31:0], 2'b0} + src2
297675acc68SYinan Xu    def sh2add     = "b010_1011".U // sh2add: {src1[61:0], 2'b0} + src2
298675acc68SYinan Xu    def sh3adduw   = "b010_1100".U // sh3add_uw: {src1[31:0], 3'b0} + src2
299675acc68SYinan Xu    def sh3add     = "b010_1101".U // sh3add: {src1[60:0], 3'b0} + src2
300675acc68SYinan Xu    def sh4add     = "b010_1111".U // sh4add: {src1[59:0], 4'b0} + src2
301675acc68SYinan Xu
302675acc68SYinan Xu    // SUB-op: src1 - src2
303675acc68SYinan Xu    def sub        = "b011_0000".U
304675acc68SYinan Xu    def sltu       = "b011_0001".U
305675acc68SYinan Xu    def slt        = "b011_0010".U
306675acc68SYinan Xu    def maxu       = "b011_0100".U
307675acc68SYinan Xu    def minu       = "b011_0101".U
308675acc68SYinan Xu    def max        = "b011_0110".U
309675acc68SYinan Xu    def min        = "b011_0111".U
310675acc68SYinan Xu
311675acc68SYinan Xu    // branch
312675acc68SYinan Xu    def beq        = "b111_0000".U
313675acc68SYinan Xu    def bne        = "b111_0010".U
314675acc68SYinan Xu    def blt        = "b111_1000".U
315675acc68SYinan Xu    def bge        = "b111_1010".U
316675acc68SYinan Xu    def bltu       = "b111_1100".U
317675acc68SYinan Xu    def bgeu       = "b111_1110".U
318675acc68SYinan Xu
319675acc68SYinan Xu    // misc optype
320675acc68SYinan Xu    def and        = "b100_0000".U
321675acc68SYinan Xu    def andn       = "b100_0001".U
322675acc68SYinan Xu    def or         = "b100_0010".U
323675acc68SYinan Xu    def orn        = "b100_0011".U
324675acc68SYinan Xu    def xor        = "b100_0100".U
325675acc68SYinan Xu    def xnor       = "b100_0101".U
326675acc68SYinan Xu    def orcb       = "b100_0110".U
327675acc68SYinan Xu
328675acc68SYinan Xu    def sextb      = "b100_1000".U
329675acc68SYinan Xu    def packh      = "b100_1001".U
330675acc68SYinan Xu    def sexth      = "b100_1010".U
331675acc68SYinan Xu    def packw      = "b100_1011".U
332675acc68SYinan Xu
333675acc68SYinan Xu    def revb       = "b101_0000".U
334675acc68SYinan Xu    def rev8       = "b101_0001".U
335675acc68SYinan Xu    def pack       = "b101_0010".U
336675acc68SYinan Xu    def orh48      = "b101_0011".U
337675acc68SYinan Xu
338675acc68SYinan Xu    def szewl1     = "b101_1000".U
339675acc68SYinan Xu    def szewl2     = "b101_1001".U
340675acc68SYinan Xu    def szewl3     = "b101_1010".U
341675acc68SYinan Xu    def byte2      = "b101_1011".U
342675acc68SYinan Xu
343675acc68SYinan Xu    def andlsb     = "b110_0000".U
344675acc68SYinan Xu    def andzexth   = "b110_0001".U
345675acc68SYinan Xu    def orlsb      = "b110_0010".U
346675acc68SYinan Xu    def orzexth    = "b110_0011".U
347675acc68SYinan Xu    def xorlsb     = "b110_0100".U
348675acc68SYinan Xu    def xorzexth   = "b110_0101".U
349675acc68SYinan Xu    def orcblsb    = "b110_0110".U
350675acc68SYinan Xu    def orcbzexth  = "b110_0111".U
3514aa9ed34Sfdy    def vsetvli1    = "b1000_0000".U
3524aa9ed34Sfdy    def vsetvli2    = "b1000_0100".U
3534aa9ed34Sfdy    def vsetvl1     = "b1000_0001".U
3544aa9ed34Sfdy    def vsetvl2     = "b1000_0101".U
3554aa9ed34Sfdy    def vsetivli1   = "b1000_0010".U
3564aa9ed34Sfdy    def vsetivli2   = "b1000_0110".U
357675acc68SYinan Xu
358675acc68SYinan Xu    def isAddw(func: UInt) = func(6, 4) === "b001".U && !func(3) && !func(1)
359675acc68SYinan Xu    def isSimpleLogic(func: UInt) = func(6, 4) === "b100".U && !func(0)
360675acc68SYinan Xu    def logicToLsb(func: UInt) = Cat("b110".U(3.W), func(3, 1), 0.U(1.W))
361675acc68SYinan Xu    def logicToZexth(func: UInt) = Cat("b110".U(3.W), func(3, 1), 1.U(1.W))
3624aa9ed34Sfdy    def isVset(func: UInt) = func(7, 3) === "b1000_0".U
3634aa9ed34Sfdy    def isVsetvl(func: UInt) = isVset(func) && func(0)
3644aa9ed34Sfdy    def isVsetvli(func: UInt) = isVset(func) && !func(1, 0).orR
3654aa9ed34Sfdy    def vsetExchange(func: UInt) = Cat(func(7, 3), "b1".U, func(1, 0))
366675acc68SYinan Xu
36757a10886SXuan Hu    def apply() = UInt(FuOpTypeWidth.W)
3682225d46eSJiawei Lin  }
3692225d46eSJiawei Lin
370*3b739f49SXuan Hu  object BRUOpType {
371*3b739f49SXuan Hu    // branch
372*3b739f49SXuan Hu    def beq        = "b000_000".U
373*3b739f49SXuan Hu    def bne        = "b000_001".U
374*3b739f49SXuan Hu    def blt        = "b000_100".U
375*3b739f49SXuan Hu    def bge        = "b000_101".U
376*3b739f49SXuan Hu    def bltu       = "b001_000".U
377*3b739f49SXuan Hu    def bgeu       = "b001_001".U
378*3b739f49SXuan Hu
379*3b739f49SXuan Hu    def getBranchType(func: UInt) = func(3, 1)
380*3b739f49SXuan Hu    def isBranchInvert(func: UInt) = func(0)
381*3b739f49SXuan Hu  }
382*3b739f49SXuan Hu
383*3b739f49SXuan Hu  object MULOpType {
384*3b739f49SXuan Hu    // mul
385*3b739f49SXuan Hu    // bit encoding: | type (2bit) | isWord(1bit) | opcode(2bit) |
386*3b739f49SXuan Hu    def mul    = "b00000".U
387*3b739f49SXuan Hu    def mulh   = "b00001".U
388*3b739f49SXuan Hu    def mulhsu = "b00010".U
389*3b739f49SXuan Hu    def mulhu  = "b00011".U
390*3b739f49SXuan Hu    def mulw   = "b00100".U
391*3b739f49SXuan Hu
392*3b739f49SXuan Hu    def mulw7  = "b01100".U
393*3b739f49SXuan Hu    def isSign(op: UInt) = !op(1)
394*3b739f49SXuan Hu    def isW(op: UInt) = op(2)
395*3b739f49SXuan Hu    def isH(op: UInt) = op(1, 0) =/= 0.U
396*3b739f49SXuan Hu    def getOp(op: UInt) = Cat(op(3), op(1, 0))
397*3b739f49SXuan Hu  }
398*3b739f49SXuan Hu
399*3b739f49SXuan Hu  object DIVOpType {
400*3b739f49SXuan Hu    // div
401*3b739f49SXuan Hu    // bit encoding: | type (2bit) | isWord(1bit) | isSign(1bit) | opcode(1bit) |
402*3b739f49SXuan Hu    def div    = "b10000".U
403*3b739f49SXuan Hu    def divu   = "b10010".U
404*3b739f49SXuan Hu    def rem    = "b10001".U
405*3b739f49SXuan Hu    def remu   = "b10011".U
406*3b739f49SXuan Hu
407*3b739f49SXuan Hu    def divw   = "b10100".U
408*3b739f49SXuan Hu    def divuw  = "b10110".U
409*3b739f49SXuan Hu    def remw   = "b10101".U
410*3b739f49SXuan Hu    def remuw  = "b10111".U
411*3b739f49SXuan Hu
412*3b739f49SXuan Hu    def isSign(op: UInt) = !op(1)
413*3b739f49SXuan Hu    def isW(op: UInt) = op(2)
414*3b739f49SXuan Hu    def isH(op: UInt) = op(0)
415*3b739f49SXuan Hu  }
416*3b739f49SXuan Hu
4172225d46eSJiawei Lin  object MDUOpType {
4182225d46eSJiawei Lin    // mul
4192225d46eSJiawei Lin    // bit encoding: | type (2bit) | isWord(1bit) | opcode(2bit) |
4202225d46eSJiawei Lin    def mul    = "b00000".U
4212225d46eSJiawei Lin    def mulh   = "b00001".U
4222225d46eSJiawei Lin    def mulhsu = "b00010".U
4232225d46eSJiawei Lin    def mulhu  = "b00011".U
4242225d46eSJiawei Lin    def mulw   = "b00100".U
4252225d46eSJiawei Lin
42688825c5cSYinan Xu    def mulw7  = "b01100".U
42788825c5cSYinan Xu
4282225d46eSJiawei Lin    // div
4292225d46eSJiawei Lin    // bit encoding: | type (2bit) | isWord(1bit) | isSign(1bit) | opcode(1bit) |
43088825c5cSYinan Xu    def div    = "b10000".U
43188825c5cSYinan Xu    def divu   = "b10010".U
43288825c5cSYinan Xu    def rem    = "b10001".U
43388825c5cSYinan Xu    def remu   = "b10011".U
4342225d46eSJiawei Lin
43588825c5cSYinan Xu    def divw   = "b10100".U
43688825c5cSYinan Xu    def divuw  = "b10110".U
43788825c5cSYinan Xu    def remw   = "b10101".U
43888825c5cSYinan Xu    def remuw  = "b10111".U
4392225d46eSJiawei Lin
44088825c5cSYinan Xu    def isMul(op: UInt) = !op(4)
44188825c5cSYinan Xu    def isDiv(op: UInt) = op(4)
4422225d46eSJiawei Lin
4432225d46eSJiawei Lin    def isDivSign(op: UInt) = isDiv(op) && !op(1)
4442225d46eSJiawei Lin    def isW(op: UInt) = op(2)
4452225d46eSJiawei Lin    def isH(op: UInt) = (isDiv(op) && op(0)) || (isMul(op) && op(1, 0) =/= 0.U)
4462225d46eSJiawei Lin    def getMulOp(op: UInt) = op(1, 0)
4472225d46eSJiawei Lin  }
4482225d46eSJiawei Lin
4492225d46eSJiawei Lin  object LSUOpType {
450d200f594SWilliam Wang    // load pipeline
4512225d46eSJiawei Lin
452d200f594SWilliam Wang    // normal load
453d200f594SWilliam Wang    // Note: bit(1, 0) are size, DO NOT CHANGE
454d200f594SWilliam Wang    // bit encoding: | load 0 | is unsigned(1bit) | size(2bit) |
455d200f594SWilliam Wang    def lb       = "b0000".U
456d200f594SWilliam Wang    def lh       = "b0001".U
457d200f594SWilliam Wang    def lw       = "b0010".U
458d200f594SWilliam Wang    def ld       = "b0011".U
459d200f594SWilliam Wang    def lbu      = "b0100".U
460d200f594SWilliam Wang    def lhu      = "b0101".U
461d200f594SWilliam Wang    def lwu      = "b0110".U
462ca18a0b4SWilliam Wang
463d200f594SWilliam Wang    // Zicbop software prefetch
464d200f594SWilliam Wang    // bit encoding: | prefetch 1 | 0 | prefetch type (2bit) |
465d200f594SWilliam Wang    def prefetch_i = "b1000".U // TODO
466d200f594SWilliam Wang    def prefetch_r = "b1001".U
467d200f594SWilliam Wang    def prefetch_w = "b1010".U
468ca18a0b4SWilliam Wang
469d200f594SWilliam Wang    def isPrefetch(op: UInt): Bool = op(3)
470d200f594SWilliam Wang
471d200f594SWilliam Wang    // store pipeline
472d200f594SWilliam Wang    // normal store
473d200f594SWilliam Wang    // bit encoding: | store 00 | size(2bit) |
474d200f594SWilliam Wang    def sb       = "b0000".U
475d200f594SWilliam Wang    def sh       = "b0001".U
476d200f594SWilliam Wang    def sw       = "b0010".U
477d200f594SWilliam Wang    def sd       = "b0011".U
478d200f594SWilliam Wang
479d200f594SWilliam Wang    // l1 cache op
480d200f594SWilliam Wang    // bit encoding: | cbo_zero 01 | size(2bit) 11 |
481d200f594SWilliam Wang    def cbo_zero  = "b0111".U
482d200f594SWilliam Wang
483d200f594SWilliam Wang    // llc op
484d200f594SWilliam Wang    // bit encoding: | prefetch 11 | suboptype(2bit) |
485d200f594SWilliam Wang    def cbo_clean = "b1100".U
486d200f594SWilliam Wang    def cbo_flush = "b1101".U
487d200f594SWilliam Wang    def cbo_inval = "b1110".U
488d200f594SWilliam Wang
489d200f594SWilliam Wang    def isCbo(op: UInt): Bool = op(3, 2) === "b11".U
4902225d46eSJiawei Lin
4912225d46eSJiawei Lin    // atomics
4922225d46eSJiawei Lin    // bit(1, 0) are size
4932225d46eSJiawei Lin    // since atomics use a different fu type
4942225d46eSJiawei Lin    // so we can safely reuse other load/store's encodings
495d200f594SWilliam Wang    // bit encoding: | optype(4bit) | size (2bit) |
4962225d46eSJiawei Lin    def lr_w      = "b000010".U
4972225d46eSJiawei Lin    def sc_w      = "b000110".U
4982225d46eSJiawei Lin    def amoswap_w = "b001010".U
4992225d46eSJiawei Lin    def amoadd_w  = "b001110".U
5002225d46eSJiawei Lin    def amoxor_w  = "b010010".U
5012225d46eSJiawei Lin    def amoand_w  = "b010110".U
5022225d46eSJiawei Lin    def amoor_w   = "b011010".U
5032225d46eSJiawei Lin    def amomin_w  = "b011110".U
5042225d46eSJiawei Lin    def amomax_w  = "b100010".U
5052225d46eSJiawei Lin    def amominu_w = "b100110".U
5062225d46eSJiawei Lin    def amomaxu_w = "b101010".U
5072225d46eSJiawei Lin
5082225d46eSJiawei Lin    def lr_d      = "b000011".U
5092225d46eSJiawei Lin    def sc_d      = "b000111".U
5102225d46eSJiawei Lin    def amoswap_d = "b001011".U
5112225d46eSJiawei Lin    def amoadd_d  = "b001111".U
5122225d46eSJiawei Lin    def amoxor_d  = "b010011".U
5132225d46eSJiawei Lin    def amoand_d  = "b010111".U
5142225d46eSJiawei Lin    def amoor_d   = "b011011".U
5152225d46eSJiawei Lin    def amomin_d  = "b011111".U
5162225d46eSJiawei Lin    def amomax_d  = "b100011".U
5172225d46eSJiawei Lin    def amominu_d = "b100111".U
5182225d46eSJiawei Lin    def amomaxu_d = "b101011".U
519b6982e83SLemover
520b6982e83SLemover    def size(op: UInt) = op(1,0)
5212225d46eSJiawei Lin  }
5222225d46eSJiawei Lin
5233feeca58Szfw  object BKUOpType {
524ee8ff153Szfw
5253feeca58Szfw    def clmul       = "b000000".U
5263feeca58Szfw    def clmulh      = "b000001".U
5273feeca58Szfw    def clmulr      = "b000010".U
5283feeca58Szfw    def xpermn      = "b000100".U
5293feeca58Szfw    def xpermb      = "b000101".U
530ee8ff153Szfw
5313feeca58Szfw    def clz         = "b001000".U
5323feeca58Szfw    def clzw        = "b001001".U
5333feeca58Szfw    def ctz         = "b001010".U
5343feeca58Szfw    def ctzw        = "b001011".U
5353feeca58Szfw    def cpop        = "b001100".U
5363feeca58Szfw    def cpopw       = "b001101".U
53707596dc6Szfw
5383feeca58Szfw    // 01xxxx is reserve
5393feeca58Szfw    def aes64es     = "b100000".U
5403feeca58Szfw    def aes64esm    = "b100001".U
5413feeca58Szfw    def aes64ds     = "b100010".U
5423feeca58Szfw    def aes64dsm    = "b100011".U
5433feeca58Szfw    def aes64im     = "b100100".U
5443feeca58Szfw    def aes64ks1i   = "b100101".U
5453feeca58Szfw    def aes64ks2    = "b100110".U
5463feeca58Szfw
5473feeca58Szfw    // merge to two instruction sm4ks & sm4ed
54819bcce38SFawang Zhang    def sm4ed0      = "b101000".U
54919bcce38SFawang Zhang    def sm4ed1      = "b101001".U
55019bcce38SFawang Zhang    def sm4ed2      = "b101010".U
55119bcce38SFawang Zhang    def sm4ed3      = "b101011".U
55219bcce38SFawang Zhang    def sm4ks0      = "b101100".U
55319bcce38SFawang Zhang    def sm4ks1      = "b101101".U
55419bcce38SFawang Zhang    def sm4ks2      = "b101110".U
55519bcce38SFawang Zhang    def sm4ks3      = "b101111".U
5563feeca58Szfw
5573feeca58Szfw    def sha256sum0  = "b110000".U
5583feeca58Szfw    def sha256sum1  = "b110001".U
5593feeca58Szfw    def sha256sig0  = "b110010".U
5603feeca58Szfw    def sha256sig1  = "b110011".U
5613feeca58Szfw    def sha512sum0  = "b110100".U
5623feeca58Szfw    def sha512sum1  = "b110101".U
5633feeca58Szfw    def sha512sig0  = "b110110".U
5643feeca58Szfw    def sha512sig1  = "b110111".U
5653feeca58Szfw
5663feeca58Szfw    def sm3p0       = "b111000".U
5673feeca58Szfw    def sm3p1       = "b111001".U
568ee8ff153Szfw  }
569ee8ff153Szfw
5702225d46eSJiawei Lin  object BTBtype {
5712225d46eSJiawei Lin    def B = "b00".U  // branch
5722225d46eSJiawei Lin    def J = "b01".U  // jump
5732225d46eSJiawei Lin    def I = "b10".U  // indirect
5742225d46eSJiawei Lin    def R = "b11".U  // return
5752225d46eSJiawei Lin
5762225d46eSJiawei Lin    def apply() = UInt(2.W)
5772225d46eSJiawei Lin  }
5782225d46eSJiawei Lin
5792225d46eSJiawei Lin  object SelImm {
580ee8ff153Szfw    def IMM_X  = "b0111".U
581ee8ff153Szfw    def IMM_S  = "b0000".U
582ee8ff153Szfw    def IMM_SB = "b0001".U
583ee8ff153Szfw    def IMM_U  = "b0010".U
584ee8ff153Szfw    def IMM_UJ = "b0011".U
585ee8ff153Szfw    def IMM_I  = "b0100".U
586ee8ff153Szfw    def IMM_Z  = "b0101".U
587ee8ff153Szfw    def INVALID_INSTR = "b0110".U
588ee8ff153Szfw    def IMM_B6 = "b1000".U
5892225d46eSJiawei Lin
59058c35d23Shuxuan0307    def IMM_OPIVIS = "b1001".U
59158c35d23Shuxuan0307    def IMM_OPIVIU = "b1010".U
592912e2179SXuan Hu    def IMM_VSETVLI   = "b1100".U
593912e2179SXuan Hu    def IMM_VSETIVLI  = "b1101".U
59458c35d23Shuxuan0307
59557a10886SXuan Hu    def X      = BitPat("b0000")
5966e7c9679Shuxuan0307
597ee8ff153Szfw    def apply() = UInt(4.W)
5982225d46eSJiawei Lin  }
5992225d46eSJiawei Lin
6006ab6918fSYinan Xu  object ExceptionNO {
6016ab6918fSYinan Xu    def instrAddrMisaligned = 0
6026ab6918fSYinan Xu    def instrAccessFault    = 1
6036ab6918fSYinan Xu    def illegalInstr        = 2
6046ab6918fSYinan Xu    def breakPoint          = 3
6056ab6918fSYinan Xu    def loadAddrMisaligned  = 4
6066ab6918fSYinan Xu    def loadAccessFault     = 5
6076ab6918fSYinan Xu    def storeAddrMisaligned = 6
6086ab6918fSYinan Xu    def storeAccessFault    = 7
6096ab6918fSYinan Xu    def ecallU              = 8
6106ab6918fSYinan Xu    def ecallS              = 9
6116ab6918fSYinan Xu    def ecallM              = 11
6126ab6918fSYinan Xu    def instrPageFault      = 12
6136ab6918fSYinan Xu    def loadPageFault       = 13
6146ab6918fSYinan Xu    // def singleStep          = 14
6156ab6918fSYinan Xu    def storePageFault      = 15
6166ab6918fSYinan Xu    def priorities = Seq(
6176ab6918fSYinan Xu      breakPoint, // TODO: different BP has different priority
6186ab6918fSYinan Xu      instrPageFault,
6196ab6918fSYinan Xu      instrAccessFault,
6206ab6918fSYinan Xu      illegalInstr,
6216ab6918fSYinan Xu      instrAddrMisaligned,
6226ab6918fSYinan Xu      ecallM, ecallS, ecallU,
623d880177dSYinan Xu      storeAddrMisaligned,
624d880177dSYinan Xu      loadAddrMisaligned,
6256ab6918fSYinan Xu      storePageFault,
6266ab6918fSYinan Xu      loadPageFault,
6276ab6918fSYinan Xu      storeAccessFault,
628d880177dSYinan Xu      loadAccessFault
6296ab6918fSYinan Xu    )
6306ab6918fSYinan Xu    def all = priorities.distinct.sorted
6316ab6918fSYinan Xu    def frontendSet = Seq(
6326ab6918fSYinan Xu      instrAddrMisaligned,
6336ab6918fSYinan Xu      instrAccessFault,
6346ab6918fSYinan Xu      illegalInstr,
6356ab6918fSYinan Xu      instrPageFault
6366ab6918fSYinan Xu    )
6376ab6918fSYinan Xu    def partialSelect(vec: Vec[Bool], select: Seq[Int]): Vec[Bool] = {
6386ab6918fSYinan Xu      val new_vec = Wire(ExceptionVec())
6396ab6918fSYinan Xu      new_vec.foreach(_ := false.B)
6406ab6918fSYinan Xu      select.foreach(i => new_vec(i) := vec(i))
6416ab6918fSYinan Xu      new_vec
6426ab6918fSYinan Xu    }
6436ab6918fSYinan Xu    def selectFrontend(vec: Vec[Bool]): Vec[Bool] = partialSelect(vec, frontendSet)
6446ab6918fSYinan Xu    def selectAll(vec: Vec[Bool]): Vec[Bool] = partialSelect(vec, ExceptionNO.all)
6456ab6918fSYinan Xu    def selectByFu(vec:Vec[Bool], fuConfig: FuConfig): Vec[Bool] =
6466ab6918fSYinan Xu      partialSelect(vec, fuConfig.exceptionOut)
647*3b739f49SXuan Hu//    def selectByExu(vec:Vec[Bool], exuConfig: ExuConfig): Vec[Bool] =
648*3b739f49SXuan Hu//      partialSelect(vec, exuConfig.exceptionOut)
649*3b739f49SXuan Hu//    def selectByExu(vec:Vec[Bool], exuConfigs: Seq[ExuConfig]): Vec[Bool] =
650*3b739f49SXuan Hu//      partialSelect(vec, exuConfigs.map(_.exceptionOut).reduce(_ ++ _).distinct.sorted)
6516ab6918fSYinan Xu  }
6526ab6918fSYinan Xu
653*3b739f49SXuan Hu//  def dividerGen(p: Parameters) = new DividerWrapper(p(XLen))(p)
654*3b739f49SXuan Hu//  def multiplierGen(p: Parameters) = new ArrayMultiplier(p(XLen) + 1)(p)
655*3b739f49SXuan Hu//  def aluGen(p: Parameters) = new Alu()(p)
656*3b739f49SXuan Hu//  def bkuGen(p: Parameters) = new Bku()(p)
657*3b739f49SXuan Hu//  def jmpGen(p: Parameters) = new Jump()(p)
658*3b739f49SXuan Hu//  def fenceGen(p: Parameters) = new Fence()(p)
659*3b739f49SXuan Hu//  def csrGen(p: Parameters) = new CSR()(p)
660*3b739f49SXuan Hu//  def i2fGen(p: Parameters) = new IntToFP()(p)
661*3b739f49SXuan Hu//  def fmacGen(p: Parameters) = new FMA()(p)
662*3b739f49SXuan Hu//  def f2iGen(p: Parameters) = new FPToInt()(p)
663*3b739f49SXuan Hu//  def f2fGen(p: Parameters) = new FPToFP()(p)
664*3b739f49SXuan Hu//  def fdivSqrtGen(p: Parameters) = new FDivSqrt()(p)
665*3b739f49SXuan Hu//  def stdGen(p: Parameters) = new Std()(p)
666*3b739f49SXuan Hu//  def mouDataGen(p: Parameters) = new Std()(p)
667*3b739f49SXuan Hu//  def vipuGen(p: Parameters) = new VIPU()(p)
668*3b739f49SXuan Hu//
669*3b739f49SXuan Hu//  def f2iSel(uop: MicroOp): Bool = {
670*3b739f49SXuan Hu//    uop.ctrl.rfWen
671*3b739f49SXuan Hu//  }
672*3b739f49SXuan Hu//
673*3b739f49SXuan Hu//  def i2fSel(uop: MicroOp): Bool = {
674*3b739f49SXuan Hu//    uop.ctrl.fpu.fromInt
675*3b739f49SXuan Hu//  }
676*3b739f49SXuan Hu//
677*3b739f49SXuan Hu//  def f2fSel(uop: MicroOp): Bool = {
678*3b739f49SXuan Hu//    val ctrl = uop.ctrl.fpu
679*3b739f49SXuan Hu//    ctrl.fpWen && !ctrl.div && !ctrl.sqrt
680*3b739f49SXuan Hu//  }
681*3b739f49SXuan Hu//
682*3b739f49SXuan Hu//  def fdivSqrtSel(uop: MicroOp): Bool = {
683*3b739f49SXuan Hu//    val ctrl = uop.ctrl.fpu
684*3b739f49SXuan Hu//    ctrl.div || ctrl.sqrt
685*3b739f49SXuan Hu//  }
686*3b739f49SXuan Hu//
687*3b739f49SXuan Hu//  val aluCfg = FuConfig(
688*3b739f49SXuan Hu//    name = "alu",
689*3b739f49SXuan Hu//    fuGen = aluGen,
690*3b739f49SXuan Hu//    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.alu,
691*3b739f49SXuan Hu//    fuType = FuType.alu,
692*3b739f49SXuan Hu//    numIntSrc = 2,
693*3b739f49SXuan Hu//    numFpSrc = 0,
694*3b739f49SXuan Hu//    writeIntRf = true,
695*3b739f49SXuan Hu//    writeFpRf = false,
696*3b739f49SXuan Hu//    hasRedirect = true,
697*3b739f49SXuan Hu//  )
698*3b739f49SXuan Hu//
699*3b739f49SXuan Hu//  val jmpCfg = FuConfig(
700*3b739f49SXuan Hu//    name = "jmp",
701*3b739f49SXuan Hu//    fuGen = jmpGen,
702*3b739f49SXuan Hu//    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.jmp,
703*3b739f49SXuan Hu//    fuType = FuType.jmp,
704*3b739f49SXuan Hu//    numIntSrc = 1,
705*3b739f49SXuan Hu//    numFpSrc = 0,
706*3b739f49SXuan Hu//    writeIntRf = true,
707*3b739f49SXuan Hu//    writeFpRf = false,
708*3b739f49SXuan Hu//    hasRedirect = true,
709*3b739f49SXuan Hu//  )
710*3b739f49SXuan Hu//
711*3b739f49SXuan Hu//  val fenceCfg = FuConfig(
712*3b739f49SXuan Hu//    name = "fence",
713*3b739f49SXuan Hu//    fuGen = fenceGen,
714*3b739f49SXuan Hu//    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.fence,
715*3b739f49SXuan Hu//    FuType.fence, 2, 0, writeIntRf = false, writeFpRf = false,
716*3b739f49SXuan Hu//    latency = UncertainLatency(), exceptionOut = Seq(illegalInstr), // TODO: need rewrite latency structure, not just this value,
717*3b739f49SXuan Hu//    flushPipe = true
718*3b739f49SXuan Hu//  )
719*3b739f49SXuan Hu//
720*3b739f49SXuan Hu//  val csrCfg = FuConfig(
721*3b739f49SXuan Hu//    name = "csr",
722*3b739f49SXuan Hu//    fuGen = csrGen,
723*3b739f49SXuan Hu//    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.csr,
724*3b739f49SXuan Hu//    fuType = FuType.csr,
725*3b739f49SXuan Hu//    numIntSrc = 1,
726*3b739f49SXuan Hu//    numFpSrc = 0,
727*3b739f49SXuan Hu//    writeIntRf = true,
728*3b739f49SXuan Hu//    writeFpRf = false,
729*3b739f49SXuan Hu//    exceptionOut = Seq(illegalInstr, breakPoint, ecallU, ecallS, ecallM),
730*3b739f49SXuan Hu//    flushPipe = true
731*3b739f49SXuan Hu//  )
732*3b739f49SXuan Hu//
733*3b739f49SXuan Hu//  val i2fCfg = FuConfig(
734*3b739f49SXuan Hu//    name = "i2f",
735*3b739f49SXuan Hu//    fuGen = i2fGen,
736*3b739f49SXuan Hu//    fuSel = i2fSel,
737*3b739f49SXuan Hu//    FuType.i2f,
738*3b739f49SXuan Hu//    numIntSrc = 1,
739*3b739f49SXuan Hu//    numFpSrc = 0,
740*3b739f49SXuan Hu//    writeIntRf = false,
741*3b739f49SXuan Hu//    writeFpRf = true,
742*3b739f49SXuan Hu//    writeFflags = true,
743*3b739f49SXuan Hu//    latency = CertainLatency(2),
744*3b739f49SXuan Hu//    fastUopOut = true, fastImplemented = true
745*3b739f49SXuan Hu//  )
746*3b739f49SXuan Hu//
747*3b739f49SXuan Hu//  val divCfg = FuConfig(
748*3b739f49SXuan Hu//    name = "div",
749*3b739f49SXuan Hu//    fuGen = dividerGen,
750*3b739f49SXuan Hu//    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.div,
751*3b739f49SXuan Hu//    FuType.div,
752*3b739f49SXuan Hu//    2,
753*3b739f49SXuan Hu//    0,
754*3b739f49SXuan Hu//    writeIntRf = true,
755*3b739f49SXuan Hu//    writeFpRf = false,
756*3b739f49SXuan Hu//    latency = UncertainLatency(),
757*3b739f49SXuan Hu//    fastUopOut = true,
758*3b739f49SXuan Hu//    fastImplemented = true,
759*3b739f49SXuan Hu//    hasInputBuffer = (true, 4, true)
760*3b739f49SXuan Hu//  )
761*3b739f49SXuan Hu//
762*3b739f49SXuan Hu//  val mulCfg = FuConfig(
763*3b739f49SXuan Hu//    name = "mul",
764*3b739f49SXuan Hu//    fuGen = multiplierGen,
765*3b739f49SXuan Hu//    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.mul,
766*3b739f49SXuan Hu//    FuType.mul,
767*3b739f49SXuan Hu//    2,
768*3b739f49SXuan Hu//    0,
769*3b739f49SXuan Hu//    writeIntRf = true,
770*3b739f49SXuan Hu//    writeFpRf = false,
771*3b739f49SXuan Hu//    latency = CertainLatency(2),
772*3b739f49SXuan Hu//    fastUopOut = true,
773*3b739f49SXuan Hu//    fastImplemented = true
774*3b739f49SXuan Hu//  )
775*3b739f49SXuan Hu//
776*3b739f49SXuan Hu//  val bkuCfg = FuConfig(
777*3b739f49SXuan Hu//    name = "bku",
778*3b739f49SXuan Hu//    fuGen = bkuGen,
779*3b739f49SXuan Hu//    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.bku,
780*3b739f49SXuan Hu//    fuType = FuType.bku,
781*3b739f49SXuan Hu//    numIntSrc = 2,
782*3b739f49SXuan Hu//    numFpSrc = 0,
783*3b739f49SXuan Hu//    writeIntRf = true,
784*3b739f49SXuan Hu//    writeFpRf = false,
785*3b739f49SXuan Hu//    latency = CertainLatency(1),
786*3b739f49SXuan Hu//    fastUopOut = true,
787*3b739f49SXuan Hu//    fastImplemented = true
788*3b739f49SXuan Hu// )
789*3b739f49SXuan Hu//
790*3b739f49SXuan Hu//  val fmacCfg = FuConfig(
791*3b739f49SXuan Hu//    name = "fmac",
792*3b739f49SXuan Hu//    fuGen = fmacGen,
793*3b739f49SXuan Hu//    fuSel = _ => true.B,
794*3b739f49SXuan Hu//    FuType.fmac, 0, 3, writeIntRf = false, writeFpRf = true, writeFflags = true,
795*3b739f49SXuan Hu//    latency = UncertainLatency(), fastUopOut = true, fastImplemented = true
796*3b739f49SXuan Hu//  )
797*3b739f49SXuan Hu//
798*3b739f49SXuan Hu//  val f2iCfg = FuConfig(
799*3b739f49SXuan Hu//    name = "f2i",
800*3b739f49SXuan Hu//    fuGen = f2iGen,
801*3b739f49SXuan Hu//    fuSel = f2iSel,
802*3b739f49SXuan Hu//    FuType.fmisc, 0, 1, writeIntRf = true, writeFpRf = false, writeFflags = true, latency = CertainLatency(2),
803*3b739f49SXuan Hu//    fastUopOut = true, fastImplemented = true
804*3b739f49SXuan Hu//  )
805*3b739f49SXuan Hu//
806*3b739f49SXuan Hu//  val f2fCfg = FuConfig(
807*3b739f49SXuan Hu//    name = "f2f",
808*3b739f49SXuan Hu//    fuGen = f2fGen,
809*3b739f49SXuan Hu//    fuSel = f2fSel,
810*3b739f49SXuan Hu//    FuType.fmisc, 0, 1, writeIntRf = false, writeFpRf = true, writeFflags = true, latency = CertainLatency(2),
811*3b739f49SXuan Hu//    fastUopOut = true, fastImplemented = true
812*3b739f49SXuan Hu//  )
813*3b739f49SXuan Hu//
814*3b739f49SXuan Hu//  val fdivSqrtCfg = FuConfig(
815*3b739f49SXuan Hu//    name = "fdivSqrt",
816*3b739f49SXuan Hu//    fuGen = fdivSqrtGen,
817*3b739f49SXuan Hu//    fuSel = fdivSqrtSel,
818*3b739f49SXuan Hu//    FuType.fDivSqrt, 0, 2, writeIntRf = false, writeFpRf = true, writeFflags = true, latency = UncertainLatency(),
819*3b739f49SXuan Hu//    fastUopOut = true, fastImplemented = true, hasInputBuffer = (true, 8, true)
820*3b739f49SXuan Hu//  )
821*3b739f49SXuan Hu//
822*3b739f49SXuan Hu//  val lduCfg = FuConfig(
823*3b739f49SXuan Hu//    "ldu",
824*3b739f49SXuan Hu//    null, // DontCare
825*3b739f49SXuan Hu//    (uop: MicroOp) => FuType.loadCanAccept(uop.ctrl.fuType),
826*3b739f49SXuan Hu//    FuType.ldu, 1, 0, writeIntRf = true, writeFpRf = true,
827*3b739f49SXuan Hu//    latency = UncertainLatency(),
828*3b739f49SXuan Hu//    exceptionOut = Seq(loadAddrMisaligned, loadAccessFault, loadPageFault),
829*3b739f49SXuan Hu//    flushPipe = true,
830*3b739f49SXuan Hu//    replayInst = true,
831*3b739f49SXuan Hu//    hasLoadError = true
832*3b739f49SXuan Hu//  )
833*3b739f49SXuan Hu//
834*3b739f49SXuan Hu//  val staCfg = FuConfig(
835*3b739f49SXuan Hu//    "sta",
836*3b739f49SXuan Hu//    null,
837*3b739f49SXuan Hu//    (uop: MicroOp) => FuType.storeCanAccept(uop.ctrl.fuType),
838*3b739f49SXuan Hu//    FuType.stu, 1, 0, writeIntRf = false, writeFpRf = false,
839*3b739f49SXuan Hu//    latency = UncertainLatency(),
840*3b739f49SXuan Hu//    exceptionOut = Seq(storeAddrMisaligned, storeAccessFault, storePageFault)
841*3b739f49SXuan Hu//  )
842*3b739f49SXuan Hu//
843*3b739f49SXuan Hu//  val stdCfg = FuConfig(
844*3b739f49SXuan Hu//    "std",
845*3b739f49SXuan Hu//    fuGen = stdGen, fuSel = (uop: MicroOp) => FuType.storeCanAccept(uop.ctrl.fuType), FuType.stu, 1, 1,
846*3b739f49SXuan Hu//    writeIntRf = false, writeFpRf = false, latency = CertainLatency(1)
847*3b739f49SXuan Hu//  )
848*3b739f49SXuan Hu//
849*3b739f49SXuan Hu//  val mouCfg = FuConfig(
850*3b739f49SXuan Hu//    "mou",
851*3b739f49SXuan Hu//    null,
852*3b739f49SXuan Hu//    (uop: MicroOp) => FuType.storeCanAccept(uop.ctrl.fuType),
853*3b739f49SXuan Hu//    FuType.mou, 1, 0, writeIntRf = false, writeFpRf = false,
854*3b739f49SXuan Hu//    latency = UncertainLatency(), exceptionOut = lduCfg.exceptionOut ++ staCfg.exceptionOut
855*3b739f49SXuan Hu//  )
856*3b739f49SXuan Hu//
857*3b739f49SXuan Hu//  val mouDataCfg = FuConfig(
858*3b739f49SXuan Hu//    "mou",
859*3b739f49SXuan Hu//    mouDataGen,
860*3b739f49SXuan Hu//    (uop: MicroOp) => FuType.storeCanAccept(uop.ctrl.fuType),
861*3b739f49SXuan Hu//    FuType.mou, 1, 0, writeIntRf = false, writeFpRf = false,
862*3b739f49SXuan Hu//    latency = UncertainLatency()
863*3b739f49SXuan Hu//  )
864*3b739f49SXuan Hu//
865*3b739f49SXuan Hu//  val vipuCfg = FuConfig(
866*3b739f49SXuan Hu//    name = "vipu",
867*3b739f49SXuan Hu//    fuGen = vipuGen,
868*3b739f49SXuan Hu//    fuSel = (uop: MicroOp) => FuType.vipu === uop.ctrl.fuType,
869*3b739f49SXuan Hu//    fuType = FuType.vipu,
870*3b739f49SXuan Hu//    numIntSrc = 0, numFpSrc = 0, writeIntRf = false, writeFpRf = false, writeFflags = false,
871*3b739f49SXuan Hu//    numVecSrc = 2, writeVecRf = true,
872*3b739f49SXuan Hu//    fastUopOut = true, // TODO: check
873*3b739f49SXuan Hu//    fastImplemented = true, //TODO: check
874*3b739f49SXuan Hu//  )
8752225d46eSJiawei Lin
876*3b739f49SXuan Hu//  val JumpExeUnitCfg = ExuConfig("JmpExeUnit", "Int", Seq(jmpCfg, i2fCfg), 2, Int.MaxValue)
877*3b739f49SXuan Hu//  val AluExeUnitCfg = ExuConfig("AluExeUnit", "Int", Seq(aluCfg), 0, Int.MaxValue)
878*3b739f49SXuan Hu//  val JumpCSRExeUnitCfg = ExuConfig("JmpCSRExeUnit", "Int", Seq(jmpCfg, csrCfg, fenceCfg, i2fCfg), 2, Int.MaxValue)
879*3b739f49SXuan Hu//  val MulDivExeUnitCfg = ExuConfig("MulDivExeUnit", "Int", Seq(mulCfg, divCfg, bkuCfg), 1, Int.MaxValue)
880*3b739f49SXuan Hu//  val FmacExeUnitCfg = ExuConfig("FmacExeUnit", "Fp", Seq(fmacCfg, vipuCfg), Int.MaxValue, 0)
881*3b739f49SXuan Hu//  val FmiscExeUnitCfg = ExuConfig(
882*3b739f49SXuan Hu//    "FmiscExeUnit",
883*3b739f49SXuan Hu//    "Fp",
884*3b739f49SXuan Hu//    Seq(f2iCfg, f2fCfg, fdivSqrtCfg),
885*3b739f49SXuan Hu//    Int.MaxValue, 1
886*3b739f49SXuan Hu//  )
887*3b739f49SXuan Hu//  val LdExeUnitCfg = ExuConfig("LoadExu", "Mem", Seq(lduCfg), wbIntPriority = 0, wbFpPriority = 0, extendsExu = false)
888*3b739f49SXuan Hu//  val StaExeUnitCfg = ExuConfig("StaExu", "Mem", Seq(staCfg, mouCfg), wbIntPriority = Int.MaxValue, wbFpPriority = Int.MaxValue, extendsExu = false)
889*3b739f49SXuan Hu//  val StdExeUnitCfg = ExuConfig("StdExu", "Mem", Seq(stdCfg, mouDataCfg), wbIntPriority = Int.MaxValue, wbFpPriority = Int.MaxValue, extendsExu = false)
89054034ccdSZhangZifei
891d16f4ea4SZhangZifei  // def jumpRSWrapperGen(p: Parameters) = new JumpRSWrapper()(p)
892d16f4ea4SZhangZifei  // def mulRSWrapperGen(p: Parameters) = new MulRSWrapper()(p)
893d16f4ea4SZhangZifei  // def loadRSWrapperGen(p: Parameters) = new LoadRSWrapper()(p)
894d16f4ea4SZhangZifei  // def stdRSWrapperGen(p: Parameters) = new StdRSWrapper()(p)
895d16f4ea4SZhangZifei  // def staRSWrapperGen(p: Parameters) = new StaRSWrapper()(p)
896d16f4ea4SZhangZifei  // def fmaRSWrapperGen(p: Parameters) = new FMARSWrapper()(p)
897d16f4ea4SZhangZifei  // def fmiscRSWrapperGen(p: Parameters) = new FMiscRSWrapper()(p)
89854034ccdSZhangZifei
899*3b739f49SXuan Hu//  val aluRSMod = new RSMod(
900*3b739f49SXuan Hu//    rsWrapperGen = (modGen: RSMod, p: Parameters) => new ALURSWrapper(modGen)(p),
901*3b739f49SXuan Hu//    rsGen = (a: RSParams, b: Parameters) => new ALURS(a)(b),
902*3b739f49SXuan Hu//    immExtractorGen = (src: Int, width: Int, p: Parameters) => new AluImmExtractor()(p)
903*3b739f49SXuan Hu//  )
904*3b739f49SXuan Hu//  val fmaRSMod = new RSMod(
905*3b739f49SXuan Hu//    rsWrapperGen = (modGen: RSMod, p: Parameters) => new FMARSWrapper(modGen)(p),
906*3b739f49SXuan Hu//    rsGen = (a: RSParams, b: Parameters) => new FMARS(a)(b),
907*3b739f49SXuan Hu//  )
908*3b739f49SXuan Hu//  val fmiscRSMod = new RSMod(
909*3b739f49SXuan Hu//    rsWrapperGen = (modGen: RSMod, p: Parameters) => new FMiscRSWrapper(modGen)(p),
910*3b739f49SXuan Hu//    rsGen = (a: RSParams, b: Parameters) => new FMiscRS(a)(b),
911*3b739f49SXuan Hu//  )
912*3b739f49SXuan Hu//  val jumpRSMod = new RSMod(
913*3b739f49SXuan Hu//    rsWrapperGen = (modGen: RSMod, p: Parameters) => new JumpRSWrapper(modGen)(p),
914*3b739f49SXuan Hu//    rsGen = (a: RSParams, b: Parameters) => new JumpRS(a)(b),
915*3b739f49SXuan Hu//    immExtractorGen = (src: Int, width: Int, p: Parameters) => new JumpImmExtractor()(p)
916*3b739f49SXuan Hu//  )
917*3b739f49SXuan Hu//  val loadRSMod = new RSMod(
918*3b739f49SXuan Hu//    rsWrapperGen = (modGen: RSMod, p: Parameters) => new LoadRSWrapper(modGen)(p),
919*3b739f49SXuan Hu//    rsGen = (a: RSParams, b: Parameters) => new LoadRS(a)(b),
920*3b739f49SXuan Hu//    immExtractorGen = (src: Int, width: Int, p: Parameters) => new LoadImmExtractor()(p)
921*3b739f49SXuan Hu//  )
922*3b739f49SXuan Hu//  val mulRSMod = new RSMod(
923*3b739f49SXuan Hu//    rsWrapperGen = (modGen: RSMod, p: Parameters) => new MulRSWrapper(modGen)(p),
924*3b739f49SXuan Hu//    rsGen = (a: RSParams, b: Parameters) => new MulRS(a)(b),
925*3b739f49SXuan Hu//    immExtractorGen = (src: Int, width: Int, p: Parameters) => new MduImmExtractor()(p)
926*3b739f49SXuan Hu//  )
927*3b739f49SXuan Hu//  val staRSMod = new RSMod(
928*3b739f49SXuan Hu//    rsWrapperGen = (modGen: RSMod, p: Parameters) => new StaRSWrapper(modGen)(p),
929*3b739f49SXuan Hu//    rsGen = (a: RSParams, b: Parameters) => new StaRS(a)(b),
930*3b739f49SXuan Hu//  )
931*3b739f49SXuan Hu//  val stdRSMod = new RSMod(
932*3b739f49SXuan Hu//    rsWrapperGen = (modGen: RSMod, p: Parameters) => new StdRSWrapper(modGen)(p),
933*3b739f49SXuan Hu//    rsGen = (a: RSParams, b: Parameters) => new StdRS(a)(b),
934*3b739f49SXuan Hu//  )
9359a2e6b8aSLinJiawei}
936