xref: /XiangShan/src/main/scala/xiangshan/package.scala (revision 2b4b6de49bf69fc1c0e5b532c76fb78eb26e5fca)
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._
192225d46eSJiawei Linimport chipsalliance.rocketchip.config.Parameters
202225d46eSJiawei Linimport freechips.rocketchip.tile.XLen
216ab6918fSYinan Xuimport xiangshan.ExceptionNO._
2254034ccdSZhangZifeiimport xiangshan.backend.issue._
232225d46eSJiawei Linimport xiangshan.backend.fu._
242225d46eSJiawei Linimport xiangshan.backend.fu.fpu._
256827759bSZhangZifeiimport xiangshan.backend.fu.vector._
262225d46eSJiawei Linimport xiangshan.backend.exu._
2754034ccdSZhangZifeiimport xiangshan.backend.{Std, ScheLaneConfig}
282225d46eSJiawei Lin
299a2e6b8aSLinJiaweipackage object xiangshan {
309ee9f926SYikeZhou  object SrcType {
311285b047SXuan Hu    def imm = "b000".U
321285b047SXuan Hu    def pc  = "b000".U
331285b047SXuan Hu    def xp  = "b001".U
341285b047SXuan Hu    def fp  = "b010".U
351285b047SXuan Hu    def vp  = "b100".U
3604b56283SZhangZifei
371285b047SXuan Hu    // alias
381285b047SXuan Hu    def reg = this.xp
391a3df1feSYikeZhou    def DC  = imm // Don't Care
4057a10886SXuan Hu    def X   = BitPat("b000")
414d24c305SYikeZhou
4204b56283SZhangZifei    def isPc(srcType: UInt) = srcType===pc
4304b56283SZhangZifei    def isImm(srcType: UInt) = srcType===imm
441285b047SXuan Hu    def isReg(srcType: UInt) = srcType(0)
452b4e8253SYinan Xu    def isFp(srcType: UInt) = srcType(1)
461285b047SXuan Hu    def isVp(srcType: UInt) = srcType(2)
471285b047SXuan Hu    def isPcOrImm(srcType: UInt) = isPc(srcType) || isImm(srcType)
4804b56283SZhangZifei
49f062e05dSZhangZifei    def isNull(srcType: UInt) = !(isPcOrImm(srcType) || isReg(srcType) ||
50f062e05dSZhangZifei      isFp(srcType) || isVp(srcType))
51f062e05dSZhangZifei
521285b047SXuan Hu    def apply() = UInt(3.W)
539a2e6b8aSLinJiawei  }
549a2e6b8aSLinJiawei
559a2e6b8aSLinJiawei  object SrcState {
56100aa93cSYinan Xu    def busy    = "b0".U
57100aa93cSYinan Xu    def rdy     = "b1".U
58100aa93cSYinan Xu    // def specRdy = "b10".U // speculative ready, for future use
59100aa93cSYinan Xu    def apply() = UInt(1.W)
609a2e6b8aSLinJiawei  }
619a2e6b8aSLinJiawei
627f2b7720SXuan Hu  // Todo: Use OH instead
632225d46eSJiawei Lin  object FuType {
6457a10886SXuan Hu    def jmp          = "b00000".U
6557a10886SXuan Hu    def i2f          = "b00001".U
6657a10886SXuan Hu    def csr          = "b00010".U
6757a10886SXuan Hu    def alu          = "b00110".U
6857a10886SXuan Hu    def mul          = "b00100".U
6957a10886SXuan Hu    def div          = "b00101".U
7057a10886SXuan Hu    def fence        = "b00011".U
7157a10886SXuan Hu    def bku          = "b00111".U
72cafb3558SLinJiawei
7357a10886SXuan Hu    def fmac         = "b01000".U
7457a10886SXuan Hu    def fmisc        = "b01011".U
7557a10886SXuan Hu    def fDivSqrt     = "b01010".U
76cafb3558SLinJiawei
7757a10886SXuan Hu    def ldu          = "b01100".U
7857a10886SXuan Hu    def stu          = "b01101".U
7957a10886SXuan Hu    def mou          = "b01111".U // for amo, lr, sc, fence
8099e169c5Sczw
8157a10886SXuan Hu    def vipu         = "b10000".U
82876aa65bSczw    def vialuF       = "b10001".U // for VIALU Fixed-Point instructions
8357a10886SXuan Hu    def vfpu         = "b11000".U
847f2b7720SXuan Hu    def vldu         = "b11100".U
857f2b7720SXuan Hu    def vstu         = "b11101".U
8699e169c5Sczw    def vppu         = "b11001".U // for Permutation Unit
8799e169c5Sczw    def X            = BitPat("b00000") // TODO: It may be a potential bug
886e7c9679Shuxuan0307
8999e169c5Sczw    def num = 19
902225d46eSJiawei Lin
919a2e6b8aSLinJiawei    def apply() = UInt(log2Up(num).W)
929a2e6b8aSLinJiawei
930f038924SZhangZifei    // TODO: Optimize FuTpye and its method
940f038924SZhangZifei    // FIXME: Vector FuType coding is not ready
950f038924SZhangZifei    def isVecExu(fuType: UInt) = fuType(4)
960f038924SZhangZifei    def isIntExu(fuType: UInt) = !isVecExu(fuType) && !fuType(3)
976ac289b3SLinJiawei    def isJumpExu(fuType: UInt) = fuType === jmp
980f038924SZhangZifei    def isFpExu(fuType: UInt) = !isVecExu(fuType) && (fuType(3, 2) === "b10".U)
990f038924SZhangZifei    def isMemExu(fuType: UInt) = !isVecExu(fuType) && (fuType(3, 2) === "b11".U)
10092ab24ebSYinan Xu    def isLoadStore(fuType: UInt) = isMemExu(fuType) && !fuType(1)
10192ab24ebSYinan Xu    def isStoreExu(fuType: UInt) = isMemExu(fuType) && fuType(0)
1020f9d3717SYinan Xu    def isAMO(fuType: UInt) = fuType(1)
103af2f7849Shappy-lx    def isFence(fuType: UInt) = fuType === fence
104af2f7849Shappy-lx    def isSvinvalBegin(fuType: UInt, func: UInt, flush: Bool) = isFence(fuType) && func === FenceOpType.nofence && !flush
105af2f7849Shappy-lx    def isSvinval(fuType: UInt, func: UInt, flush: Bool) = isFence(fuType) && func === FenceOpType.sfence && !flush
106af2f7849Shappy-lx    def isSvinvalEnd(fuType: UInt, func: UInt, flush: Bool) = isFence(fuType) && func === FenceOpType.nofence && flush
10792ab24ebSYinan Xu
10892ab24ebSYinan Xu    def jmpCanAccept(fuType: UInt) = !fuType(2)
109ee8ff153Szfw    def mduCanAccept(fuType: UInt) = fuType(2) && !fuType(1) || fuType(2) && fuType(1) && fuType(0)
110ee8ff153Szfw    def aluCanAccept(fuType: UInt) = fuType(2) && fuType(1) && !fuType(0)
11192ab24ebSYinan Xu
11292ab24ebSYinan Xu    def fmacCanAccept(fuType: UInt) = !fuType(1)
11392ab24ebSYinan Xu    def fmiscCanAccept(fuType: UInt) = fuType(1)
11492ab24ebSYinan Xu
11592ab24ebSYinan Xu    def loadCanAccept(fuType: UInt) = !fuType(0)
11692ab24ebSYinan Xu    def storeCanAccept(fuType: UInt) = fuType(0)
11792ab24ebSYinan Xu
11892ab24ebSYinan Xu    def storeIsAMO(fuType: UInt) = fuType(1)
119cafb3558SLinJiawei
120cafb3558SLinJiawei    val functionNameMap = Map(
121cafb3558SLinJiawei      jmp.litValue() -> "jmp",
122ebb8ebf8SYinan Xu      i2f.litValue() -> "int_to_float",
123cafb3558SLinJiawei      csr.litValue() -> "csr",
124cafb3558SLinJiawei      alu.litValue() -> "alu",
125cafb3558SLinJiawei      mul.litValue() -> "mul",
126cafb3558SLinJiawei      div.litValue() -> "div",
127b8f08ca0SZhangZifei      fence.litValue() -> "fence",
1283feeca58Szfw      bku.litValue() -> "bku",
129cafb3558SLinJiawei      fmac.litValue() -> "fmac",
130cafb3558SLinJiawei      fmisc.litValue() -> "fmisc",
131d18dc7e6Swakafa      fDivSqrt.litValue() -> "fdiv_fsqrt",
132cafb3558SLinJiawei      ldu.litValue() -> "load",
133ebb8ebf8SYinan Xu      stu.litValue() -> "store",
134ebb8ebf8SYinan Xu      mou.litValue() -> "mou"
135cafb3558SLinJiawei    )
1369a2e6b8aSLinJiawei  }
1379a2e6b8aSLinJiawei
13857a10886SXuan Hu  def FuOpTypeWidth = 8
1392225d46eSJiawei Lin  object FuOpType {
14057a10886SXuan Hu    def apply() = UInt(FuOpTypeWidth.W)
14157a10886SXuan Hu    def X = BitPat("b00000000")
142ebd97ecbSzhanglinjuan  }
143518d8658SYinan Xu
1443a2e64c4SZhangZifei  // move VipuType and VfpuType into YunSuan/package.scala
1453a2e64c4SZhangZifei  // object VipuType {
1463a2e64c4SZhangZifei  //   def dummy = 0.U(7.W)
1473a2e64c4SZhangZifei  // }
1487f2b7720SXuan Hu
1493a2e64c4SZhangZifei  // object VfpuType {
1503a2e64c4SZhangZifei  //   def dummy = 0.U(7.W)
1513a2e64c4SZhangZifei  // }
1527f2b7720SXuan Hu
1537f2b7720SXuan Hu  object VlduType {
15457a10886SXuan Hu    def dummy = 0.U
1557f2b7720SXuan Hu  }
1567f2b7720SXuan Hu
1577f2b7720SXuan Hu  object VstuType {
15857a10886SXuan Hu    def dummy = 0.U
1597f2b7720SXuan Hu  }
1607f2b7720SXuan Hu
161a3edac52SYinan Xu  object CommitType {
162c3abb8b6SYinan Xu    def NORMAL = "b000".U  // int/fp
163c3abb8b6SYinan Xu    def BRANCH = "b001".U  // branch
164c3abb8b6SYinan Xu    def LOAD   = "b010".U  // load
165c3abb8b6SYinan Xu    def STORE  = "b011".U  // store
166518d8658SYinan Xu
167c3abb8b6SYinan Xu    def apply() = UInt(3.W)
168c3abb8b6SYinan Xu    def isFused(commitType: UInt): Bool = commitType(2)
169c3abb8b6SYinan Xu    def isLoadStore(commitType: UInt): Bool = !isFused(commitType) && commitType(1)
170c3abb8b6SYinan Xu    def lsInstIsStore(commitType: UInt): Bool = commitType(0)
171c3abb8b6SYinan Xu    def isStore(commitType: UInt): Bool = isLoadStore(commitType) && lsInstIsStore(commitType)
172c3abb8b6SYinan Xu    def isBranch(commitType: UInt): Bool = commitType(0) && !commitType(1) && !isFused(commitType)
173518d8658SYinan Xu  }
174bfb958a3SYinan Xu
175bfb958a3SYinan Xu  object RedirectLevel {
1762d7c7105SYinan Xu    def flushAfter = "b0".U
1772d7c7105SYinan Xu    def flush      = "b1".U
178bfb958a3SYinan Xu
1792d7c7105SYinan Xu    def apply() = UInt(1.W)
1802d7c7105SYinan Xu    // def isUnconditional(level: UInt) = level(1)
181bfb958a3SYinan Xu    def flushItself(level: UInt) = level(0)
1822d7c7105SYinan Xu    // def isException(level: UInt) = level(1) && level(0)
183bfb958a3SYinan Xu  }
184baf8def6SYinan Xu
185baf8def6SYinan Xu  object ExceptionVec {
186baf8def6SYinan Xu    def apply() = Vec(16, Bool())
187baf8def6SYinan Xu  }
188a8e04b1dSYinan Xu
189c60c1ab4SWilliam Wang  object PMAMode {
1908d9a04fcSWilliam Wang    def R = "b1".U << 0 //readable
1918d9a04fcSWilliam Wang    def W = "b1".U << 1 //writeable
1928d9a04fcSWilliam Wang    def X = "b1".U << 2 //executable
1938d9a04fcSWilliam Wang    def I = "b1".U << 3 //cacheable: icache
1948d9a04fcSWilliam Wang    def D = "b1".U << 4 //cacheable: dcache
1958d9a04fcSWilliam Wang    def S = "b1".U << 5 //enable speculative access
196cff68e26SWilliam Wang    def A = "b1".U << 6 //enable atomic operation, A imply R & W
1978d9a04fcSWilliam Wang    def C = "b1".U << 7 //if it is cacheable is configable
198c60c1ab4SWilliam Wang    def Reserved = "b0".U
199c60c1ab4SWilliam Wang
200c60c1ab4SWilliam Wang    def apply() = UInt(7.W)
201c60c1ab4SWilliam Wang
202c60c1ab4SWilliam Wang    def read(mode: UInt) = mode(0)
203c60c1ab4SWilliam Wang    def write(mode: UInt) = mode(1)
204c60c1ab4SWilliam Wang    def execute(mode: UInt) = mode(2)
205c60c1ab4SWilliam Wang    def icache(mode: UInt) = mode(3)
206c60c1ab4SWilliam Wang    def dcache(mode: UInt) = mode(4)
207c60c1ab4SWilliam Wang    def speculate(mode: UInt) = mode(5)
208c60c1ab4SWilliam Wang    def atomic(mode: UInt) = mode(6)
209c60c1ab4SWilliam Wang    def configable_cache(mode: UInt) = mode(7)
210c60c1ab4SWilliam Wang
211c60c1ab4SWilliam Wang    def strToMode(s: String) = {
212423b9255SWilliam Wang      var result = 0.U(8.W)
213c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("R") >= 0) result = result + R
214c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("W") >= 0) result = result + W
215c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("X") >= 0) result = result + X
216c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("I") >= 0) result = result + I
217c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("D") >= 0) result = result + D
218c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("S") >= 0) result = result + S
219c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("A") >= 0) result = result + A
220c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("C") >= 0) result = result + C
221c60c1ab4SWilliam Wang      result
222c60c1ab4SWilliam Wang    }
223c60c1ab4SWilliam Wang  }
2242225d46eSJiawei Lin
2252225d46eSJiawei Lin
2262225d46eSJiawei Lin  object CSROpType {
2272225d46eSJiawei Lin    def jmp  = "b000".U
2282225d46eSJiawei Lin    def wrt  = "b001".U
2292225d46eSJiawei Lin    def set  = "b010".U
2302225d46eSJiawei Lin    def clr  = "b011".U
231b6900d94SYinan Xu    def wfi  = "b100".U
2322225d46eSJiawei Lin    def wrti = "b101".U
2332225d46eSJiawei Lin    def seti = "b110".U
2342225d46eSJiawei Lin    def clri = "b111".U
2355d669833SYinan Xu    def needAccess(op: UInt): Bool = op(1, 0) =/= 0.U
2362225d46eSJiawei Lin  }
2372225d46eSJiawei Lin
2382225d46eSJiawei Lin  // jump
2392225d46eSJiawei Lin  object JumpOpType {
2402225d46eSJiawei Lin    def jal  = "b00".U
2412225d46eSJiawei Lin    def jalr = "b01".U
2422225d46eSJiawei Lin    def auipc = "b10".U
2432225d46eSJiawei Lin//    def call = "b11_011".U
2442225d46eSJiawei Lin//    def ret  = "b11_100".U
2452225d46eSJiawei Lin    def jumpOpisJalr(op: UInt) = op(0)
2462225d46eSJiawei Lin    def jumpOpisAuipc(op: UInt) = op(1)
2472225d46eSJiawei Lin  }
2482225d46eSJiawei Lin
2492225d46eSJiawei Lin  object FenceOpType {
2502225d46eSJiawei Lin    def fence  = "b10000".U
2512225d46eSJiawei Lin    def sfence = "b10001".U
2522225d46eSJiawei Lin    def fencei = "b10010".U
253af2f7849Shappy-lx    def nofence= "b00000".U
2542225d46eSJiawei Lin  }
2552225d46eSJiawei Lin
2562225d46eSJiawei Lin  object ALUOpType {
257ee8ff153Szfw    // shift optype
258675acc68SYinan Xu    def slliuw     = "b000_0000".U // slliuw: ZEXT(src1[31:0]) << shamt
259675acc68SYinan Xu    def sll        = "b000_0001".U // sll:     src1 << src2
260ee8ff153Szfw
261675acc68SYinan Xu    def bclr       = "b000_0010".U // bclr:    src1 & ~(1 << src2[5:0])
262675acc68SYinan Xu    def bset       = "b000_0011".U // bset:    src1 | (1 << src2[5:0])
263675acc68SYinan Xu    def binv       = "b000_0100".U // binv:    src1 ^ ~(1 << src2[5:0])
264ee8ff153Szfw
265675acc68SYinan Xu    def srl        = "b000_0101".U // srl:     src1 >> src2
266675acc68SYinan Xu    def bext       = "b000_0110".U // bext:    (src1 >> src2)[0]
267675acc68SYinan Xu    def sra        = "b000_0111".U // sra:     src1 >> src2 (arithmetic)
268ee8ff153Szfw
2697b441e5eSYinan Xu    def rol        = "b000_1001".U // rol:     (src1 << src2) | (src1 >> (xlen - src2))
2707b441e5eSYinan Xu    def ror        = "b000_1011".U // ror:     (src1 >> src2) | (src1 << (xlen - src2))
271184a1958Szfw
272ee8ff153Szfw    // RV64 32bit optype
273675acc68SYinan Xu    def addw       = "b001_0000".U // addw:      SEXT((src1 + src2)[31:0])
274675acc68SYinan Xu    def oddaddw    = "b001_0001".U // oddaddw:   SEXT((src1[0] + src2)[31:0])
275675acc68SYinan Xu    def subw       = "b001_0010".U // subw:      SEXT((src1 - src2)[31:0])
276ee8ff153Szfw
277675acc68SYinan Xu    def addwbit    = "b001_0100".U // addwbit:   (src1 + src2)[0]
278675acc68SYinan Xu    def addwbyte   = "b001_0101".U // addwbyte:  (src1 + src2)[7:0]
279675acc68SYinan Xu    def addwzexth  = "b001_0110".U // addwzexth: ZEXT((src1  + src2)[15:0])
280675acc68SYinan Xu    def addwsexth  = "b001_0111".U // addwsexth: SEXT((src1  + src2)[15:0])
281ee8ff153Szfw
282675acc68SYinan Xu    def sllw       = "b001_1000".U // sllw:     SEXT((src1 << src2)[31:0])
283675acc68SYinan Xu    def srlw       = "b001_1001".U // srlw:     SEXT((src1[31:0] >> src2)[31:0])
284675acc68SYinan Xu    def sraw       = "b001_1010".U // sraw:     SEXT((src1[31:0] >> src2)[31:0])
285675acc68SYinan Xu    def rolw       = "b001_1100".U
286675acc68SYinan Xu    def rorw       = "b001_1101".U
287675acc68SYinan Xu
288675acc68SYinan Xu    // ADD-op
289675acc68SYinan Xu    def adduw      = "b010_0000".U // adduw:  src1[31:0]  + src2
290675acc68SYinan Xu    def add        = "b010_0001".U // add:     src1        + src2
291675acc68SYinan Xu    def oddadd     = "b010_0010".U // oddadd:  src1[0]     + src2
292675acc68SYinan Xu
293675acc68SYinan Xu    def sr29add    = "b010_0100".U // sr29add: src1[63:29] + src2
294675acc68SYinan Xu    def sr30add    = "b010_0101".U // sr30add: src1[63:30] + src2
295675acc68SYinan Xu    def sr31add    = "b010_0110".U // sr31add: src1[63:31] + src2
296675acc68SYinan Xu    def sr32add    = "b010_0111".U // sr32add: src1[63:32] + src2
297675acc68SYinan Xu
298675acc68SYinan Xu    def sh1adduw   = "b010_1000".U // sh1adduw: {src1[31:0], 1'b0} + src2
299675acc68SYinan Xu    def sh1add     = "b010_1001".U // sh1add: {src1[62:0], 1'b0} + src2
300675acc68SYinan Xu    def sh2adduw   = "b010_1010".U // sh2add_uw: {src1[31:0], 2'b0} + src2
301675acc68SYinan Xu    def sh2add     = "b010_1011".U // sh2add: {src1[61:0], 2'b0} + src2
302675acc68SYinan Xu    def sh3adduw   = "b010_1100".U // sh3add_uw: {src1[31:0], 3'b0} + src2
303675acc68SYinan Xu    def sh3add     = "b010_1101".U // sh3add: {src1[60:0], 3'b0} + src2
304675acc68SYinan Xu    def sh4add     = "b010_1111".U // sh4add: {src1[59:0], 4'b0} + src2
305675acc68SYinan Xu
306675acc68SYinan Xu    // SUB-op: src1 - src2
307675acc68SYinan Xu    def sub        = "b011_0000".U
308675acc68SYinan Xu    def sltu       = "b011_0001".U
309675acc68SYinan Xu    def slt        = "b011_0010".U
310675acc68SYinan Xu    def maxu       = "b011_0100".U
311675acc68SYinan Xu    def minu       = "b011_0101".U
312675acc68SYinan Xu    def max        = "b011_0110".U
313675acc68SYinan Xu    def min        = "b011_0111".U
314675acc68SYinan Xu
315675acc68SYinan Xu    // branch
316675acc68SYinan Xu    def beq        = "b111_0000".U
317675acc68SYinan Xu    def bne        = "b111_0010".U
318675acc68SYinan Xu    def blt        = "b111_1000".U
319675acc68SYinan Xu    def bge        = "b111_1010".U
320675acc68SYinan Xu    def bltu       = "b111_1100".U
321675acc68SYinan Xu    def bgeu       = "b111_1110".U
322675acc68SYinan Xu
323675acc68SYinan Xu    // misc optype
324675acc68SYinan Xu    def and        = "b100_0000".U
325675acc68SYinan Xu    def andn       = "b100_0001".U
326675acc68SYinan Xu    def or         = "b100_0010".U
327675acc68SYinan Xu    def orn        = "b100_0011".U
328675acc68SYinan Xu    def xor        = "b100_0100".U
329675acc68SYinan Xu    def xnor       = "b100_0101".U
330675acc68SYinan Xu    def orcb       = "b100_0110".U
331675acc68SYinan Xu
332675acc68SYinan Xu    def sextb      = "b100_1000".U
333675acc68SYinan Xu    def packh      = "b100_1001".U
334675acc68SYinan Xu    def sexth      = "b100_1010".U
335675acc68SYinan Xu    def packw      = "b100_1011".U
336675acc68SYinan Xu
337675acc68SYinan Xu    def revb       = "b101_0000".U
338675acc68SYinan Xu    def rev8       = "b101_0001".U
339675acc68SYinan Xu    def pack       = "b101_0010".U
340675acc68SYinan Xu    def orh48      = "b101_0011".U
341675acc68SYinan Xu
342675acc68SYinan Xu    def szewl1     = "b101_1000".U
343675acc68SYinan Xu    def szewl2     = "b101_1001".U
344675acc68SYinan Xu    def szewl3     = "b101_1010".U
345675acc68SYinan Xu    def byte2      = "b101_1011".U
346675acc68SYinan Xu
347675acc68SYinan Xu    def andlsb     = "b110_0000".U
348675acc68SYinan Xu    def andzexth   = "b110_0001".U
349675acc68SYinan Xu    def orlsb      = "b110_0010".U
350675acc68SYinan Xu    def orzexth    = "b110_0011".U
351675acc68SYinan Xu    def xorlsb     = "b110_0100".U
352675acc68SYinan Xu    def xorzexth   = "b110_0101".U
353675acc68SYinan Xu    def orcblsb    = "b110_0110".U
354675acc68SYinan Xu    def orcbzexth  = "b110_0111".U
3554aa9ed34Sfdy    def vsetvli1    = "b1000_0000".U
3564aa9ed34Sfdy    def vsetvli2    = "b1000_0100".U
3574aa9ed34Sfdy    def vsetvl1     = "b1000_0001".U
3584aa9ed34Sfdy    def vsetvl2     = "b1000_0101".U
3594aa9ed34Sfdy    def vsetivli1   = "b1000_0010".U
3604aa9ed34Sfdy    def vsetivli2   = "b1000_0110".U
361675acc68SYinan Xu
362675acc68SYinan Xu    def isAddw(func: UInt) = func(6, 4) === "b001".U && !func(3) && !func(1)
363675acc68SYinan Xu    def isSimpleLogic(func: UInt) = func(6, 4) === "b100".U && !func(0)
364675acc68SYinan Xu    def logicToLsb(func: UInt) = Cat("b110".U(3.W), func(3, 1), 0.U(1.W))
365675acc68SYinan Xu    def logicToZexth(func: UInt) = Cat("b110".U(3.W), func(3, 1), 1.U(1.W))
366675acc68SYinan Xu    def isBranch(func: UInt) = func(6, 4) === "b111".U
367675acc68SYinan Xu    def getBranchType(func: UInt) = func(3, 2)
368675acc68SYinan Xu    def isBranchInvert(func: UInt) = func(1)
3694aa9ed34Sfdy    def isVset(func: UInt) = func(7, 3) === "b1000_0".U
3704aa9ed34Sfdy    def isVsetvl(func: UInt) = isVset(func) && func(0)
3714aa9ed34Sfdy    def isVsetvli(func: UInt) = isVset(func) && !func(1, 0).orR
3724aa9ed34Sfdy    def vsetExchange(func: UInt) = Cat(func(7, 3), "b1".U, func(1, 0))
373675acc68SYinan Xu
37457a10886SXuan Hu    def apply() = UInt(FuOpTypeWidth.W)
3752225d46eSJiawei Lin  }
3762225d46eSJiawei Lin
3772225d46eSJiawei Lin  object MDUOpType {
3782225d46eSJiawei Lin    // mul
3792225d46eSJiawei Lin    // bit encoding: | type (2bit) | isWord(1bit) | opcode(2bit) |
3802225d46eSJiawei Lin    def mul    = "b00000".U
3812225d46eSJiawei Lin    def mulh   = "b00001".U
3822225d46eSJiawei Lin    def mulhsu = "b00010".U
3832225d46eSJiawei Lin    def mulhu  = "b00011".U
3842225d46eSJiawei Lin    def mulw   = "b00100".U
3852225d46eSJiawei Lin
38688825c5cSYinan Xu    def mulw7  = "b01100".U
38788825c5cSYinan Xu
3882225d46eSJiawei Lin    // div
3892225d46eSJiawei Lin    // bit encoding: | type (2bit) | isWord(1bit) | isSign(1bit) | opcode(1bit) |
39088825c5cSYinan Xu    def div    = "b10000".U
39188825c5cSYinan Xu    def divu   = "b10010".U
39288825c5cSYinan Xu    def rem    = "b10001".U
39388825c5cSYinan Xu    def remu   = "b10011".U
3942225d46eSJiawei Lin
39588825c5cSYinan Xu    def divw   = "b10100".U
39688825c5cSYinan Xu    def divuw  = "b10110".U
39788825c5cSYinan Xu    def remw   = "b10101".U
39888825c5cSYinan Xu    def remuw  = "b10111".U
3992225d46eSJiawei Lin
40088825c5cSYinan Xu    def isMul(op: UInt) = !op(4)
40188825c5cSYinan Xu    def isDiv(op: UInt) = op(4)
4022225d46eSJiawei Lin
4032225d46eSJiawei Lin    def isDivSign(op: UInt) = isDiv(op) && !op(1)
4042225d46eSJiawei Lin    def isW(op: UInt) = op(2)
4052225d46eSJiawei Lin    def isH(op: UInt) = (isDiv(op) && op(0)) || (isMul(op) && op(1, 0) =/= 0.U)
4062225d46eSJiawei Lin    def getMulOp(op: UInt) = op(1, 0)
4072225d46eSJiawei Lin  }
4082225d46eSJiawei Lin
4092225d46eSJiawei Lin  object LSUOpType {
410d200f594SWilliam Wang    // load pipeline
4112225d46eSJiawei Lin
412d200f594SWilliam Wang    // normal load
413d200f594SWilliam Wang    // Note: bit(1, 0) are size, DO NOT CHANGE
414d200f594SWilliam Wang    // bit encoding: | load 0 | is unsigned(1bit) | size(2bit) |
415d200f594SWilliam Wang    def lb       = "b0000".U
416d200f594SWilliam Wang    def lh       = "b0001".U
417d200f594SWilliam Wang    def lw       = "b0010".U
418d200f594SWilliam Wang    def ld       = "b0011".U
419d200f594SWilliam Wang    def lbu      = "b0100".U
420d200f594SWilliam Wang    def lhu      = "b0101".U
421d200f594SWilliam Wang    def lwu      = "b0110".U
422ca18a0b4SWilliam Wang
423d200f594SWilliam Wang    // Zicbop software prefetch
424d200f594SWilliam Wang    // bit encoding: | prefetch 1 | 0 | prefetch type (2bit) |
425d200f594SWilliam Wang    def prefetch_i = "b1000".U // TODO
426d200f594SWilliam Wang    def prefetch_r = "b1001".U
427d200f594SWilliam Wang    def prefetch_w = "b1010".U
428ca18a0b4SWilliam Wang
429d200f594SWilliam Wang    def isPrefetch(op: UInt): Bool = op(3)
430d200f594SWilliam Wang
431d200f594SWilliam Wang    // store pipeline
432d200f594SWilliam Wang    // normal store
433d200f594SWilliam Wang    // bit encoding: | store 00 | size(2bit) |
434d200f594SWilliam Wang    def sb       = "b0000".U
435d200f594SWilliam Wang    def sh       = "b0001".U
436d200f594SWilliam Wang    def sw       = "b0010".U
437d200f594SWilliam Wang    def sd       = "b0011".U
438d200f594SWilliam Wang
439d200f594SWilliam Wang    // l1 cache op
440d200f594SWilliam Wang    // bit encoding: | cbo_zero 01 | size(2bit) 11 |
441d200f594SWilliam Wang    def cbo_zero  = "b0111".U
442d200f594SWilliam Wang
443d200f594SWilliam Wang    // llc op
444d200f594SWilliam Wang    // bit encoding: | prefetch 11 | suboptype(2bit) |
445d200f594SWilliam Wang    def cbo_clean = "b1100".U
446d200f594SWilliam Wang    def cbo_flush = "b1101".U
447d200f594SWilliam Wang    def cbo_inval = "b1110".U
448d200f594SWilliam Wang
449d200f594SWilliam Wang    def isCbo(op: UInt): Bool = op(3, 2) === "b11".U
4502225d46eSJiawei Lin
4512225d46eSJiawei Lin    // atomics
4522225d46eSJiawei Lin    // bit(1, 0) are size
4532225d46eSJiawei Lin    // since atomics use a different fu type
4542225d46eSJiawei Lin    // so we can safely reuse other load/store's encodings
455d200f594SWilliam Wang    // bit encoding: | optype(4bit) | size (2bit) |
4562225d46eSJiawei Lin    def lr_w      = "b000010".U
4572225d46eSJiawei Lin    def sc_w      = "b000110".U
4582225d46eSJiawei Lin    def amoswap_w = "b001010".U
4592225d46eSJiawei Lin    def amoadd_w  = "b001110".U
4602225d46eSJiawei Lin    def amoxor_w  = "b010010".U
4612225d46eSJiawei Lin    def amoand_w  = "b010110".U
4622225d46eSJiawei Lin    def amoor_w   = "b011010".U
4632225d46eSJiawei Lin    def amomin_w  = "b011110".U
4642225d46eSJiawei Lin    def amomax_w  = "b100010".U
4652225d46eSJiawei Lin    def amominu_w = "b100110".U
4662225d46eSJiawei Lin    def amomaxu_w = "b101010".U
4672225d46eSJiawei Lin
4682225d46eSJiawei Lin    def lr_d      = "b000011".U
4692225d46eSJiawei Lin    def sc_d      = "b000111".U
4702225d46eSJiawei Lin    def amoswap_d = "b001011".U
4712225d46eSJiawei Lin    def amoadd_d  = "b001111".U
4722225d46eSJiawei Lin    def amoxor_d  = "b010011".U
4732225d46eSJiawei Lin    def amoand_d  = "b010111".U
4742225d46eSJiawei Lin    def amoor_d   = "b011011".U
4752225d46eSJiawei Lin    def amomin_d  = "b011111".U
4762225d46eSJiawei Lin    def amomax_d  = "b100011".U
4772225d46eSJiawei Lin    def amominu_d = "b100111".U
4782225d46eSJiawei Lin    def amomaxu_d = "b101011".U
479b6982e83SLemover
480b6982e83SLemover    def size(op: UInt) = op(1,0)
4812225d46eSJiawei Lin  }
4822225d46eSJiawei Lin
4833feeca58Szfw  object BKUOpType {
484ee8ff153Szfw
4853feeca58Szfw    def clmul       = "b000000".U
4863feeca58Szfw    def clmulh      = "b000001".U
4873feeca58Szfw    def clmulr      = "b000010".U
4883feeca58Szfw    def xpermn      = "b000100".U
4893feeca58Szfw    def xpermb      = "b000101".U
490ee8ff153Szfw
4913feeca58Szfw    def clz         = "b001000".U
4923feeca58Szfw    def clzw        = "b001001".U
4933feeca58Szfw    def ctz         = "b001010".U
4943feeca58Szfw    def ctzw        = "b001011".U
4953feeca58Szfw    def cpop        = "b001100".U
4963feeca58Szfw    def cpopw       = "b001101".U
49707596dc6Szfw
4983feeca58Szfw    // 01xxxx is reserve
4993feeca58Szfw    def aes64es     = "b100000".U
5003feeca58Szfw    def aes64esm    = "b100001".U
5013feeca58Szfw    def aes64ds     = "b100010".U
5023feeca58Szfw    def aes64dsm    = "b100011".U
5033feeca58Szfw    def aes64im     = "b100100".U
5043feeca58Szfw    def aes64ks1i   = "b100101".U
5053feeca58Szfw    def aes64ks2    = "b100110".U
5063feeca58Szfw
5073feeca58Szfw    // merge to two instruction sm4ks & sm4ed
50819bcce38SFawang Zhang    def sm4ed0      = "b101000".U
50919bcce38SFawang Zhang    def sm4ed1      = "b101001".U
51019bcce38SFawang Zhang    def sm4ed2      = "b101010".U
51119bcce38SFawang Zhang    def sm4ed3      = "b101011".U
51219bcce38SFawang Zhang    def sm4ks0      = "b101100".U
51319bcce38SFawang Zhang    def sm4ks1      = "b101101".U
51419bcce38SFawang Zhang    def sm4ks2      = "b101110".U
51519bcce38SFawang Zhang    def sm4ks3      = "b101111".U
5163feeca58Szfw
5173feeca58Szfw    def sha256sum0  = "b110000".U
5183feeca58Szfw    def sha256sum1  = "b110001".U
5193feeca58Szfw    def sha256sig0  = "b110010".U
5203feeca58Szfw    def sha256sig1  = "b110011".U
5213feeca58Szfw    def sha512sum0  = "b110100".U
5223feeca58Szfw    def sha512sum1  = "b110101".U
5233feeca58Szfw    def sha512sig0  = "b110110".U
5243feeca58Szfw    def sha512sig1  = "b110111".U
5253feeca58Szfw
5263feeca58Szfw    def sm3p0       = "b111000".U
5273feeca58Szfw    def sm3p1       = "b111001".U
528ee8ff153Szfw  }
529ee8ff153Szfw
5302225d46eSJiawei Lin  object BTBtype {
5312225d46eSJiawei Lin    def B = "b00".U  // branch
5322225d46eSJiawei Lin    def J = "b01".U  // jump
5332225d46eSJiawei Lin    def I = "b10".U  // indirect
5342225d46eSJiawei Lin    def R = "b11".U  // return
5352225d46eSJiawei Lin
5362225d46eSJiawei Lin    def apply() = UInt(2.W)
5372225d46eSJiawei Lin  }
5382225d46eSJiawei Lin
5392225d46eSJiawei Lin  object SelImm {
540ee8ff153Szfw    def IMM_X  = "b0111".U
54166ce8f52Sczw    def IMM_S  = "b1110".U
542ee8ff153Szfw    def IMM_SB = "b0001".U
543ee8ff153Szfw    def IMM_U  = "b0010".U
544ee8ff153Szfw    def IMM_UJ = "b0011".U
545ee8ff153Szfw    def IMM_I  = "b0100".U
546ee8ff153Szfw    def IMM_Z  = "b0101".U
547ee8ff153Szfw    def INVALID_INSTR = "b0110".U
548ee8ff153Szfw    def IMM_B6 = "b1000".U
5492225d46eSJiawei Lin
55058c35d23Shuxuan0307    def IMM_OPIVIS = "b1001".U
55158c35d23Shuxuan0307    def IMM_OPIVIU = "b1010".U
552912e2179SXuan Hu    def IMM_VSETVLI   = "b1100".U
553912e2179SXuan Hu    def IMM_VSETIVLI  = "b1101".U
55458c35d23Shuxuan0307
55557a10886SXuan Hu    def X      = BitPat("b0000")
5566e7c9679Shuxuan0307
557ee8ff153Szfw    def apply() = UInt(4.W)
5582225d46eSJiawei Lin  }
5592225d46eSJiawei Lin
560acbea6c4SzhanglyGit  object UopDivType {
561b238ab97SzhanglyGit    def SCA_SIM          = "b000000".U //
562b238ab97SzhanglyGit    def DIR              = "b010001".U // dirty: vset
563b238ab97SzhanglyGit    def VEC_VVV          = "b010010".U // VEC_VVV
564b238ab97SzhanglyGit    def VEC_VXV          = "b010011".U // VEC_VXV
565b238ab97SzhanglyGit    def VEC_0XV          = "b010100".U // VEC_0XV
566b238ab97SzhanglyGit    def VEC_VVW          = "b010101".U // VEC_VVW
567b238ab97SzhanglyGit    def VEC_WVW          = "b010110".U // VEC_WVW
568b238ab97SzhanglyGit    def VEC_VXW          = "b010111".U // VEC_VXW
569b238ab97SzhanglyGit    def VEC_WXW          = "b011000".U // VEC_WXW
570b238ab97SzhanglyGit    def VEC_WVV          = "b011001".U // VEC_WVV
571b238ab97SzhanglyGit    def VEC_WXV          = "b011010".U // VEC_WXV
572b238ab97SzhanglyGit    def VEC_EXT2         = "b011011".U // VF2 0 -> V
573b238ab97SzhanglyGit    def VEC_EXT4         = "b011100".U // VF4 0 -> V
574b238ab97SzhanglyGit    def VEC_EXT8         = "b011101".U // VF8 0 -> V
575b238ab97SzhanglyGit    def VEC_VVM          = "b011110".U // VEC_VVM
576b238ab97SzhanglyGit    def VEC_VXM          = "b011111".U // VEC_VXM
5774365a7a7Sczw    def VEC_SLIDE1UP     = "b100000".U // vslide1up.vx
5784365a7a7Sczw    def VEC_FSLIDE1UP    = "b100001".U // vfslide1up.vf
5794365a7a7Sczw    def VEC_SLIDE1DOWN   = "b100010".U // vslide1down.vx
5804365a7a7Sczw    def VEC_FSLIDE1DOWN  = "b100011".U // vfslide1down.vf
581b8298242Sczw    def VEC_VRED         = "b100100".U // VEC_VRED
582fbc24a91Sczw    def VEC_SLIDEUP      = "b100101".U // VEC_SLIDEUP
583fbc24a91Sczw    def VEC_ISLIDEUP     = "b100110".U // VEC_ISLIDEUP
584fbc24a91Sczw    def VEC_SLIDEDOWN    = "b100111".U // VEC_SLIDEDOWN
585fbc24a91Sczw    def VEC_ISLIDEDOWN   = "b101000".U // VEC_ISLIDEDOWN
586*2b4b6de4Sczw    def VEC_M0X          = "b101001".U // VEC_M0X  0MV
587*2b4b6de4Sczw    def VEC_MVV          = "b101010".U // VEC_MVV  VMV
588*2b4b6de4Sczw    def VEC_M0X_VFIRST   = "b101011".U //
589*2b4b6de4Sczw    def VEC_M0M          = "b000000".U // VEC_M0M
590b238ab97SzhanglyGit    def VEC_MMM          = "b000000".U // VEC_MMM
591b238ab97SzhanglyGit    def dummy     = "b111111".U
592acbea6c4SzhanglyGit
593b238ab97SzhanglyGit    def X = BitPat("b000000")
594acbea6c4SzhanglyGit
595b238ab97SzhanglyGit    def apply() = UInt(6.W)
596b238ab97SzhanglyGit    def needSplit(UopDivType: UInt) = UopDivType(4) || UopDivType(5)
597acbea6c4SzhanglyGit  }
598acbea6c4SzhanglyGit
5996ab6918fSYinan Xu  object ExceptionNO {
6006ab6918fSYinan Xu    def instrAddrMisaligned = 0
6016ab6918fSYinan Xu    def instrAccessFault    = 1
6026ab6918fSYinan Xu    def illegalInstr        = 2
6036ab6918fSYinan Xu    def breakPoint          = 3
6046ab6918fSYinan Xu    def loadAddrMisaligned  = 4
6056ab6918fSYinan Xu    def loadAccessFault     = 5
6066ab6918fSYinan Xu    def storeAddrMisaligned = 6
6076ab6918fSYinan Xu    def storeAccessFault    = 7
6086ab6918fSYinan Xu    def ecallU              = 8
6096ab6918fSYinan Xu    def ecallS              = 9
6106ab6918fSYinan Xu    def ecallM              = 11
6116ab6918fSYinan Xu    def instrPageFault      = 12
6126ab6918fSYinan Xu    def loadPageFault       = 13
6136ab6918fSYinan Xu    // def singleStep          = 14
6146ab6918fSYinan Xu    def storePageFault      = 15
6156ab6918fSYinan Xu    def priorities = Seq(
6166ab6918fSYinan Xu      breakPoint, // TODO: different BP has different priority
6176ab6918fSYinan Xu      instrPageFault,
6186ab6918fSYinan Xu      instrAccessFault,
6196ab6918fSYinan Xu      illegalInstr,
6206ab6918fSYinan Xu      instrAddrMisaligned,
6216ab6918fSYinan Xu      ecallM, ecallS, ecallU,
622d880177dSYinan Xu      storeAddrMisaligned,
623d880177dSYinan Xu      loadAddrMisaligned,
6246ab6918fSYinan Xu      storePageFault,
6256ab6918fSYinan Xu      loadPageFault,
6266ab6918fSYinan Xu      storeAccessFault,
627d880177dSYinan Xu      loadAccessFault
6286ab6918fSYinan Xu    )
6296ab6918fSYinan Xu    def all = priorities.distinct.sorted
6306ab6918fSYinan Xu    def frontendSet = Seq(
6316ab6918fSYinan Xu      instrAddrMisaligned,
6326ab6918fSYinan Xu      instrAccessFault,
6336ab6918fSYinan Xu      illegalInstr,
6346ab6918fSYinan Xu      instrPageFault
6356ab6918fSYinan Xu    )
6366ab6918fSYinan Xu    def partialSelect(vec: Vec[Bool], select: Seq[Int]): Vec[Bool] = {
6376ab6918fSYinan Xu      val new_vec = Wire(ExceptionVec())
6386ab6918fSYinan Xu      new_vec.foreach(_ := false.B)
6396ab6918fSYinan Xu      select.foreach(i => new_vec(i) := vec(i))
6406ab6918fSYinan Xu      new_vec
6416ab6918fSYinan Xu    }
6426ab6918fSYinan Xu    def selectFrontend(vec: Vec[Bool]): Vec[Bool] = partialSelect(vec, frontendSet)
6436ab6918fSYinan Xu    def selectAll(vec: Vec[Bool]): Vec[Bool] = partialSelect(vec, ExceptionNO.all)
6446ab6918fSYinan Xu    def selectByFu(vec:Vec[Bool], fuConfig: FuConfig): Vec[Bool] =
6456ab6918fSYinan Xu      partialSelect(vec, fuConfig.exceptionOut)
6466ab6918fSYinan Xu    def selectByExu(vec:Vec[Bool], exuConfig: ExuConfig): Vec[Bool] =
6476ab6918fSYinan Xu      partialSelect(vec, exuConfig.exceptionOut)
6486ab6918fSYinan Xu    def selectByExu(vec:Vec[Bool], exuConfigs: Seq[ExuConfig]): Vec[Bool] =
6496ab6918fSYinan Xu      partialSelect(vec, exuConfigs.map(_.exceptionOut).reduce(_ ++ _).distinct.sorted)
6506ab6918fSYinan Xu  }
6516ab6918fSYinan Xu
6521c62c387SYinan Xu  def dividerGen(p: Parameters) = new DividerWrapper(p(XLen))(p)
653c3d7991bSJiawei Lin  def multiplierGen(p: Parameters) = new ArrayMultiplier(p(XLen) + 1)(p)
6542225d46eSJiawei Lin  def aluGen(p: Parameters) = new Alu()(p)
6553feeca58Szfw  def bkuGen(p: Parameters) = new Bku()(p)
6562225d46eSJiawei Lin  def jmpGen(p: Parameters) = new Jump()(p)
6572225d46eSJiawei Lin  def fenceGen(p: Parameters) = new Fence()(p)
6582225d46eSJiawei Lin  def csrGen(p: Parameters) = new CSR()(p)
6592225d46eSJiawei Lin  def i2fGen(p: Parameters) = new IntToFP()(p)
6602225d46eSJiawei Lin  def fmacGen(p: Parameters) = new FMA()(p)
6612225d46eSJiawei Lin  def f2iGen(p: Parameters) = new FPToInt()(p)
6622225d46eSJiawei Lin  def f2fGen(p: Parameters) = new FPToFP()(p)
6632225d46eSJiawei Lin  def fdivSqrtGen(p: Parameters) = new FDivSqrt()(p)
66485b4cd54SYinan Xu  def stdGen(p: Parameters) = new Std()(p)
6656ab6918fSYinan Xu  def mouDataGen(p: Parameters) = new Std()(p)
6666827759bSZhangZifei  def vipuGen(p: Parameters) = new VIPU()(p)
667876aa65bSczw  def vialuFGen(p: Parameters) = new VIAluFix()(p)
668de9e1949Sczw  def vppuGen(p: Parameters) = new VPerm()(p)
66994c0d8cfSczw  def vfpuGen(p: Parameters) = new VFPU()(p)
6702225d46eSJiawei Lin
6716cdd85d9SYinan Xu  def f2iSel(uop: MicroOp): Bool = {
6726cdd85d9SYinan Xu    uop.ctrl.rfWen
6732225d46eSJiawei Lin  }
6742225d46eSJiawei Lin
6756cdd85d9SYinan Xu  def i2fSel(uop: MicroOp): Bool = {
6766cdd85d9SYinan Xu    uop.ctrl.fpu.fromInt
6772225d46eSJiawei Lin  }
6782225d46eSJiawei Lin
6796cdd85d9SYinan Xu  def f2fSel(uop: MicroOp): Bool = {
6806cdd85d9SYinan Xu    val ctrl = uop.ctrl.fpu
6812225d46eSJiawei Lin    ctrl.fpWen && !ctrl.div && !ctrl.sqrt
6822225d46eSJiawei Lin  }
6832225d46eSJiawei Lin
6846cdd85d9SYinan Xu  def fdivSqrtSel(uop: MicroOp): Bool = {
6856cdd85d9SYinan Xu    val ctrl = uop.ctrl.fpu
6862225d46eSJiawei Lin    ctrl.div || ctrl.sqrt
6872225d46eSJiawei Lin  }
6882225d46eSJiawei Lin
6892225d46eSJiawei Lin  val aluCfg = FuConfig(
6901a0f06eeSYinan Xu    name = "alu",
6912225d46eSJiawei Lin    fuGen = aluGen,
6926cdd85d9SYinan Xu    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.alu,
6932225d46eSJiawei Lin    fuType = FuType.alu,
6942225d46eSJiawei Lin    numIntSrc = 2,
6952225d46eSJiawei Lin    numFpSrc = 0,
6962225d46eSJiawei Lin    writeIntRf = true,
6972225d46eSJiawei Lin    writeFpRf = false,
6982225d46eSJiawei Lin    hasRedirect = true,
6992225d46eSJiawei Lin  )
7002225d46eSJiawei Lin
7012225d46eSJiawei Lin  val jmpCfg = FuConfig(
7021a0f06eeSYinan Xu    name = "jmp",
7032225d46eSJiawei Lin    fuGen = jmpGen,
7046cdd85d9SYinan Xu    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.jmp,
7052225d46eSJiawei Lin    fuType = FuType.jmp,
7062225d46eSJiawei Lin    numIntSrc = 1,
7072225d46eSJiawei Lin    numFpSrc = 0,
7082225d46eSJiawei Lin    writeIntRf = true,
7092225d46eSJiawei Lin    writeFpRf = false,
7102225d46eSJiawei Lin    hasRedirect = true,
7112225d46eSJiawei Lin  )
7122225d46eSJiawei Lin
7132225d46eSJiawei Lin  val fenceCfg = FuConfig(
7141a0f06eeSYinan Xu    name = "fence",
7152225d46eSJiawei Lin    fuGen = fenceGen,
7166cdd85d9SYinan Xu    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.fence,
7176ab6918fSYinan Xu    FuType.fence, 2, 0, writeIntRf = false, writeFpRf = false,
718f1fe8698SLemover    latency = UncertainLatency(), exceptionOut = Seq(illegalInstr), // TODO: need rewrite latency structure, not just this value,
719f1fe8698SLemover    flushPipe = true
7202225d46eSJiawei Lin  )
7212225d46eSJiawei Lin
7222225d46eSJiawei Lin  val csrCfg = FuConfig(
7231a0f06eeSYinan Xu    name = "csr",
7242225d46eSJiawei Lin    fuGen = csrGen,
7256cdd85d9SYinan Xu    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.csr,
7262225d46eSJiawei Lin    fuType = FuType.csr,
7272225d46eSJiawei Lin    numIntSrc = 1,
7282225d46eSJiawei Lin    numFpSrc = 0,
7292225d46eSJiawei Lin    writeIntRf = true,
7302225d46eSJiawei Lin    writeFpRf = false,
7316ab6918fSYinan Xu    exceptionOut = Seq(illegalInstr, breakPoint, ecallU, ecallS, ecallM),
7326ab6918fSYinan Xu    flushPipe = true
7332225d46eSJiawei Lin  )
7342225d46eSJiawei Lin
7352225d46eSJiawei Lin  val i2fCfg = FuConfig(
7361a0f06eeSYinan Xu    name = "i2f",
7372225d46eSJiawei Lin    fuGen = i2fGen,
7382225d46eSJiawei Lin    fuSel = i2fSel,
7392225d46eSJiawei Lin    FuType.i2f,
7402225d46eSJiawei Lin    numIntSrc = 1,
7412225d46eSJiawei Lin    numFpSrc = 0,
7422225d46eSJiawei Lin    writeIntRf = false,
7432225d46eSJiawei Lin    writeFpRf = true,
7446ab6918fSYinan Xu    writeFflags = true,
745e174d629SJiawei Lin    latency = CertainLatency(2),
746e174d629SJiawei Lin    fastUopOut = true, fastImplemented = true
7472225d46eSJiawei Lin  )
7482225d46eSJiawei Lin
7492225d46eSJiawei Lin  val divCfg = FuConfig(
7501a0f06eeSYinan Xu    name = "div",
7512225d46eSJiawei Lin    fuGen = dividerGen,
75207596dc6Szfw    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.div,
7532225d46eSJiawei Lin    FuType.div,
7542225d46eSJiawei Lin    2,
7552225d46eSJiawei Lin    0,
7562225d46eSJiawei Lin    writeIntRf = true,
7572225d46eSJiawei Lin    writeFpRf = false,
758f83b578aSYinan Xu    latency = UncertainLatency(),
759f83b578aSYinan Xu    fastUopOut = true,
7601c62c387SYinan Xu    fastImplemented = true,
7615ee7cabeSYinan Xu    hasInputBuffer = (true, 4, true)
7622225d46eSJiawei Lin  )
7632225d46eSJiawei Lin
7642225d46eSJiawei Lin  val mulCfg = FuConfig(
7651a0f06eeSYinan Xu    name = "mul",
7662225d46eSJiawei Lin    fuGen = multiplierGen,
76707596dc6Szfw    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.mul,
7682225d46eSJiawei Lin    FuType.mul,
7692225d46eSJiawei Lin    2,
7702225d46eSJiawei Lin    0,
7712225d46eSJiawei Lin    writeIntRf = true,
7722225d46eSJiawei Lin    writeFpRf = false,
773b2482bc1SYinan Xu    latency = CertainLatency(2),
774f83b578aSYinan Xu    fastUopOut = true,
775b2482bc1SYinan Xu    fastImplemented = true
7762225d46eSJiawei Lin  )
7772225d46eSJiawei Lin
7783feeca58Szfw  val bkuCfg = FuConfig(
7793feeca58Szfw    name = "bku",
7803feeca58Szfw    fuGen = bkuGen,
7813feeca58Szfw    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.bku,
7823feeca58Szfw    fuType = FuType.bku,
783ee8ff153Szfw    numIntSrc = 2,
784ee8ff153Szfw    numFpSrc = 0,
785ee8ff153Szfw    writeIntRf = true,
786ee8ff153Szfw    writeFpRf = false,
787f83b578aSYinan Xu    latency = CertainLatency(1),
788f83b578aSYinan Xu    fastUopOut = true,
78907596dc6Szfw    fastImplemented = true
790ee8ff153Szfw )
791ee8ff153Szfw
7922225d46eSJiawei Lin  val fmacCfg = FuConfig(
7931a0f06eeSYinan Xu    name = "fmac",
7942225d46eSJiawei Lin    fuGen = fmacGen,
7950f038924SZhangZifei    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.fmac,
7966ab6918fSYinan Xu    FuType.fmac, 0, 3, writeIntRf = false, writeFpRf = true, writeFflags = true,
7974b65fc7eSJiawei Lin    latency = UncertainLatency(), fastUopOut = true, fastImplemented = true
7982225d46eSJiawei Lin  )
7992225d46eSJiawei Lin
8002225d46eSJiawei Lin  val f2iCfg = FuConfig(
8011a0f06eeSYinan Xu    name = "f2i",
8022225d46eSJiawei Lin    fuGen = f2iGen,
8032225d46eSJiawei Lin    fuSel = f2iSel,
8046ab6918fSYinan Xu    FuType.fmisc, 0, 1, writeIntRf = true, writeFpRf = false, writeFflags = true, latency = CertainLatency(2),
805b2482bc1SYinan Xu    fastUopOut = true, fastImplemented = true
8062225d46eSJiawei Lin  )
8072225d46eSJiawei Lin
8082225d46eSJiawei Lin  val f2fCfg = FuConfig(
8091a0f06eeSYinan Xu    name = "f2f",
8102225d46eSJiawei Lin    fuGen = f2fGen,
8112225d46eSJiawei Lin    fuSel = f2fSel,
8126ab6918fSYinan Xu    FuType.fmisc, 0, 1, writeIntRf = false, writeFpRf = true, writeFflags = true, latency = CertainLatency(2),
813b2482bc1SYinan Xu    fastUopOut = true, fastImplemented = true
8142225d46eSJiawei Lin  )
8152225d46eSJiawei Lin
8162225d46eSJiawei Lin  val fdivSqrtCfg = FuConfig(
8171a0f06eeSYinan Xu    name = "fdivSqrt",
8182225d46eSJiawei Lin    fuGen = fdivSqrtGen,
8192225d46eSJiawei Lin    fuSel = fdivSqrtSel,
8206ab6918fSYinan Xu    FuType.fDivSqrt, 0, 2, writeIntRf = false, writeFpRf = true, writeFflags = true, latency = UncertainLatency(),
821140aff85SYinan Xu    fastUopOut = true, fastImplemented = true, hasInputBuffer = (true, 8, true)
8222225d46eSJiawei Lin  )
8232225d46eSJiawei Lin
8242225d46eSJiawei Lin  val lduCfg = FuConfig(
8251a0f06eeSYinan Xu    "ldu",
8262225d46eSJiawei Lin    null, // DontCare
8272b4e8253SYinan Xu    (uop: MicroOp) => FuType.loadCanAccept(uop.ctrl.fuType),
8286ab6918fSYinan Xu    FuType.ldu, 1, 0, writeIntRf = true, writeFpRf = true,
8296ab6918fSYinan Xu    latency = UncertainLatency(),
8306ab6918fSYinan Xu    exceptionOut = Seq(loadAddrMisaligned, loadAccessFault, loadPageFault),
8316ab6918fSYinan Xu    flushPipe = true,
8326786cfb7SWilliam Wang    replayInst = true,
8336786cfb7SWilliam Wang    hasLoadError = true
8342225d46eSJiawei Lin  )
8352225d46eSJiawei Lin
83685b4cd54SYinan Xu  val staCfg = FuConfig(
8371a0f06eeSYinan Xu    "sta",
8382225d46eSJiawei Lin    null,
8392b4e8253SYinan Xu    (uop: MicroOp) => FuType.storeCanAccept(uop.ctrl.fuType),
8406ab6918fSYinan Xu    FuType.stu, 1, 0, writeIntRf = false, writeFpRf = false,
8416ab6918fSYinan Xu    latency = UncertainLatency(),
8426ab6918fSYinan Xu    exceptionOut = Seq(storeAddrMisaligned, storeAccessFault, storePageFault)
8432225d46eSJiawei Lin  )
8442225d46eSJiawei Lin
84585b4cd54SYinan Xu  val stdCfg = FuConfig(
8461a0f06eeSYinan Xu    "std",
8472b4e8253SYinan Xu    fuGen = stdGen, fuSel = (uop: MicroOp) => FuType.storeCanAccept(uop.ctrl.fuType), FuType.stu, 1, 1,
8486ab6918fSYinan Xu    writeIntRf = false, writeFpRf = false, latency = CertainLatency(1)
84985b4cd54SYinan Xu  )
85085b4cd54SYinan Xu
8512225d46eSJiawei Lin  val mouCfg = FuConfig(
8521a0f06eeSYinan Xu    "mou",
8532225d46eSJiawei Lin    null,
8542b4e8253SYinan Xu    (uop: MicroOp) => FuType.storeCanAccept(uop.ctrl.fuType),
8556ab6918fSYinan Xu    FuType.mou, 1, 0, writeIntRf = false, writeFpRf = false,
8566ab6918fSYinan Xu    latency = UncertainLatency(), exceptionOut = lduCfg.exceptionOut ++ staCfg.exceptionOut
8572b4e8253SYinan Xu  )
8582b4e8253SYinan Xu
8592b4e8253SYinan Xu  val mouDataCfg = FuConfig(
8602b4e8253SYinan Xu    "mou",
8612b4e8253SYinan Xu    mouDataGen,
8622b4e8253SYinan Xu    (uop: MicroOp) => FuType.storeCanAccept(uop.ctrl.fuType),
8636ab6918fSYinan Xu    FuType.mou, 1, 0, writeIntRf = false, writeFpRf = false,
8646ab6918fSYinan Xu    latency = UncertainLatency()
8652225d46eSJiawei Lin  )
8662225d46eSJiawei Lin
8676827759bSZhangZifei  val vipuCfg = FuConfig(
8686827759bSZhangZifei    name = "vipu",
8696827759bSZhangZifei    fuGen = vipuGen,
8706827759bSZhangZifei    fuSel = (uop: MicroOp) => FuType.vipu === uop.ctrl.fuType,
8716827759bSZhangZifei    fuType = FuType.vipu,
8726355a2b7Sczw    numIntSrc = 0, numFpSrc = 0, writeIntRf = false, writeFpRf = false, writeFflags = false, writeVxsat = true,
873822120dfSczw    numVecSrc = 4, writeVecRf = true,
8740f038924SZhangZifei    fastUopOut = false, // TODO: check
8756827759bSZhangZifei    fastImplemented = true, //TODO: check
8766827759bSZhangZifei  )
8776827759bSZhangZifei
878876aa65bSczw  val vialuFCfg = FuConfig(
879876aa65bSczw    name = "vialuF",
880876aa65bSczw    fuGen = vialuFGen,
881876aa65bSczw    fuSel = (uop: MicroOp) => FuType.vialuF === uop.ctrl.fuType,
882876aa65bSczw    fuType = FuType.vialuF,
883876aa65bSczw    numIntSrc = 0, numFpSrc = 0, writeIntRf = false, writeFpRf = false, writeFflags = false, writeVxsat = true,
884876aa65bSczw    numVecSrc = 4, writeVecRf = true,
885876aa65bSczw    fastUopOut = false, // TODO: check
886876aa65bSczw    fastImplemented = true, //TODO: check
887876aa65bSczw  )
888876aa65bSczw
88999e169c5Sczw  val vppuCfg = FuConfig(
89099e169c5Sczw    name = "vppu",
89199e169c5Sczw    fuGen = vppuGen,
89299e169c5Sczw    fuSel = (uop: MicroOp) => FuType.vppu === uop.ctrl.fuType,
89399e169c5Sczw    fuType = FuType.vppu,
89499e169c5Sczw    numIntSrc = 0, numFpSrc = 1, writeIntRf = false, writeFpRf = false, writeFflags = false,
89599e169c5Sczw    numVecSrc = 1, writeVecRf = true,
89699e169c5Sczw    fastUopOut = false, // TODO: check
89799e169c5Sczw    fastImplemented = true, //TODO: check
89899e169c5Sczw  )
89999e169c5Sczw
90094c0d8cfSczw  val vfpuCfg = FuConfig(
90194c0d8cfSczw    name = "vfpu",
90294c0d8cfSczw    fuGen = vfpuGen,
90394c0d8cfSczw    fuSel = (uop: MicroOp) => FuType.vfpu === uop.ctrl.fuType,
90494c0d8cfSczw    fuType = FuType.vfpu,
90594c0d8cfSczw    numIntSrc = 0, numFpSrc = 1, writeIntRf = false, writeFpRf = false, writeFflags = true,
906822120dfSczw    numVecSrc = 3, writeVecRf = true,
90794c0d8cfSczw    fastUopOut = false, // TODO: check
90894c0d8cfSczw    fastImplemented = true, //TODO: check
90994c0d8cfSczw    // latency = CertainLatency(2)
91094c0d8cfSczw  )
91194c0d8cfSczw
912adb5df20SYinan Xu  val JumpExeUnitCfg = ExuConfig("JmpExeUnit", "Int", Seq(jmpCfg, i2fCfg), 2, Int.MaxValue)
913b6220f0dSLemover  val AluExeUnitCfg = ExuConfig("AluExeUnit", "Int", Seq(aluCfg), 0, Int.MaxValue)
914adb5df20SYinan Xu  val JumpCSRExeUnitCfg = ExuConfig("JmpCSRExeUnit", "Int", Seq(jmpCfg, csrCfg, fenceCfg, i2fCfg), 2, Int.MaxValue)
9153feeca58Szfw  val MulDivExeUnitCfg = ExuConfig("MulDivExeUnit", "Int", Seq(mulCfg, divCfg, bkuCfg), 1, Int.MaxValue)
916876aa65bSczw  val FmacExeUnitCfg = ExuConfig("FmacExeUnit", "Fp", Seq(fmacCfg, vipuCfg, vppuCfg, vfpuCfg, vialuFCfg), Int.MaxValue, 0)
9172225d46eSJiawei Lin  val FmiscExeUnitCfg = ExuConfig(
9182225d46eSJiawei Lin    "FmiscExeUnit",
919b6220f0dSLemover    "Fp",
9202225d46eSJiawei Lin    Seq(f2iCfg, f2fCfg, fdivSqrtCfg),
9212225d46eSJiawei Lin    Int.MaxValue, 1
9222225d46eSJiawei Lin  )
9232b4e8253SYinan Xu  val LdExeUnitCfg = ExuConfig("LoadExu", "Mem", Seq(lduCfg), wbIntPriority = 0, wbFpPriority = 0, extendsExu = false)
9242b4e8253SYinan Xu  val StaExeUnitCfg = ExuConfig("StaExu", "Mem", Seq(staCfg, mouCfg), wbIntPriority = Int.MaxValue, wbFpPriority = Int.MaxValue, extendsExu = false)
9252b4e8253SYinan Xu  val StdExeUnitCfg = ExuConfig("StdExu", "Mem", Seq(stdCfg, mouDataCfg), wbIntPriority = Int.MaxValue, wbFpPriority = Int.MaxValue, extendsExu = false)
92654034ccdSZhangZifei
927d16f4ea4SZhangZifei  // def jumpRSWrapperGen(p: Parameters) = new JumpRSWrapper()(p)
928d16f4ea4SZhangZifei  // def mulRSWrapperGen(p: Parameters) = new MulRSWrapper()(p)
929d16f4ea4SZhangZifei  // def loadRSWrapperGen(p: Parameters) = new LoadRSWrapper()(p)
930d16f4ea4SZhangZifei  // def stdRSWrapperGen(p: Parameters) = new StdRSWrapper()(p)
931d16f4ea4SZhangZifei  // def staRSWrapperGen(p: Parameters) = new StaRSWrapper()(p)
932d16f4ea4SZhangZifei  // def fmaRSWrapperGen(p: Parameters) = new FMARSWrapper()(p)
933d16f4ea4SZhangZifei  // def fmiscRSWrapperGen(p: Parameters) = new FMiscRSWrapper()(p)
93454034ccdSZhangZifei
935d16f4ea4SZhangZifei  val aluRSMod = new RSMod(
936d16f4ea4SZhangZifei    rsWrapperGen = (modGen: RSMod, p: Parameters) => new ALURSWrapper(modGen)(p),
937d16f4ea4SZhangZifei    rsGen = (a: RSParams, b: Parameters) => new ALURS(a)(b),
938d16f4ea4SZhangZifei    immExtractorGen = (src: Int, width: Int, p: Parameters) => new AluImmExtractor()(p)
939d16f4ea4SZhangZifei  )
940d16f4ea4SZhangZifei  val fmaRSMod = new RSMod(
941d16f4ea4SZhangZifei    rsWrapperGen = (modGen: RSMod, p: Parameters) => new FMARSWrapper(modGen)(p),
942d16f4ea4SZhangZifei    rsGen = (a: RSParams, b: Parameters) => new FMARS(a)(b),
943d16f4ea4SZhangZifei  )
944d16f4ea4SZhangZifei  val fmiscRSMod = new RSMod(
945d16f4ea4SZhangZifei    rsWrapperGen = (modGen: RSMod, p: Parameters) => new FMiscRSWrapper(modGen)(p),
946d16f4ea4SZhangZifei    rsGen = (a: RSParams, b: Parameters) => new FMiscRS(a)(b),
947d16f4ea4SZhangZifei  )
948d16f4ea4SZhangZifei  val jumpRSMod = new RSMod(
949d16f4ea4SZhangZifei    rsWrapperGen = (modGen: RSMod, p: Parameters) => new JumpRSWrapper(modGen)(p),
950d16f4ea4SZhangZifei    rsGen = (a: RSParams, b: Parameters) => new JumpRS(a)(b),
951d16f4ea4SZhangZifei    immExtractorGen = (src: Int, width: Int, p: Parameters) => new JumpImmExtractor()(p)
952d16f4ea4SZhangZifei  )
953d16f4ea4SZhangZifei  val loadRSMod = new RSMod(
954d16f4ea4SZhangZifei    rsWrapperGen = (modGen: RSMod, p: Parameters) => new LoadRSWrapper(modGen)(p),
955d16f4ea4SZhangZifei    rsGen = (a: RSParams, b: Parameters) => new LoadRS(a)(b),
956d16f4ea4SZhangZifei    immExtractorGen = (src: Int, width: Int, p: Parameters) => new LoadImmExtractor()(p)
957d16f4ea4SZhangZifei  )
958d16f4ea4SZhangZifei  val mulRSMod = new RSMod(
959d16f4ea4SZhangZifei    rsWrapperGen = (modGen: RSMod, p: Parameters) => new MulRSWrapper(modGen)(p),
960d16f4ea4SZhangZifei    rsGen = (a: RSParams, b: Parameters) => new MulRS(a)(b),
961d16f4ea4SZhangZifei    immExtractorGen = (src: Int, width: Int, p: Parameters) => new MduImmExtractor()(p)
962d16f4ea4SZhangZifei  )
963d16f4ea4SZhangZifei  val staRSMod = new RSMod(
964d16f4ea4SZhangZifei    rsWrapperGen = (modGen: RSMod, p: Parameters) => new StaRSWrapper(modGen)(p),
965d16f4ea4SZhangZifei    rsGen = (a: RSParams, b: Parameters) => new StaRS(a)(b),
966d16f4ea4SZhangZifei  )
967d16f4ea4SZhangZifei  val stdRSMod = new RSMod(
968d16f4ea4SZhangZifei    rsWrapperGen = (modGen: RSMod, p: Parameters) => new StdRSWrapper(modGen)(p),
969d16f4ea4SZhangZifei    rsGen = (a: RSParams, b: Parameters) => new StdRS(a)(b),
970d16f4ea4SZhangZifei  )
9719a2e6b8aSLinJiawei}
972