xref: /XiangShan/src/main/scala/xiangshan/package.scala (revision 351e22f26da95fa305d86026388229ea5ee7cf9a)
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._
253b739f49SXuan 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
48*351e22f2SXuan Hu    def isVfp(srcType: UInt) = isVp(srcType) || isFp(srcType)
491285b047SXuan Hu    def apply() = UInt(3.W)
509a2e6b8aSLinJiawei  }
519a2e6b8aSLinJiawei
529a2e6b8aSLinJiawei  object SrcState {
53100aa93cSYinan Xu    def busy    = "b0".U
54100aa93cSYinan Xu    def rdy     = "b1".U
55100aa93cSYinan Xu    // def specRdy = "b10".U // speculative ready, for future use
56100aa93cSYinan Xu    def apply() = UInt(1.W)
579ca09953SXuan Hu
589ca09953SXuan Hu    def isReady(state: UInt): Bool = state === this.rdy
599ca09953SXuan Hu    def isBusy(state: UInt): Bool = state === this.busy
609a2e6b8aSLinJiawei  }
619a2e6b8aSLinJiawei
627f2b7720SXuan Hu  // Todo: Use OH instead
633b739f49SXuan Hu//  object FuType {
643b739f49SXuan Hu//    def jmp   = (BigInt(1) << 0).U
653b739f49SXuan Hu//    def brh   = (BigInt(1) << 1).U
663b739f49SXuan Hu//    def i2f   = (BigInt(1) << 2).U
673b739f49SXuan Hu//    def csr   = (BigInt(1) << 3).U
683b739f49SXuan Hu//    def alu   = (BigInt(1) << 4).U
693b739f49SXuan Hu//    def mul   = (BigInt(1) << 5).U
703b739f49SXuan Hu//    def div   = (BigInt(1) << 6).U
713b739f49SXuan Hu//    def fence = (BigInt(1) << 7).U
723b739f49SXuan Hu//    def bku   = (BigInt(1) << 8).U
733b739f49SXuan Hu//    def vset  = (BigInt(1) << 9).U
743b739f49SXuan Hu//
753b739f49SXuan Hu//    def fmac     = (BigInt(1) << 10).U
763b739f49SXuan Hu//    def fmisc    = (BigInt(1) << 11).U
773b739f49SXuan Hu//    def fDivSqrt = (BigInt(1) << 12).U
783b739f49SXuan Hu//
793b739f49SXuan Hu//    def ldu      = (BigInt(1) << 13).U
803b739f49SXuan Hu//    def stu      = (BigInt(1) << 14).U
813b739f49SXuan Hu//    def mou      = (BigInt(1) << 15).U // for amo, lr, sc, fence
823b739f49SXuan Hu//    def vipu     = (BigInt(1) << 16).U
833b739f49SXuan Hu//    def vfpu     = (BigInt(1) << 17).U
843b739f49SXuan Hu//    def vldu     = (BigInt(1) << 18).U
853b739f49SXuan Hu//    def vstu     = (BigInt(1) << 19).U
863b739f49SXuan Hu//    def X        = BitPat.dontCare(num)
873b739f49SXuan Hu//
883b739f49SXuan Hu//    def num = 20
893b739f49SXuan Hu//
903b739f49SXuan Hu//    def apply() = UInt(log2Up(num).W)
913b739f49SXuan Hu//
923b739f49SXuan Hu//    def isIntExu(fuType: UInt) = !fuType(3)
933b739f49SXuan Hu//    def isJumpExu(fuType: UInt) = fuType === jmp
943b739f49SXuan Hu//    def isFpExu(fuType: UInt) = fuType(3, 2) === "b10".U
953b739f49SXuan Hu//    def isMemExu(fuType: UInt) = fuType(3, 2) === "b11".U
963b739f49SXuan Hu//    def isLoadStore(fuType: UInt) = isMemExu(fuType) && !fuType(1)
973b739f49SXuan Hu//    def isStoreExu(fuType: UInt) = isMemExu(fuType) && fuType(0)
983b739f49SXuan Hu//    def isAMO(fuType: UInt) = fuType(1)
993b739f49SXuan Hu//    def isFence(fuType: UInt) = fuType === fence
1003b739f49SXuan Hu//    def isSvinvalBegin(fuType: UInt, func: UInt, flush: Bool) = isFence(fuType) && func === FenceOpType.nofence && !flush
1013b739f49SXuan Hu//    def isSvinval(fuType: UInt, func: UInt, flush: Bool) = isFence(fuType) && func === FenceOpType.sfence && !flush
1023b739f49SXuan Hu//    def isSvinvalEnd(fuType: UInt, func: UInt, flush: Bool) = isFence(fuType) && func === FenceOpType.nofence && flush
1033b739f49SXuan Hu//    def isVpu(fuType: UInt) = fuType(4)
1043b739f49SXuan Hu//
1053b739f49SXuan Hu//    def jmpCanAccept(fuType: UInt) = !fuType(2)
1063b739f49SXuan Hu//    def mduCanAccept(fuType: UInt) = fuType(2) && !fuType(1) || fuType(2) && fuType(1) && fuType(0)
1073b739f49SXuan Hu//    def aluCanAccept(fuType: UInt) = fuType(2) && fuType(1) && !fuType(0)
1083b739f49SXuan Hu//
1093b739f49SXuan Hu//    def fmacCanAccept(fuType: UInt) = !fuType(1)
1103b739f49SXuan Hu//    def fmiscCanAccept(fuType: UInt) = fuType(1)
1113b739f49SXuan Hu//
1123b739f49SXuan Hu//    def loadCanAccept(fuType: UInt) = !fuType(0)
1133b739f49SXuan Hu//    def storeCanAccept(fuType: UInt) = fuType(0)
1143b739f49SXuan Hu//
1153b739f49SXuan Hu//    def storeIsAMO(fuType: UInt) = fuType(1)
1163b739f49SXuan Hu//
1173b739f49SXuan Hu//    val functionNameMap = Map(
1183b739f49SXuan Hu//      jmp.litValue() -> "jmp",
1193b739f49SXuan Hu//      i2f.litValue() -> "int_to_float",
1203b739f49SXuan Hu//      csr.litValue() -> "csr",
1213b739f49SXuan Hu//      alu.litValue() -> "alu",
1223b739f49SXuan Hu//      mul.litValue() -> "mul",
1233b739f49SXuan Hu//      div.litValue() -> "div",
1243b739f49SXuan Hu//      fence.litValue() -> "fence",
1253b739f49SXuan Hu//      bku.litValue() -> "bku",
1263b739f49SXuan Hu//      fmac.litValue() -> "fmac",
1273b739f49SXuan Hu//      fmisc.litValue() -> "fmisc",
1283b739f49SXuan Hu//      fDivSqrt.litValue() -> "fdiv_fsqrt",
1293b739f49SXuan Hu//      ldu.litValue() -> "load",
1303b739f49SXuan Hu//      stu.litValue() -> "store",
1313b739f49SXuan Hu//      mou.litValue() -> "mou"
1323b739f49SXuan Hu//    )
1333b739f49SXuan Hu//  }
1349a2e6b8aSLinJiawei
13557a10886SXuan Hu  def FuOpTypeWidth = 8
1362225d46eSJiawei Lin  object FuOpType {
13757a10886SXuan Hu    def apply() = UInt(FuOpTypeWidth.W)
13857a10886SXuan Hu    def X = BitPat("b00000000")
139ebd97ecbSzhanglinjuan  }
140518d8658SYinan Xu
1413a2e64c4SZhangZifei  // move VipuType and VfpuType into YunSuan/package.scala
1423a2e64c4SZhangZifei  // object VipuType {
1433a2e64c4SZhangZifei  //   def dummy = 0.U(7.W)
1443a2e64c4SZhangZifei  // }
1457f2b7720SXuan Hu
1463a2e64c4SZhangZifei  // object VfpuType {
1473a2e64c4SZhangZifei  //   def dummy = 0.U(7.W)
1483a2e64c4SZhangZifei  // }
1497f2b7720SXuan Hu
1507f2b7720SXuan Hu  object VlduType {
15157a10886SXuan Hu    def dummy = 0.U
1527f2b7720SXuan Hu  }
1537f2b7720SXuan Hu
1547f2b7720SXuan Hu  object VstuType {
15557a10886SXuan Hu    def dummy = 0.U
1567f2b7720SXuan Hu  }
1577f2b7720SXuan Hu
158a3edac52SYinan Xu  object CommitType {
159c3abb8b6SYinan Xu    def NORMAL = "b000".U  // int/fp
160c3abb8b6SYinan Xu    def BRANCH = "b001".U  // branch
161c3abb8b6SYinan Xu    def LOAD   = "b010".U  // load
162c3abb8b6SYinan Xu    def STORE  = "b011".U  // store
163518d8658SYinan Xu
164c3abb8b6SYinan Xu    def apply() = UInt(3.W)
165c3abb8b6SYinan Xu    def isFused(commitType: UInt): Bool = commitType(2)
166c3abb8b6SYinan Xu    def isLoadStore(commitType: UInt): Bool = !isFused(commitType) && commitType(1)
167c3abb8b6SYinan Xu    def lsInstIsStore(commitType: UInt): Bool = commitType(0)
168c3abb8b6SYinan Xu    def isStore(commitType: UInt): Bool = isLoadStore(commitType) && lsInstIsStore(commitType)
169c3abb8b6SYinan Xu    def isBranch(commitType: UInt): Bool = commitType(0) && !commitType(1) && !isFused(commitType)
170518d8658SYinan Xu  }
171bfb958a3SYinan Xu
172bfb958a3SYinan Xu  object RedirectLevel {
1732d7c7105SYinan Xu    def flushAfter = "b0".U
1742d7c7105SYinan Xu    def flush      = "b1".U
175bfb958a3SYinan Xu
1762d7c7105SYinan Xu    def apply() = UInt(1.W)
1772d7c7105SYinan Xu    // def isUnconditional(level: UInt) = level(1)
178bfb958a3SYinan Xu    def flushItself(level: UInt) = level(0)
1792d7c7105SYinan Xu    // def isException(level: UInt) = level(1) && level(0)
180bfb958a3SYinan Xu  }
181baf8def6SYinan Xu
182baf8def6SYinan Xu  object ExceptionVec {
183baf8def6SYinan Xu    def apply() = Vec(16, Bool())
184baf8def6SYinan Xu  }
185a8e04b1dSYinan Xu
186c60c1ab4SWilliam Wang  object PMAMode {
1878d9a04fcSWilliam Wang    def R = "b1".U << 0 //readable
1888d9a04fcSWilliam Wang    def W = "b1".U << 1 //writeable
1898d9a04fcSWilliam Wang    def X = "b1".U << 2 //executable
1908d9a04fcSWilliam Wang    def I = "b1".U << 3 //cacheable: icache
1918d9a04fcSWilliam Wang    def D = "b1".U << 4 //cacheable: dcache
1928d9a04fcSWilliam Wang    def S = "b1".U << 5 //enable speculative access
193cff68e26SWilliam Wang    def A = "b1".U << 6 //enable atomic operation, A imply R & W
1948d9a04fcSWilliam Wang    def C = "b1".U << 7 //if it is cacheable is configable
195c60c1ab4SWilliam Wang    def Reserved = "b0".U
196c60c1ab4SWilliam Wang
197c60c1ab4SWilliam Wang    def apply() = UInt(7.W)
198c60c1ab4SWilliam Wang
199c60c1ab4SWilliam Wang    def read(mode: UInt) = mode(0)
200c60c1ab4SWilliam Wang    def write(mode: UInt) = mode(1)
201c60c1ab4SWilliam Wang    def execute(mode: UInt) = mode(2)
202c60c1ab4SWilliam Wang    def icache(mode: UInt) = mode(3)
203c60c1ab4SWilliam Wang    def dcache(mode: UInt) = mode(4)
204c60c1ab4SWilliam Wang    def speculate(mode: UInt) = mode(5)
205c60c1ab4SWilliam Wang    def atomic(mode: UInt) = mode(6)
206c60c1ab4SWilliam Wang    def configable_cache(mode: UInt) = mode(7)
207c60c1ab4SWilliam Wang
208c60c1ab4SWilliam Wang    def strToMode(s: String) = {
209423b9255SWilliam Wang      var result = 0.U(8.W)
210c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("R") >= 0) result = result + R
211c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("W") >= 0) result = result + W
212c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("X") >= 0) result = result + X
213c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("I") >= 0) result = result + I
214c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("D") >= 0) result = result + D
215c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("S") >= 0) result = result + S
216c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("A") >= 0) result = result + A
217c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("C") >= 0) result = result + C
218c60c1ab4SWilliam Wang      result
219c60c1ab4SWilliam Wang    }
220c60c1ab4SWilliam Wang  }
2212225d46eSJiawei Lin
2222225d46eSJiawei Lin
2232225d46eSJiawei Lin  object CSROpType {
2242225d46eSJiawei Lin    def jmp  = "b000".U
2252225d46eSJiawei Lin    def wrt  = "b001".U
2262225d46eSJiawei Lin    def set  = "b010".U
2272225d46eSJiawei Lin    def clr  = "b011".U
228b6900d94SYinan Xu    def wfi  = "b100".U
2292225d46eSJiawei Lin    def wrti = "b101".U
2302225d46eSJiawei Lin    def seti = "b110".U
2312225d46eSJiawei Lin    def clri = "b111".U
2325d669833SYinan Xu    def needAccess(op: UInt): Bool = op(1, 0) =/= 0.U
2332225d46eSJiawei Lin  }
2342225d46eSJiawei Lin
2352225d46eSJiawei Lin  // jump
2362225d46eSJiawei Lin  object JumpOpType {
2372225d46eSJiawei Lin    def jal  = "b00".U
2382225d46eSJiawei Lin    def jalr = "b01".U
2392225d46eSJiawei Lin    def auipc = "b10".U
2402225d46eSJiawei Lin//    def call = "b11_011".U
2412225d46eSJiawei Lin//    def ret  = "b11_100".U
2422225d46eSJiawei Lin    def jumpOpisJalr(op: UInt) = op(0)
2432225d46eSJiawei Lin    def jumpOpisAuipc(op: UInt) = op(1)
2442225d46eSJiawei Lin  }
2452225d46eSJiawei Lin
2462225d46eSJiawei Lin  object FenceOpType {
2472225d46eSJiawei Lin    def fence  = "b10000".U
2482225d46eSJiawei Lin    def sfence = "b10001".U
2492225d46eSJiawei Lin    def fencei = "b10010".U
250af2f7849Shappy-lx    def nofence= "b00000".U
2512225d46eSJiawei Lin  }
2522225d46eSJiawei Lin
2532225d46eSJiawei Lin  object ALUOpType {
254ee8ff153Szfw    // shift optype
255675acc68SYinan Xu    def slliuw     = "b000_0000".U // slliuw: ZEXT(src1[31:0]) << shamt
256675acc68SYinan Xu    def sll        = "b000_0001".U // sll:     src1 << src2
257ee8ff153Szfw
258675acc68SYinan Xu    def bclr       = "b000_0010".U // bclr:    src1 & ~(1 << src2[5:0])
259675acc68SYinan Xu    def bset       = "b000_0011".U // bset:    src1 | (1 << src2[5:0])
260675acc68SYinan Xu    def binv       = "b000_0100".U // binv:    src1 ^ ~(1 << src2[5:0])
261ee8ff153Szfw
262675acc68SYinan Xu    def srl        = "b000_0101".U // srl:     src1 >> src2
263675acc68SYinan Xu    def bext       = "b000_0110".U // bext:    (src1 >> src2)[0]
264675acc68SYinan Xu    def sra        = "b000_0111".U // sra:     src1 >> src2 (arithmetic)
265ee8ff153Szfw
2667b441e5eSYinan Xu    def rol        = "b000_1001".U // rol:     (src1 << src2) | (src1 >> (xlen - src2))
2677b441e5eSYinan Xu    def ror        = "b000_1011".U // ror:     (src1 >> src2) | (src1 << (xlen - src2))
268184a1958Szfw
269ee8ff153Szfw    // RV64 32bit optype
270675acc68SYinan Xu    def addw       = "b001_0000".U // addw:      SEXT((src1 + src2)[31:0])
271675acc68SYinan Xu    def oddaddw    = "b001_0001".U // oddaddw:   SEXT((src1[0] + src2)[31:0])
272675acc68SYinan Xu    def subw       = "b001_0010".U // subw:      SEXT((src1 - src2)[31:0])
273ee8ff153Szfw
274675acc68SYinan Xu    def addwbit    = "b001_0100".U // addwbit:   (src1 + src2)[0]
275675acc68SYinan Xu    def addwbyte   = "b001_0101".U // addwbyte:  (src1 + src2)[7:0]
276675acc68SYinan Xu    def addwzexth  = "b001_0110".U // addwzexth: ZEXT((src1  + src2)[15:0])
277675acc68SYinan Xu    def addwsexth  = "b001_0111".U // addwsexth: SEXT((src1  + src2)[15:0])
278ee8ff153Szfw
279675acc68SYinan Xu    def sllw       = "b001_1000".U // sllw:     SEXT((src1 << src2)[31:0])
280675acc68SYinan Xu    def srlw       = "b001_1001".U // srlw:     SEXT((src1[31:0] >> src2)[31:0])
281675acc68SYinan Xu    def sraw       = "b001_1010".U // sraw:     SEXT((src1[31:0] >> src2)[31:0])
282675acc68SYinan Xu    def rolw       = "b001_1100".U
283675acc68SYinan Xu    def rorw       = "b001_1101".U
284675acc68SYinan Xu
285675acc68SYinan Xu    // ADD-op
286675acc68SYinan Xu    def adduw      = "b010_0000".U // adduw:  src1[31:0]  + src2
287675acc68SYinan Xu    def add        = "b010_0001".U // add:     src1        + src2
288675acc68SYinan Xu    def oddadd     = "b010_0010".U // oddadd:  src1[0]     + src2
289675acc68SYinan Xu
290675acc68SYinan Xu    def sr29add    = "b010_0100".U // sr29add: src1[63:29] + src2
291675acc68SYinan Xu    def sr30add    = "b010_0101".U // sr30add: src1[63:30] + src2
292675acc68SYinan Xu    def sr31add    = "b010_0110".U // sr31add: src1[63:31] + src2
293675acc68SYinan Xu    def sr32add    = "b010_0111".U // sr32add: src1[63:32] + src2
294675acc68SYinan Xu
295675acc68SYinan Xu    def sh1adduw   = "b010_1000".U // sh1adduw: {src1[31:0], 1'b0} + src2
296675acc68SYinan Xu    def sh1add     = "b010_1001".U // sh1add: {src1[62:0], 1'b0} + src2
297675acc68SYinan Xu    def sh2adduw   = "b010_1010".U // sh2add_uw: {src1[31:0], 2'b0} + src2
298675acc68SYinan Xu    def sh2add     = "b010_1011".U // sh2add: {src1[61:0], 2'b0} + src2
299675acc68SYinan Xu    def sh3adduw   = "b010_1100".U // sh3add_uw: {src1[31:0], 3'b0} + src2
300675acc68SYinan Xu    def sh3add     = "b010_1101".U // sh3add: {src1[60:0], 3'b0} + src2
301675acc68SYinan Xu    def sh4add     = "b010_1111".U // sh4add: {src1[59:0], 4'b0} + src2
302675acc68SYinan Xu
303675acc68SYinan Xu    // SUB-op: src1 - src2
304675acc68SYinan Xu    def sub        = "b011_0000".U
305675acc68SYinan Xu    def sltu       = "b011_0001".U
306675acc68SYinan Xu    def slt        = "b011_0010".U
307675acc68SYinan Xu    def maxu       = "b011_0100".U
308675acc68SYinan Xu    def minu       = "b011_0101".U
309675acc68SYinan Xu    def max        = "b011_0110".U
310675acc68SYinan Xu    def min        = "b011_0111".U
311675acc68SYinan Xu
312675acc68SYinan Xu    // branch
313675acc68SYinan Xu    def beq        = "b111_0000".U
314675acc68SYinan Xu    def bne        = "b111_0010".U
315675acc68SYinan Xu    def blt        = "b111_1000".U
316675acc68SYinan Xu    def bge        = "b111_1010".U
317675acc68SYinan Xu    def bltu       = "b111_1100".U
318675acc68SYinan Xu    def bgeu       = "b111_1110".U
319675acc68SYinan Xu
320675acc68SYinan Xu    // misc optype
321675acc68SYinan Xu    def and        = "b100_0000".U
322675acc68SYinan Xu    def andn       = "b100_0001".U
323675acc68SYinan Xu    def or         = "b100_0010".U
324675acc68SYinan Xu    def orn        = "b100_0011".U
325675acc68SYinan Xu    def xor        = "b100_0100".U
326675acc68SYinan Xu    def xnor       = "b100_0101".U
327675acc68SYinan Xu    def orcb       = "b100_0110".U
328675acc68SYinan Xu
329675acc68SYinan Xu    def sextb      = "b100_1000".U
330675acc68SYinan Xu    def packh      = "b100_1001".U
331675acc68SYinan Xu    def sexth      = "b100_1010".U
332675acc68SYinan Xu    def packw      = "b100_1011".U
333675acc68SYinan Xu
334675acc68SYinan Xu    def revb       = "b101_0000".U
335675acc68SYinan Xu    def rev8       = "b101_0001".U
336675acc68SYinan Xu    def pack       = "b101_0010".U
337675acc68SYinan Xu    def orh48      = "b101_0011".U
338675acc68SYinan Xu
339675acc68SYinan Xu    def szewl1     = "b101_1000".U
340675acc68SYinan Xu    def szewl2     = "b101_1001".U
341675acc68SYinan Xu    def szewl3     = "b101_1010".U
342675acc68SYinan Xu    def byte2      = "b101_1011".U
343675acc68SYinan Xu
344675acc68SYinan Xu    def andlsb     = "b110_0000".U
345675acc68SYinan Xu    def andzexth   = "b110_0001".U
346675acc68SYinan Xu    def orlsb      = "b110_0010".U
347675acc68SYinan Xu    def orzexth    = "b110_0011".U
348675acc68SYinan Xu    def xorlsb     = "b110_0100".U
349675acc68SYinan Xu    def xorzexth   = "b110_0101".U
350675acc68SYinan Xu    def orcblsb    = "b110_0110".U
351675acc68SYinan Xu    def orcbzexth  = "b110_0111".U
3524aa9ed34Sfdy    def vsetvli1    = "b1000_0000".U
3534aa9ed34Sfdy    def vsetvli2    = "b1000_0100".U
3544aa9ed34Sfdy    def vsetvl1     = "b1000_0001".U
3554aa9ed34Sfdy    def vsetvl2     = "b1000_0101".U
3564aa9ed34Sfdy    def vsetivli1   = "b1000_0010".U
3574aa9ed34Sfdy    def vsetivli2   = "b1000_0110".U
358675acc68SYinan Xu
359675acc68SYinan Xu    def isAddw(func: UInt) = func(6, 4) === "b001".U && !func(3) && !func(1)
360675acc68SYinan Xu    def isSimpleLogic(func: UInt) = func(6, 4) === "b100".U && !func(0)
361675acc68SYinan Xu    def logicToLsb(func: UInt) = Cat("b110".U(3.W), func(3, 1), 0.U(1.W))
362675acc68SYinan Xu    def logicToZexth(func: UInt) = Cat("b110".U(3.W), func(3, 1), 1.U(1.W))
3634aa9ed34Sfdy    def isVset(func: UInt) = func(7, 3) === "b1000_0".U
3644aa9ed34Sfdy    def isVsetvl(func: UInt) = isVset(func) && func(0)
3654aa9ed34Sfdy    def isVsetvli(func: UInt) = isVset(func) && !func(1, 0).orR
3664aa9ed34Sfdy    def vsetExchange(func: UInt) = Cat(func(7, 3), "b1".U, func(1, 0))
367675acc68SYinan Xu
36857a10886SXuan Hu    def apply() = UInt(FuOpTypeWidth.W)
3692225d46eSJiawei Lin  }
3702225d46eSJiawei Lin
3713b739f49SXuan Hu  object BRUOpType {
3723b739f49SXuan Hu    // branch
3733b739f49SXuan Hu    def beq        = "b000_000".U
3743b739f49SXuan Hu    def bne        = "b000_001".U
3753b739f49SXuan Hu    def blt        = "b000_100".U
3763b739f49SXuan Hu    def bge        = "b000_101".U
3773b739f49SXuan Hu    def bltu       = "b001_000".U
3783b739f49SXuan Hu    def bgeu       = "b001_001".U
3793b739f49SXuan Hu
3803b739f49SXuan Hu    def getBranchType(func: UInt) = func(3, 1)
3813b739f49SXuan Hu    def isBranchInvert(func: UInt) = func(0)
3823b739f49SXuan Hu  }
3833b739f49SXuan Hu
3843b739f49SXuan Hu  object MULOpType {
3853b739f49SXuan Hu    // mul
3863b739f49SXuan Hu    // bit encoding: | type (2bit) | isWord(1bit) | opcode(2bit) |
3873b739f49SXuan Hu    def mul    = "b00000".U
3883b739f49SXuan Hu    def mulh   = "b00001".U
3893b739f49SXuan Hu    def mulhsu = "b00010".U
3903b739f49SXuan Hu    def mulhu  = "b00011".U
3913b739f49SXuan Hu    def mulw   = "b00100".U
3923b739f49SXuan Hu
3933b739f49SXuan Hu    def mulw7  = "b01100".U
3943b739f49SXuan Hu    def isSign(op: UInt) = !op(1)
3953b739f49SXuan Hu    def isW(op: UInt) = op(2)
3963b739f49SXuan Hu    def isH(op: UInt) = op(1, 0) =/= 0.U
3973b739f49SXuan Hu    def getOp(op: UInt) = Cat(op(3), op(1, 0))
3983b739f49SXuan Hu  }
3993b739f49SXuan Hu
4003b739f49SXuan Hu  object DIVOpType {
4013b739f49SXuan Hu    // div
4023b739f49SXuan Hu    // bit encoding: | type (2bit) | isWord(1bit) | isSign(1bit) | opcode(1bit) |
4033b739f49SXuan Hu    def div    = "b10000".U
4043b739f49SXuan Hu    def divu   = "b10010".U
4053b739f49SXuan Hu    def rem    = "b10001".U
4063b739f49SXuan Hu    def remu   = "b10011".U
4073b739f49SXuan Hu
4083b739f49SXuan Hu    def divw   = "b10100".U
4093b739f49SXuan Hu    def divuw  = "b10110".U
4103b739f49SXuan Hu    def remw   = "b10101".U
4113b739f49SXuan Hu    def remuw  = "b10111".U
4123b739f49SXuan Hu
4133b739f49SXuan Hu    def isSign(op: UInt) = !op(1)
4143b739f49SXuan Hu    def isW(op: UInt) = op(2)
4153b739f49SXuan Hu    def isH(op: UInt) = op(0)
4163b739f49SXuan Hu  }
4173b739f49SXuan Hu
4182225d46eSJiawei Lin  object MDUOpType {
4192225d46eSJiawei Lin    // mul
4202225d46eSJiawei Lin    // bit encoding: | type (2bit) | isWord(1bit) | opcode(2bit) |
4212225d46eSJiawei Lin    def mul    = "b00000".U
4222225d46eSJiawei Lin    def mulh   = "b00001".U
4232225d46eSJiawei Lin    def mulhsu = "b00010".U
4242225d46eSJiawei Lin    def mulhu  = "b00011".U
4252225d46eSJiawei Lin    def mulw   = "b00100".U
4262225d46eSJiawei Lin
42788825c5cSYinan Xu    def mulw7  = "b01100".U
42888825c5cSYinan Xu
4292225d46eSJiawei Lin    // div
4302225d46eSJiawei Lin    // bit encoding: | type (2bit) | isWord(1bit) | isSign(1bit) | opcode(1bit) |
43188825c5cSYinan Xu    def div    = "b10000".U
43288825c5cSYinan Xu    def divu   = "b10010".U
43388825c5cSYinan Xu    def rem    = "b10001".U
43488825c5cSYinan Xu    def remu   = "b10011".U
4352225d46eSJiawei Lin
43688825c5cSYinan Xu    def divw   = "b10100".U
43788825c5cSYinan Xu    def divuw  = "b10110".U
43888825c5cSYinan Xu    def remw   = "b10101".U
43988825c5cSYinan Xu    def remuw  = "b10111".U
4402225d46eSJiawei Lin
44188825c5cSYinan Xu    def isMul(op: UInt) = !op(4)
44288825c5cSYinan Xu    def isDiv(op: UInt) = op(4)
4432225d46eSJiawei Lin
4442225d46eSJiawei Lin    def isDivSign(op: UInt) = isDiv(op) && !op(1)
4452225d46eSJiawei Lin    def isW(op: UInt) = op(2)
4462225d46eSJiawei Lin    def isH(op: UInt) = (isDiv(op) && op(0)) || (isMul(op) && op(1, 0) =/= 0.U)
4472225d46eSJiawei Lin    def getMulOp(op: UInt) = op(1, 0)
4482225d46eSJiawei Lin  }
4492225d46eSJiawei Lin
4502225d46eSJiawei Lin  object LSUOpType {
451d200f594SWilliam Wang    // load pipeline
4522225d46eSJiawei Lin
453d200f594SWilliam Wang    // normal load
454d200f594SWilliam Wang    // Note: bit(1, 0) are size, DO NOT CHANGE
455d200f594SWilliam Wang    // bit encoding: | load 0 | is unsigned(1bit) | size(2bit) |
456d200f594SWilliam Wang    def lb       = "b0000".U
457d200f594SWilliam Wang    def lh       = "b0001".U
458d200f594SWilliam Wang    def lw       = "b0010".U
459d200f594SWilliam Wang    def ld       = "b0011".U
460d200f594SWilliam Wang    def lbu      = "b0100".U
461d200f594SWilliam Wang    def lhu      = "b0101".U
462d200f594SWilliam Wang    def lwu      = "b0110".U
463ca18a0b4SWilliam Wang
464d200f594SWilliam Wang    // Zicbop software prefetch
465d200f594SWilliam Wang    // bit encoding: | prefetch 1 | 0 | prefetch type (2bit) |
466d200f594SWilliam Wang    def prefetch_i = "b1000".U // TODO
467d200f594SWilliam Wang    def prefetch_r = "b1001".U
468d200f594SWilliam Wang    def prefetch_w = "b1010".U
469ca18a0b4SWilliam Wang
470d200f594SWilliam Wang    def isPrefetch(op: UInt): Bool = op(3)
471d200f594SWilliam Wang
472d200f594SWilliam Wang    // store pipeline
473d200f594SWilliam Wang    // normal store
474d200f594SWilliam Wang    // bit encoding: | store 00 | size(2bit) |
475d200f594SWilliam Wang    def sb       = "b0000".U
476d200f594SWilliam Wang    def sh       = "b0001".U
477d200f594SWilliam Wang    def sw       = "b0010".U
478d200f594SWilliam Wang    def sd       = "b0011".U
479d200f594SWilliam Wang
480d200f594SWilliam Wang    // l1 cache op
481d200f594SWilliam Wang    // bit encoding: | cbo_zero 01 | size(2bit) 11 |
482d200f594SWilliam Wang    def cbo_zero  = "b0111".U
483d200f594SWilliam Wang
484d200f594SWilliam Wang    // llc op
485d200f594SWilliam Wang    // bit encoding: | prefetch 11 | suboptype(2bit) |
486d200f594SWilliam Wang    def cbo_clean = "b1100".U
487d200f594SWilliam Wang    def cbo_flush = "b1101".U
488d200f594SWilliam Wang    def cbo_inval = "b1110".U
489d200f594SWilliam Wang
490d200f594SWilliam Wang    def isCbo(op: UInt): Bool = op(3, 2) === "b11".U
4912225d46eSJiawei Lin
4922225d46eSJiawei Lin    // atomics
4932225d46eSJiawei Lin    // bit(1, 0) are size
4942225d46eSJiawei Lin    // since atomics use a different fu type
4952225d46eSJiawei Lin    // so we can safely reuse other load/store's encodings
496d200f594SWilliam Wang    // bit encoding: | optype(4bit) | size (2bit) |
4972225d46eSJiawei Lin    def lr_w      = "b000010".U
4982225d46eSJiawei Lin    def sc_w      = "b000110".U
4992225d46eSJiawei Lin    def amoswap_w = "b001010".U
5002225d46eSJiawei Lin    def amoadd_w  = "b001110".U
5012225d46eSJiawei Lin    def amoxor_w  = "b010010".U
5022225d46eSJiawei Lin    def amoand_w  = "b010110".U
5032225d46eSJiawei Lin    def amoor_w   = "b011010".U
5042225d46eSJiawei Lin    def amomin_w  = "b011110".U
5052225d46eSJiawei Lin    def amomax_w  = "b100010".U
5062225d46eSJiawei Lin    def amominu_w = "b100110".U
5072225d46eSJiawei Lin    def amomaxu_w = "b101010".U
5082225d46eSJiawei Lin
5092225d46eSJiawei Lin    def lr_d      = "b000011".U
5102225d46eSJiawei Lin    def sc_d      = "b000111".U
5112225d46eSJiawei Lin    def amoswap_d = "b001011".U
5122225d46eSJiawei Lin    def amoadd_d  = "b001111".U
5132225d46eSJiawei Lin    def amoxor_d  = "b010011".U
5142225d46eSJiawei Lin    def amoand_d  = "b010111".U
5152225d46eSJiawei Lin    def amoor_d   = "b011011".U
5162225d46eSJiawei Lin    def amomin_d  = "b011111".U
5172225d46eSJiawei Lin    def amomax_d  = "b100011".U
5182225d46eSJiawei Lin    def amominu_d = "b100111".U
5192225d46eSJiawei Lin    def amomaxu_d = "b101011".U
520b6982e83SLemover
521b6982e83SLemover    def size(op: UInt) = op(1,0)
5222225d46eSJiawei Lin  }
5232225d46eSJiawei Lin
5243feeca58Szfw  object BKUOpType {
525ee8ff153Szfw
5263feeca58Szfw    def clmul       = "b000000".U
5273feeca58Szfw    def clmulh      = "b000001".U
5283feeca58Szfw    def clmulr      = "b000010".U
5293feeca58Szfw    def xpermn      = "b000100".U
5303feeca58Szfw    def xpermb      = "b000101".U
531ee8ff153Szfw
5323feeca58Szfw    def clz         = "b001000".U
5333feeca58Szfw    def clzw        = "b001001".U
5343feeca58Szfw    def ctz         = "b001010".U
5353feeca58Szfw    def ctzw        = "b001011".U
5363feeca58Szfw    def cpop        = "b001100".U
5373feeca58Szfw    def cpopw       = "b001101".U
53807596dc6Szfw
5393feeca58Szfw    // 01xxxx is reserve
5403feeca58Szfw    def aes64es     = "b100000".U
5413feeca58Szfw    def aes64esm    = "b100001".U
5423feeca58Szfw    def aes64ds     = "b100010".U
5433feeca58Szfw    def aes64dsm    = "b100011".U
5443feeca58Szfw    def aes64im     = "b100100".U
5453feeca58Szfw    def aes64ks1i   = "b100101".U
5463feeca58Szfw    def aes64ks2    = "b100110".U
5473feeca58Szfw
5483feeca58Szfw    // merge to two instruction sm4ks & sm4ed
54919bcce38SFawang Zhang    def sm4ed0      = "b101000".U
55019bcce38SFawang Zhang    def sm4ed1      = "b101001".U
55119bcce38SFawang Zhang    def sm4ed2      = "b101010".U
55219bcce38SFawang Zhang    def sm4ed3      = "b101011".U
55319bcce38SFawang Zhang    def sm4ks0      = "b101100".U
55419bcce38SFawang Zhang    def sm4ks1      = "b101101".U
55519bcce38SFawang Zhang    def sm4ks2      = "b101110".U
55619bcce38SFawang Zhang    def sm4ks3      = "b101111".U
5573feeca58Szfw
5583feeca58Szfw    def sha256sum0  = "b110000".U
5593feeca58Szfw    def sha256sum1  = "b110001".U
5603feeca58Szfw    def sha256sig0  = "b110010".U
5613feeca58Szfw    def sha256sig1  = "b110011".U
5623feeca58Szfw    def sha512sum0  = "b110100".U
5633feeca58Szfw    def sha512sum1  = "b110101".U
5643feeca58Szfw    def sha512sig0  = "b110110".U
5653feeca58Szfw    def sha512sig1  = "b110111".U
5663feeca58Szfw
5673feeca58Szfw    def sm3p0       = "b111000".U
5683feeca58Szfw    def sm3p1       = "b111001".U
569ee8ff153Szfw  }
570ee8ff153Szfw
5712225d46eSJiawei Lin  object BTBtype {
5722225d46eSJiawei Lin    def B = "b00".U  // branch
5732225d46eSJiawei Lin    def J = "b01".U  // jump
5742225d46eSJiawei Lin    def I = "b10".U  // indirect
5752225d46eSJiawei Lin    def R = "b11".U  // return
5762225d46eSJiawei Lin
5772225d46eSJiawei Lin    def apply() = UInt(2.W)
5782225d46eSJiawei Lin  }
5792225d46eSJiawei Lin
5802225d46eSJiawei Lin  object SelImm {
581ee8ff153Szfw    def IMM_X  = "b0111".U
582ee8ff153Szfw    def IMM_S  = "b0000".U
583ee8ff153Szfw    def IMM_SB = "b0001".U
584ee8ff153Szfw    def IMM_U  = "b0010".U
585ee8ff153Szfw    def IMM_UJ = "b0011".U
586ee8ff153Szfw    def IMM_I  = "b0100".U
587ee8ff153Szfw    def IMM_Z  = "b0101".U
588ee8ff153Szfw    def INVALID_INSTR = "b0110".U
589ee8ff153Szfw    def IMM_B6 = "b1000".U
5902225d46eSJiawei Lin
59158c35d23Shuxuan0307    def IMM_OPIVIS = "b1001".U
59258c35d23Shuxuan0307    def IMM_OPIVIU = "b1010".U
593912e2179SXuan Hu    def IMM_VSETVLI   = "b1100".U
594912e2179SXuan Hu    def IMM_VSETIVLI  = "b1101".U
59558c35d23Shuxuan0307
59657a10886SXuan Hu    def X      = BitPat("b0000")
5976e7c9679Shuxuan0307
598ee8ff153Szfw    def apply() = UInt(4.W)
5992225d46eSJiawei Lin  }
6002225d46eSJiawei Lin
6016ab6918fSYinan Xu  object ExceptionNO {
6026ab6918fSYinan Xu    def instrAddrMisaligned = 0
6036ab6918fSYinan Xu    def instrAccessFault    = 1
6046ab6918fSYinan Xu    def illegalInstr        = 2
6056ab6918fSYinan Xu    def breakPoint          = 3
6066ab6918fSYinan Xu    def loadAddrMisaligned  = 4
6076ab6918fSYinan Xu    def loadAccessFault     = 5
6086ab6918fSYinan Xu    def storeAddrMisaligned = 6
6096ab6918fSYinan Xu    def storeAccessFault    = 7
6106ab6918fSYinan Xu    def ecallU              = 8
6116ab6918fSYinan Xu    def ecallS              = 9
6126ab6918fSYinan Xu    def ecallM              = 11
6136ab6918fSYinan Xu    def instrPageFault      = 12
6146ab6918fSYinan Xu    def loadPageFault       = 13
6156ab6918fSYinan Xu    // def singleStep          = 14
6166ab6918fSYinan Xu    def storePageFault      = 15
6176ab6918fSYinan Xu    def priorities = Seq(
6186ab6918fSYinan Xu      breakPoint, // TODO: different BP has different priority
6196ab6918fSYinan Xu      instrPageFault,
6206ab6918fSYinan Xu      instrAccessFault,
6216ab6918fSYinan Xu      illegalInstr,
6226ab6918fSYinan Xu      instrAddrMisaligned,
6236ab6918fSYinan Xu      ecallM, ecallS, ecallU,
624d880177dSYinan Xu      storeAddrMisaligned,
625d880177dSYinan Xu      loadAddrMisaligned,
6266ab6918fSYinan Xu      storePageFault,
6276ab6918fSYinan Xu      loadPageFault,
6286ab6918fSYinan Xu      storeAccessFault,
629d880177dSYinan Xu      loadAccessFault
6306ab6918fSYinan Xu    )
6316ab6918fSYinan Xu    def all = priorities.distinct.sorted
6326ab6918fSYinan Xu    def frontendSet = Seq(
6336ab6918fSYinan Xu      instrAddrMisaligned,
6346ab6918fSYinan Xu      instrAccessFault,
6356ab6918fSYinan Xu      illegalInstr,
6366ab6918fSYinan Xu      instrPageFault
6376ab6918fSYinan Xu    )
6386ab6918fSYinan Xu    def partialSelect(vec: Vec[Bool], select: Seq[Int]): Vec[Bool] = {
6396ab6918fSYinan Xu      val new_vec = Wire(ExceptionVec())
6406ab6918fSYinan Xu      new_vec.foreach(_ := false.B)
6416ab6918fSYinan Xu      select.foreach(i => new_vec(i) := vec(i))
6426ab6918fSYinan Xu      new_vec
6436ab6918fSYinan Xu    }
6446ab6918fSYinan Xu    def selectFrontend(vec: Vec[Bool]): Vec[Bool] = partialSelect(vec, frontendSet)
6456ab6918fSYinan Xu    def selectAll(vec: Vec[Bool]): Vec[Bool] = partialSelect(vec, ExceptionNO.all)
6466ab6918fSYinan Xu    def selectByFu(vec:Vec[Bool], fuConfig: FuConfig): Vec[Bool] =
6476ab6918fSYinan Xu      partialSelect(vec, fuConfig.exceptionOut)
6483b739f49SXuan Hu//    def selectByExu(vec:Vec[Bool], exuConfig: ExuConfig): Vec[Bool] =
6493b739f49SXuan Hu//      partialSelect(vec, exuConfig.exceptionOut)
6503b739f49SXuan Hu//    def selectByExu(vec:Vec[Bool], exuConfigs: Seq[ExuConfig]): Vec[Bool] =
6513b739f49SXuan Hu//      partialSelect(vec, exuConfigs.map(_.exceptionOut).reduce(_ ++ _).distinct.sorted)
6526ab6918fSYinan Xu  }
6536ab6918fSYinan Xu
6543b739f49SXuan Hu//  def dividerGen(p: Parameters) = new DividerWrapper(p(XLen))(p)
6553b739f49SXuan Hu//  def multiplierGen(p: Parameters) = new ArrayMultiplier(p(XLen) + 1)(p)
6563b739f49SXuan Hu//  def aluGen(p: Parameters) = new Alu()(p)
6573b739f49SXuan Hu//  def bkuGen(p: Parameters) = new Bku()(p)
6583b739f49SXuan Hu//  def jmpGen(p: Parameters) = new Jump()(p)
6593b739f49SXuan Hu//  def fenceGen(p: Parameters) = new Fence()(p)
6603b739f49SXuan Hu//  def csrGen(p: Parameters) = new CSR()(p)
6613b739f49SXuan Hu//  def i2fGen(p: Parameters) = new IntToFP()(p)
6623b739f49SXuan Hu//  def fmacGen(p: Parameters) = new FMA()(p)
6633b739f49SXuan Hu//  def f2iGen(p: Parameters) = new FPToInt()(p)
6643b739f49SXuan Hu//  def f2fGen(p: Parameters) = new FPToFP()(p)
6653b739f49SXuan Hu//  def fdivSqrtGen(p: Parameters) = new FDivSqrt()(p)
6663b739f49SXuan Hu//  def stdGen(p: Parameters) = new Std()(p)
6673b739f49SXuan Hu//  def mouDataGen(p: Parameters) = new Std()(p)
6683b739f49SXuan Hu//  def vipuGen(p: Parameters) = new VIPU()(p)
6693b739f49SXuan Hu//
6703b739f49SXuan Hu//  def f2iSel(uop: MicroOp): Bool = {
6713b739f49SXuan Hu//    uop.ctrl.rfWen
6723b739f49SXuan Hu//  }
6733b739f49SXuan Hu//
6743b739f49SXuan Hu//  def i2fSel(uop: MicroOp): Bool = {
6753b739f49SXuan Hu//    uop.ctrl.fpu.fromInt
6763b739f49SXuan Hu//  }
6773b739f49SXuan Hu//
6783b739f49SXuan Hu//  def f2fSel(uop: MicroOp): Bool = {
6793b739f49SXuan Hu//    val ctrl = uop.ctrl.fpu
6803b739f49SXuan Hu//    ctrl.fpWen && !ctrl.div && !ctrl.sqrt
6813b739f49SXuan Hu//  }
6823b739f49SXuan Hu//
6833b739f49SXuan Hu//  def fdivSqrtSel(uop: MicroOp): Bool = {
6843b739f49SXuan Hu//    val ctrl = uop.ctrl.fpu
6853b739f49SXuan Hu//    ctrl.div || ctrl.sqrt
6863b739f49SXuan Hu//  }
6873b739f49SXuan Hu//
6883b739f49SXuan Hu//  val aluCfg = FuConfig(
6893b739f49SXuan Hu//    name = "alu",
6903b739f49SXuan Hu//    fuGen = aluGen,
6913b739f49SXuan Hu//    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.alu,
6923b739f49SXuan Hu//    fuType = FuType.alu,
6933b739f49SXuan Hu//    numIntSrc = 2,
6943b739f49SXuan Hu//    numFpSrc = 0,
6953b739f49SXuan Hu//    writeIntRf = true,
6963b739f49SXuan Hu//    writeFpRf = false,
6973b739f49SXuan Hu//    hasRedirect = true,
6983b739f49SXuan Hu//  )
6993b739f49SXuan Hu//
7003b739f49SXuan Hu//  val jmpCfg = FuConfig(
7013b739f49SXuan Hu//    name = "jmp",
7023b739f49SXuan Hu//    fuGen = jmpGen,
7033b739f49SXuan Hu//    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.jmp,
7043b739f49SXuan Hu//    fuType = FuType.jmp,
7053b739f49SXuan Hu//    numIntSrc = 1,
7063b739f49SXuan Hu//    numFpSrc = 0,
7073b739f49SXuan Hu//    writeIntRf = true,
7083b739f49SXuan Hu//    writeFpRf = false,
7093b739f49SXuan Hu//    hasRedirect = true,
7103b739f49SXuan Hu//  )
7113b739f49SXuan Hu//
7123b739f49SXuan Hu//  val fenceCfg = FuConfig(
7133b739f49SXuan Hu//    name = "fence",
7143b739f49SXuan Hu//    fuGen = fenceGen,
7153b739f49SXuan Hu//    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.fence,
7163b739f49SXuan Hu//    FuType.fence, 2, 0, writeIntRf = false, writeFpRf = false,
7173b739f49SXuan Hu//    latency = UncertainLatency(), exceptionOut = Seq(illegalInstr), // TODO: need rewrite latency structure, not just this value,
7183b739f49SXuan Hu//    flushPipe = true
7193b739f49SXuan Hu//  )
7203b739f49SXuan Hu//
7213b739f49SXuan Hu//  val csrCfg = FuConfig(
7223b739f49SXuan Hu//    name = "csr",
7233b739f49SXuan Hu//    fuGen = csrGen,
7243b739f49SXuan Hu//    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.csr,
7253b739f49SXuan Hu//    fuType = FuType.csr,
7263b739f49SXuan Hu//    numIntSrc = 1,
7273b739f49SXuan Hu//    numFpSrc = 0,
7283b739f49SXuan Hu//    writeIntRf = true,
7293b739f49SXuan Hu//    writeFpRf = false,
7303b739f49SXuan Hu//    exceptionOut = Seq(illegalInstr, breakPoint, ecallU, ecallS, ecallM),
7313b739f49SXuan Hu//    flushPipe = true
7323b739f49SXuan Hu//  )
7333b739f49SXuan Hu//
7343b739f49SXuan Hu//  val i2fCfg = FuConfig(
7353b739f49SXuan Hu//    name = "i2f",
7363b739f49SXuan Hu//    fuGen = i2fGen,
7373b739f49SXuan Hu//    fuSel = i2fSel,
7383b739f49SXuan Hu//    FuType.i2f,
7393b739f49SXuan Hu//    numIntSrc = 1,
7403b739f49SXuan Hu//    numFpSrc = 0,
7413b739f49SXuan Hu//    writeIntRf = false,
7423b739f49SXuan Hu//    writeFpRf = true,
7433b739f49SXuan Hu//    writeFflags = true,
7443b739f49SXuan Hu//    latency = CertainLatency(2),
7453b739f49SXuan Hu//    fastUopOut = true, fastImplemented = true
7463b739f49SXuan Hu//  )
7473b739f49SXuan Hu//
7483b739f49SXuan Hu//  val divCfg = FuConfig(
7493b739f49SXuan Hu//    name = "div",
7503b739f49SXuan Hu//    fuGen = dividerGen,
7513b739f49SXuan Hu//    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.div,
7523b739f49SXuan Hu//    FuType.div,
7533b739f49SXuan Hu//    2,
7543b739f49SXuan Hu//    0,
7553b739f49SXuan Hu//    writeIntRf = true,
7563b739f49SXuan Hu//    writeFpRf = false,
7573b739f49SXuan Hu//    latency = UncertainLatency(),
7583b739f49SXuan Hu//    fastUopOut = true,
7593b739f49SXuan Hu//    fastImplemented = true,
7603b739f49SXuan Hu//    hasInputBuffer = (true, 4, true)
7613b739f49SXuan Hu//  )
7623b739f49SXuan Hu//
7633b739f49SXuan Hu//  val mulCfg = FuConfig(
7643b739f49SXuan Hu//    name = "mul",
7653b739f49SXuan Hu//    fuGen = multiplierGen,
7663b739f49SXuan Hu//    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.mul,
7673b739f49SXuan Hu//    FuType.mul,
7683b739f49SXuan Hu//    2,
7693b739f49SXuan Hu//    0,
7703b739f49SXuan Hu//    writeIntRf = true,
7713b739f49SXuan Hu//    writeFpRf = false,
7723b739f49SXuan Hu//    latency = CertainLatency(2),
7733b739f49SXuan Hu//    fastUopOut = true,
7743b739f49SXuan Hu//    fastImplemented = true
7753b739f49SXuan Hu//  )
7763b739f49SXuan Hu//
7773b739f49SXuan Hu//  val bkuCfg = FuConfig(
7783b739f49SXuan Hu//    name = "bku",
7793b739f49SXuan Hu//    fuGen = bkuGen,
7803b739f49SXuan Hu//    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.bku,
7813b739f49SXuan Hu//    fuType = FuType.bku,
7823b739f49SXuan Hu//    numIntSrc = 2,
7833b739f49SXuan Hu//    numFpSrc = 0,
7843b739f49SXuan Hu//    writeIntRf = true,
7853b739f49SXuan Hu//    writeFpRf = false,
7863b739f49SXuan Hu//    latency = CertainLatency(1),
7873b739f49SXuan Hu//    fastUopOut = true,
7883b739f49SXuan Hu//    fastImplemented = true
7893b739f49SXuan Hu// )
7903b739f49SXuan Hu//
7913b739f49SXuan Hu//  val fmacCfg = FuConfig(
7923b739f49SXuan Hu//    name = "fmac",
7933b739f49SXuan Hu//    fuGen = fmacGen,
7943b739f49SXuan Hu//    fuSel = _ => true.B,
7953b739f49SXuan Hu//    FuType.fmac, 0, 3, writeIntRf = false, writeFpRf = true, writeFflags = true,
7963b739f49SXuan Hu//    latency = UncertainLatency(), fastUopOut = true, fastImplemented = true
7973b739f49SXuan Hu//  )
7983b739f49SXuan Hu//
7993b739f49SXuan Hu//  val f2iCfg = FuConfig(
8003b739f49SXuan Hu//    name = "f2i",
8013b739f49SXuan Hu//    fuGen = f2iGen,
8023b739f49SXuan Hu//    fuSel = f2iSel,
8033b739f49SXuan Hu//    FuType.fmisc, 0, 1, writeIntRf = true, writeFpRf = false, writeFflags = true, latency = CertainLatency(2),
8043b739f49SXuan Hu//    fastUopOut = true, fastImplemented = true
8053b739f49SXuan Hu//  )
8063b739f49SXuan Hu//
8073b739f49SXuan Hu//  val f2fCfg = FuConfig(
8083b739f49SXuan Hu//    name = "f2f",
8093b739f49SXuan Hu//    fuGen = f2fGen,
8103b739f49SXuan Hu//    fuSel = f2fSel,
8113b739f49SXuan Hu//    FuType.fmisc, 0, 1, writeIntRf = false, writeFpRf = true, writeFflags = true, latency = CertainLatency(2),
8123b739f49SXuan Hu//    fastUopOut = true, fastImplemented = true
8133b739f49SXuan Hu//  )
8143b739f49SXuan Hu//
8153b739f49SXuan Hu//  val fdivSqrtCfg = FuConfig(
8163b739f49SXuan Hu//    name = "fdivSqrt",
8173b739f49SXuan Hu//    fuGen = fdivSqrtGen,
8183b739f49SXuan Hu//    fuSel = fdivSqrtSel,
8193b739f49SXuan Hu//    FuType.fDivSqrt, 0, 2, writeIntRf = false, writeFpRf = true, writeFflags = true, latency = UncertainLatency(),
8203b739f49SXuan Hu//    fastUopOut = true, fastImplemented = true, hasInputBuffer = (true, 8, true)
8213b739f49SXuan Hu//  )
8223b739f49SXuan Hu//
8233b739f49SXuan Hu//  val lduCfg = FuConfig(
8243b739f49SXuan Hu//    "ldu",
8253b739f49SXuan Hu//    null, // DontCare
8263b739f49SXuan Hu//    (uop: MicroOp) => FuType.loadCanAccept(uop.ctrl.fuType),
8273b739f49SXuan Hu//    FuType.ldu, 1, 0, writeIntRf = true, writeFpRf = true,
8283b739f49SXuan Hu//    latency = UncertainLatency(),
8293b739f49SXuan Hu//    exceptionOut = Seq(loadAddrMisaligned, loadAccessFault, loadPageFault),
8303b739f49SXuan Hu//    flushPipe = true,
8313b739f49SXuan Hu//    replayInst = true,
8323b739f49SXuan Hu//    hasLoadError = true
8333b739f49SXuan Hu//  )
8343b739f49SXuan Hu//
8353b739f49SXuan Hu//  val staCfg = FuConfig(
8363b739f49SXuan Hu//    "sta",
8373b739f49SXuan Hu//    null,
8383b739f49SXuan Hu//    (uop: MicroOp) => FuType.storeCanAccept(uop.ctrl.fuType),
8393b739f49SXuan Hu//    FuType.stu, 1, 0, writeIntRf = false, writeFpRf = false,
8403b739f49SXuan Hu//    latency = UncertainLatency(),
8413b739f49SXuan Hu//    exceptionOut = Seq(storeAddrMisaligned, storeAccessFault, storePageFault)
8423b739f49SXuan Hu//  )
8433b739f49SXuan Hu//
8443b739f49SXuan Hu//  val stdCfg = FuConfig(
8453b739f49SXuan Hu//    "std",
8463b739f49SXuan Hu//    fuGen = stdGen, fuSel = (uop: MicroOp) => FuType.storeCanAccept(uop.ctrl.fuType), FuType.stu, 1, 1,
8473b739f49SXuan Hu//    writeIntRf = false, writeFpRf = false, latency = CertainLatency(1)
8483b739f49SXuan Hu//  )
8493b739f49SXuan Hu//
8503b739f49SXuan Hu//  val mouCfg = FuConfig(
8513b739f49SXuan Hu//    "mou",
8523b739f49SXuan Hu//    null,
8533b739f49SXuan Hu//    (uop: MicroOp) => FuType.storeCanAccept(uop.ctrl.fuType),
8543b739f49SXuan Hu//    FuType.mou, 1, 0, writeIntRf = false, writeFpRf = false,
8553b739f49SXuan Hu//    latency = UncertainLatency(), exceptionOut = lduCfg.exceptionOut ++ staCfg.exceptionOut
8563b739f49SXuan Hu//  )
8573b739f49SXuan Hu//
8583b739f49SXuan Hu//  val mouDataCfg = FuConfig(
8593b739f49SXuan Hu//    "mou",
8603b739f49SXuan Hu//    mouDataGen,
8613b739f49SXuan Hu//    (uop: MicroOp) => FuType.storeCanAccept(uop.ctrl.fuType),
8623b739f49SXuan Hu//    FuType.mou, 1, 0, writeIntRf = false, writeFpRf = false,
8633b739f49SXuan Hu//    latency = UncertainLatency()
8643b739f49SXuan Hu//  )
8653b739f49SXuan Hu//
8663b739f49SXuan Hu//  val vipuCfg = FuConfig(
8673b739f49SXuan Hu//    name = "vipu",
8683b739f49SXuan Hu//    fuGen = vipuGen,
8693b739f49SXuan Hu//    fuSel = (uop: MicroOp) => FuType.vipu === uop.ctrl.fuType,
8703b739f49SXuan Hu//    fuType = FuType.vipu,
8713b739f49SXuan Hu//    numIntSrc = 0, numFpSrc = 0, writeIntRf = false, writeFpRf = false, writeFflags = false,
8723b739f49SXuan Hu//    numVecSrc = 2, writeVecRf = true,
8733b739f49SXuan Hu//    fastUopOut = true, // TODO: check
8743b739f49SXuan Hu//    fastImplemented = true, //TODO: check
8753b739f49SXuan Hu//  )
8762225d46eSJiawei Lin
8773b739f49SXuan Hu//  val JumpExeUnitCfg = ExuConfig("JmpExeUnit", "Int", Seq(jmpCfg, i2fCfg), 2, Int.MaxValue)
8783b739f49SXuan Hu//  val AluExeUnitCfg = ExuConfig("AluExeUnit", "Int", Seq(aluCfg), 0, Int.MaxValue)
8793b739f49SXuan Hu//  val JumpCSRExeUnitCfg = ExuConfig("JmpCSRExeUnit", "Int", Seq(jmpCfg, csrCfg, fenceCfg, i2fCfg), 2, Int.MaxValue)
8803b739f49SXuan Hu//  val MulDivExeUnitCfg = ExuConfig("MulDivExeUnit", "Int", Seq(mulCfg, divCfg, bkuCfg), 1, Int.MaxValue)
8813b739f49SXuan Hu//  val FmacExeUnitCfg = ExuConfig("FmacExeUnit", "Fp", Seq(fmacCfg, vipuCfg), Int.MaxValue, 0)
8823b739f49SXuan Hu//  val FmiscExeUnitCfg = ExuConfig(
8833b739f49SXuan Hu//    "FmiscExeUnit",
8843b739f49SXuan Hu//    "Fp",
8853b739f49SXuan Hu//    Seq(f2iCfg, f2fCfg, fdivSqrtCfg),
8863b739f49SXuan Hu//    Int.MaxValue, 1
8873b739f49SXuan Hu//  )
8883b739f49SXuan Hu//  val LdExeUnitCfg = ExuConfig("LoadExu", "Mem", Seq(lduCfg), wbIntPriority = 0, wbFpPriority = 0, extendsExu = false)
8893b739f49SXuan Hu//  val StaExeUnitCfg = ExuConfig("StaExu", "Mem", Seq(staCfg, mouCfg), wbIntPriority = Int.MaxValue, wbFpPriority = Int.MaxValue, extendsExu = false)
8903b739f49SXuan Hu//  val StdExeUnitCfg = ExuConfig("StdExu", "Mem", Seq(stdCfg, mouDataCfg), wbIntPriority = Int.MaxValue, wbFpPriority = Int.MaxValue, extendsExu = false)
89154034ccdSZhangZifei
892d16f4ea4SZhangZifei  // def jumpRSWrapperGen(p: Parameters) = new JumpRSWrapper()(p)
893d16f4ea4SZhangZifei  // def mulRSWrapperGen(p: Parameters) = new MulRSWrapper()(p)
894d16f4ea4SZhangZifei  // def loadRSWrapperGen(p: Parameters) = new LoadRSWrapper()(p)
895d16f4ea4SZhangZifei  // def stdRSWrapperGen(p: Parameters) = new StdRSWrapper()(p)
896d16f4ea4SZhangZifei  // def staRSWrapperGen(p: Parameters) = new StaRSWrapper()(p)
897d16f4ea4SZhangZifei  // def fmaRSWrapperGen(p: Parameters) = new FMARSWrapper()(p)
898d16f4ea4SZhangZifei  // def fmiscRSWrapperGen(p: Parameters) = new FMiscRSWrapper()(p)
89954034ccdSZhangZifei
9003b739f49SXuan Hu//  val aluRSMod = new RSMod(
9013b739f49SXuan Hu//    rsWrapperGen = (modGen: RSMod, p: Parameters) => new ALURSWrapper(modGen)(p),
9023b739f49SXuan Hu//    rsGen = (a: RSParams, b: Parameters) => new ALURS(a)(b),
9033b739f49SXuan Hu//    immExtractorGen = (src: Int, width: Int, p: Parameters) => new AluImmExtractor()(p)
9043b739f49SXuan Hu//  )
9053b739f49SXuan Hu//  val fmaRSMod = new RSMod(
9063b739f49SXuan Hu//    rsWrapperGen = (modGen: RSMod, p: Parameters) => new FMARSWrapper(modGen)(p),
9073b739f49SXuan Hu//    rsGen = (a: RSParams, b: Parameters) => new FMARS(a)(b),
9083b739f49SXuan Hu//  )
9093b739f49SXuan Hu//  val fmiscRSMod = new RSMod(
9103b739f49SXuan Hu//    rsWrapperGen = (modGen: RSMod, p: Parameters) => new FMiscRSWrapper(modGen)(p),
9113b739f49SXuan Hu//    rsGen = (a: RSParams, b: Parameters) => new FMiscRS(a)(b),
9123b739f49SXuan Hu//  )
9133b739f49SXuan Hu//  val jumpRSMod = new RSMod(
9143b739f49SXuan Hu//    rsWrapperGen = (modGen: RSMod, p: Parameters) => new JumpRSWrapper(modGen)(p),
9153b739f49SXuan Hu//    rsGen = (a: RSParams, b: Parameters) => new JumpRS(a)(b),
9163b739f49SXuan Hu//    immExtractorGen = (src: Int, width: Int, p: Parameters) => new JumpImmExtractor()(p)
9173b739f49SXuan Hu//  )
9183b739f49SXuan Hu//  val loadRSMod = new RSMod(
9193b739f49SXuan Hu//    rsWrapperGen = (modGen: RSMod, p: Parameters) => new LoadRSWrapper(modGen)(p),
9203b739f49SXuan Hu//    rsGen = (a: RSParams, b: Parameters) => new LoadRS(a)(b),
9213b739f49SXuan Hu//    immExtractorGen = (src: Int, width: Int, p: Parameters) => new LoadImmExtractor()(p)
9223b739f49SXuan Hu//  )
9233b739f49SXuan Hu//  val mulRSMod = new RSMod(
9243b739f49SXuan Hu//    rsWrapperGen = (modGen: RSMod, p: Parameters) => new MulRSWrapper(modGen)(p),
9253b739f49SXuan Hu//    rsGen = (a: RSParams, b: Parameters) => new MulRS(a)(b),
9263b739f49SXuan Hu//    immExtractorGen = (src: Int, width: Int, p: Parameters) => new MduImmExtractor()(p)
9273b739f49SXuan Hu//  )
9283b739f49SXuan Hu//  val staRSMod = new RSMod(
9293b739f49SXuan Hu//    rsWrapperGen = (modGen: RSMod, p: Parameters) => new StaRSWrapper(modGen)(p),
9303b739f49SXuan Hu//    rsGen = (a: RSParams, b: Parameters) => new StaRS(a)(b),
9313b739f49SXuan Hu//  )
9323b739f49SXuan Hu//  val stdRSMod = new RSMod(
9333b739f49SXuan Hu//    rsWrapperGen = (modGen: RSMod, p: Parameters) => new StdRSWrapper(modGen)(p),
9343b739f49SXuan Hu//    rsGen = (a: RSParams, b: Parameters) => new StdRS(a)(b),
9353b739f49SXuan Hu//  )
9369a2e6b8aSLinJiawei}
937