xref: /XiangShan/src/main/scala/xiangshan/package.scala (revision 5ee7cabe33e2ee2c1243e4934ff47c80b7b7064d)
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._
222225d46eSJiawei Linimport xiangshan.backend.fu._
232225d46eSJiawei Linimport xiangshan.backend.fu.fpu._
242225d46eSJiawei Linimport xiangshan.backend.exu._
256ab6918fSYinan Xuimport xiangshan.backend.Std
262225d46eSJiawei Lin
279a2e6b8aSLinJiaweipackage object xiangshan {
289ee9f926SYikeZhou  object SrcType {
299a2e6b8aSLinJiawei    def reg = "b00".U
309a2e6b8aSLinJiawei    def pc  = "b01".U
319a2e6b8aSLinJiawei    def imm = "b01".U
329a2e6b8aSLinJiawei    def fp  = "b10".U
3304b56283SZhangZifei
341a3df1feSYikeZhou    def DC  = imm // Don't Care
356e7c9679Shuxuan0307    def X   = BitPat("b??")
364d24c305SYikeZhou
3704b56283SZhangZifei    def isReg(srcType: UInt) = srcType===reg
3804b56283SZhangZifei    def isPc(srcType: UInt) = srcType===pc
3904b56283SZhangZifei    def isImm(srcType: UInt) = srcType===imm
402b4e8253SYinan Xu    def isFp(srcType: UInt) = srcType(1)
41c9ebdf90SYinan Xu    def isPcOrImm(srcType: UInt) = srcType(0)
422b4e8253SYinan Xu    def isRegOrFp(srcType: UInt) = !srcType(0)
43c9ebdf90SYinan Xu    def regIsFp(srcType: UInt) = srcType(1)
4404b56283SZhangZifei
459a2e6b8aSLinJiawei    def apply() = UInt(2.W)
469a2e6b8aSLinJiawei  }
479a2e6b8aSLinJiawei
489a2e6b8aSLinJiawei  object SrcState {
49100aa93cSYinan Xu    def busy    = "b0".U
50100aa93cSYinan Xu    def rdy     = "b1".U
51100aa93cSYinan Xu    // def specRdy = "b10".U // speculative ready, for future use
52100aa93cSYinan Xu    def apply() = UInt(1.W)
539a2e6b8aSLinJiawei  }
549a2e6b8aSLinJiawei
552225d46eSJiawei Lin  object FuType {
56cafb3558SLinJiawei    def jmp          = "b0000".U
57cafb3558SLinJiawei    def i2f          = "b0001".U
58cafb3558SLinJiawei    def csr          = "b0010".U
59975b9ea3SYinan Xu    def alu          = "b0110".U
60cafb3558SLinJiawei    def mul          = "b0100".U
61cafb3558SLinJiawei    def div          = "b0101".U
62975b9ea3SYinan Xu    def fence        = "b0011".U
633feeca58Szfw    def bku          = "b0111".U
64cafb3558SLinJiawei
65cafb3558SLinJiawei    def fmac         = "b1000".U
6692ab24ebSYinan Xu    def fmisc        = "b1011".U
67cafb3558SLinJiawei    def fDivSqrt     = "b1010".U
68cafb3558SLinJiawei
69cafb3558SLinJiawei    def ldu          = "b1100".U
70cafb3558SLinJiawei    def stu          = "b1101".U
7192ab24ebSYinan Xu    def mou          = "b1111".U // for amo, lr, sc, fence
729a2e6b8aSLinJiawei
736e7c9679Shuxuan0307    def X            = BitPat("b????")
746e7c9679Shuxuan0307
75ee8ff153Szfw    def num = 14
762225d46eSJiawei Lin
779a2e6b8aSLinJiawei    def apply() = UInt(log2Up(num).W)
789a2e6b8aSLinJiawei
79cafb3558SLinJiawei    def isIntExu(fuType: UInt) = !fuType(3)
806ac289b3SLinJiawei    def isJumpExu(fuType: UInt) = fuType === jmp
81cafb3558SLinJiawei    def isFpExu(fuType: UInt) = fuType(3, 2) === "b10".U
82cafb3558SLinJiawei    def isMemExu(fuType: UInt) = fuType(3, 2) === "b11".U
8392ab24ebSYinan Xu    def isLoadStore(fuType: UInt) = isMemExu(fuType) && !fuType(1)
8492ab24ebSYinan Xu    def isStoreExu(fuType: UInt) = isMemExu(fuType) && fuType(0)
850f9d3717SYinan Xu    def isAMO(fuType: UInt) = fuType(1)
86af2f7849Shappy-lx    def isFence(fuType: UInt) = fuType === fence
87af2f7849Shappy-lx    def isSvinvalBegin(fuType: UInt, func: UInt, flush: Bool) = isFence(fuType) && func === FenceOpType.nofence && !flush
88af2f7849Shappy-lx    def isSvinval(fuType: UInt, func: UInt, flush: Bool) = isFence(fuType) && func === FenceOpType.sfence && !flush
89af2f7849Shappy-lx    def isSvinvalEnd(fuType: UInt, func: UInt, flush: Bool) = isFence(fuType) && func === FenceOpType.nofence && flush
90af2f7849Shappy-lx
9192ab24ebSYinan Xu
9292ab24ebSYinan Xu    def jmpCanAccept(fuType: UInt) = !fuType(2)
93ee8ff153Szfw    def mduCanAccept(fuType: UInt) = fuType(2) && !fuType(1) || fuType(2) && fuType(1) && fuType(0)
94ee8ff153Szfw    def aluCanAccept(fuType: UInt) = fuType(2) && fuType(1) && !fuType(0)
9592ab24ebSYinan Xu
9692ab24ebSYinan Xu    def fmacCanAccept(fuType: UInt) = !fuType(1)
9792ab24ebSYinan Xu    def fmiscCanAccept(fuType: UInt) = fuType(1)
9892ab24ebSYinan Xu
9992ab24ebSYinan Xu    def loadCanAccept(fuType: UInt) = !fuType(0)
10092ab24ebSYinan Xu    def storeCanAccept(fuType: UInt) = fuType(0)
10192ab24ebSYinan Xu
10292ab24ebSYinan Xu    def storeIsAMO(fuType: UInt) = fuType(1)
103cafb3558SLinJiawei
104cafb3558SLinJiawei    val functionNameMap = Map(
105cafb3558SLinJiawei      jmp.litValue() -> "jmp",
106ebb8ebf8SYinan Xu      i2f.litValue() -> "int_to_float",
107cafb3558SLinJiawei      csr.litValue() -> "csr",
108cafb3558SLinJiawei      alu.litValue() -> "alu",
109cafb3558SLinJiawei      mul.litValue() -> "mul",
110cafb3558SLinJiawei      div.litValue() -> "div",
111b8f08ca0SZhangZifei      fence.litValue() -> "fence",
1123feeca58Szfw      bku.litValue() -> "bku",
113cafb3558SLinJiawei      fmac.litValue() -> "fmac",
114cafb3558SLinJiawei      fmisc.litValue() -> "fmisc",
115d18dc7e6Swakafa      fDivSqrt.litValue() -> "fdiv_fsqrt",
116cafb3558SLinJiawei      ldu.litValue() -> "load",
117ebb8ebf8SYinan Xu      stu.litValue() -> "store",
118ebb8ebf8SYinan Xu      mou.litValue() -> "mou"
119cafb3558SLinJiawei    )
1209a2e6b8aSLinJiawei  }
1219a2e6b8aSLinJiawei
1222225d46eSJiawei Lin  object FuOpType {
123675acc68SYinan Xu    def apply() = UInt(7.W)
124361e6d51SJiuyang Liu    def X = BitPat("b???????")
125ebd97ecbSzhanglinjuan  }
126518d8658SYinan Xu
127a3edac52SYinan Xu  object CommitType {
128c3abb8b6SYinan Xu    def NORMAL = "b000".U  // int/fp
129c3abb8b6SYinan Xu    def BRANCH = "b001".U  // branch
130c3abb8b6SYinan Xu    def LOAD   = "b010".U  // load
131c3abb8b6SYinan Xu    def STORE  = "b011".U  // store
132518d8658SYinan Xu
133c3abb8b6SYinan Xu    def apply() = UInt(3.W)
134c3abb8b6SYinan Xu    def isFused(commitType: UInt): Bool = commitType(2)
135c3abb8b6SYinan Xu    def isLoadStore(commitType: UInt): Bool = !isFused(commitType) && commitType(1)
136c3abb8b6SYinan Xu    def lsInstIsStore(commitType: UInt): Bool = commitType(0)
137c3abb8b6SYinan Xu    def isStore(commitType: UInt): Bool = isLoadStore(commitType) && lsInstIsStore(commitType)
138c3abb8b6SYinan Xu    def isBranch(commitType: UInt): Bool = commitType(0) && !commitType(1) && !isFused(commitType)
139518d8658SYinan Xu  }
140bfb958a3SYinan Xu
141bfb958a3SYinan Xu  object RedirectLevel {
1422d7c7105SYinan Xu    def flushAfter = "b0".U
1432d7c7105SYinan Xu    def flush      = "b1".U
144bfb958a3SYinan Xu
1452d7c7105SYinan Xu    def apply() = UInt(1.W)
1462d7c7105SYinan Xu    // def isUnconditional(level: UInt) = level(1)
147bfb958a3SYinan Xu    def flushItself(level: UInt) = level(0)
1482d7c7105SYinan Xu    // def isException(level: UInt) = level(1) && level(0)
149bfb958a3SYinan Xu  }
150baf8def6SYinan Xu
151baf8def6SYinan Xu  object ExceptionVec {
152baf8def6SYinan Xu    def apply() = Vec(16, Bool())
153baf8def6SYinan Xu  }
154a8e04b1dSYinan Xu
155c60c1ab4SWilliam Wang  object PMAMode {
1568d9a04fcSWilliam Wang    def R = "b1".U << 0 //readable
1578d9a04fcSWilliam Wang    def W = "b1".U << 1 //writeable
1588d9a04fcSWilliam Wang    def X = "b1".U << 2 //executable
1598d9a04fcSWilliam Wang    def I = "b1".U << 3 //cacheable: icache
1608d9a04fcSWilliam Wang    def D = "b1".U << 4 //cacheable: dcache
1618d9a04fcSWilliam Wang    def S = "b1".U << 5 //enable speculative access
162cff68e26SWilliam Wang    def A = "b1".U << 6 //enable atomic operation, A imply R & W
1638d9a04fcSWilliam Wang    def C = "b1".U << 7 //if it is cacheable is configable
164c60c1ab4SWilliam Wang    def Reserved = "b0".U
165c60c1ab4SWilliam Wang
166c60c1ab4SWilliam Wang    def apply() = UInt(7.W)
167c60c1ab4SWilliam Wang
168c60c1ab4SWilliam Wang    def read(mode: UInt) = mode(0)
169c60c1ab4SWilliam Wang    def write(mode: UInt) = mode(1)
170c60c1ab4SWilliam Wang    def execute(mode: UInt) = mode(2)
171c60c1ab4SWilliam Wang    def icache(mode: UInt) = mode(3)
172c60c1ab4SWilliam Wang    def dcache(mode: UInt) = mode(4)
173c60c1ab4SWilliam Wang    def speculate(mode: UInt) = mode(5)
174c60c1ab4SWilliam Wang    def atomic(mode: UInt) = mode(6)
175c60c1ab4SWilliam Wang    def configable_cache(mode: UInt) = mode(7)
176c60c1ab4SWilliam Wang
177c60c1ab4SWilliam Wang    def strToMode(s: String) = {
178423b9255SWilliam Wang      var result = 0.U(8.W)
179c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("R") >= 0) result = result + R
180c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("W") >= 0) result = result + W
181c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("X") >= 0) result = result + X
182c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("I") >= 0) result = result + I
183c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("D") >= 0) result = result + D
184c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("S") >= 0) result = result + S
185c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("A") >= 0) result = result + A
186c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("C") >= 0) result = result + C
187c60c1ab4SWilliam Wang      result
188c60c1ab4SWilliam Wang    }
189c60c1ab4SWilliam Wang  }
1902225d46eSJiawei Lin
1912225d46eSJiawei Lin
1922225d46eSJiawei Lin  object CSROpType {
1932225d46eSJiawei Lin    def jmp  = "b000".U
1942225d46eSJiawei Lin    def wrt  = "b001".U
1952225d46eSJiawei Lin    def set  = "b010".U
1962225d46eSJiawei Lin    def clr  = "b011".U
197b6900d94SYinan Xu    def wfi  = "b100".U
1982225d46eSJiawei Lin    def wrti = "b101".U
1992225d46eSJiawei Lin    def seti = "b110".U
2002225d46eSJiawei Lin    def clri = "b111".U
2015d669833SYinan Xu    def needAccess(op: UInt): Bool = op(1, 0) =/= 0.U
2022225d46eSJiawei Lin  }
2032225d46eSJiawei Lin
2042225d46eSJiawei Lin  // jump
2052225d46eSJiawei Lin  object JumpOpType {
2062225d46eSJiawei Lin    def jal  = "b00".U
2072225d46eSJiawei Lin    def jalr = "b01".U
2082225d46eSJiawei Lin    def auipc = "b10".U
2092225d46eSJiawei Lin//    def call = "b11_011".U
2102225d46eSJiawei Lin//    def ret  = "b11_100".U
2112225d46eSJiawei Lin    def jumpOpisJalr(op: UInt) = op(0)
2122225d46eSJiawei Lin    def jumpOpisAuipc(op: UInt) = op(1)
2132225d46eSJiawei Lin  }
2142225d46eSJiawei Lin
2152225d46eSJiawei Lin  object FenceOpType {
2162225d46eSJiawei Lin    def fence  = "b10000".U
2172225d46eSJiawei Lin    def sfence = "b10001".U
2182225d46eSJiawei Lin    def fencei = "b10010".U
219af2f7849Shappy-lx    def nofence= "b00000".U
2202225d46eSJiawei Lin  }
2212225d46eSJiawei Lin
2222225d46eSJiawei Lin  object ALUOpType {
223ee8ff153Szfw    // shift optype
224675acc68SYinan Xu    def slliuw     = "b000_0000".U // slliuw: ZEXT(src1[31:0]) << shamt
225675acc68SYinan Xu    def sll        = "b000_0001".U // sll:     src1 << src2
226ee8ff153Szfw
227675acc68SYinan Xu    def bclr       = "b000_0010".U // bclr:    src1 & ~(1 << src2[5:0])
228675acc68SYinan Xu    def bset       = "b000_0011".U // bset:    src1 | (1 << src2[5:0])
229675acc68SYinan Xu    def binv       = "b000_0100".U // binv:    src1 ^ ~(1 << src2[5:0])
230ee8ff153Szfw
231675acc68SYinan Xu    def srl        = "b000_0101".U // srl:     src1 >> src2
232675acc68SYinan Xu    def bext       = "b000_0110".U // bext:    (src1 >> src2)[0]
233675acc68SYinan Xu    def sra        = "b000_0111".U // sra:     src1 >> src2 (arithmetic)
234ee8ff153Szfw
2357b441e5eSYinan Xu    def rol        = "b000_1001".U // rol:     (src1 << src2) | (src1 >> (xlen - src2))
2367b441e5eSYinan Xu    def ror        = "b000_1011".U // ror:     (src1 >> src2) | (src1 << (xlen - src2))
237184a1958Szfw
238ee8ff153Szfw    // RV64 32bit optype
239675acc68SYinan Xu    def addw       = "b001_0000".U // addw:      SEXT((src1 + src2)[31:0])
240675acc68SYinan Xu    def oddaddw    = "b001_0001".U // oddaddw:   SEXT((src1[0] + src2)[31:0])
241675acc68SYinan Xu    def subw       = "b001_0010".U // subw:      SEXT((src1 - src2)[31:0])
242ee8ff153Szfw
243675acc68SYinan Xu    def addwbit    = "b001_0100".U // addwbit:   (src1 + src2)[0]
244675acc68SYinan Xu    def addwbyte   = "b001_0101".U // addwbyte:  (src1 + src2)[7:0]
245675acc68SYinan Xu    def addwzexth  = "b001_0110".U // addwzexth: ZEXT((src1  + src2)[15:0])
246675acc68SYinan Xu    def addwsexth  = "b001_0111".U // addwsexth: SEXT((src1  + src2)[15:0])
247ee8ff153Szfw
248675acc68SYinan Xu    def sllw       = "b001_1000".U // sllw:     SEXT((src1 << src2)[31:0])
249675acc68SYinan Xu    def srlw       = "b001_1001".U // srlw:     SEXT((src1[31:0] >> src2)[31:0])
250675acc68SYinan Xu    def sraw       = "b001_1010".U // sraw:     SEXT((src1[31:0] >> src2)[31:0])
251675acc68SYinan Xu    def rolw       = "b001_1100".U
252675acc68SYinan Xu    def rorw       = "b001_1101".U
253675acc68SYinan Xu
254675acc68SYinan Xu    // ADD-op
255675acc68SYinan Xu    def adduw      = "b010_0000".U // adduw:  src1[31:0]  + src2
256675acc68SYinan Xu    def add        = "b010_0001".U // add:     src1        + src2
257675acc68SYinan Xu    def oddadd     = "b010_0010".U // oddadd:  src1[0]     + src2
258675acc68SYinan Xu
259675acc68SYinan Xu    def sr29add    = "b010_0100".U // sr29add: src1[63:29] + src2
260675acc68SYinan Xu    def sr30add    = "b010_0101".U // sr30add: src1[63:30] + src2
261675acc68SYinan Xu    def sr31add    = "b010_0110".U // sr31add: src1[63:31] + src2
262675acc68SYinan Xu    def sr32add    = "b010_0111".U // sr32add: src1[63:32] + src2
263675acc68SYinan Xu
264675acc68SYinan Xu    def sh1adduw   = "b010_1000".U // sh1adduw: {src1[31:0], 1'b0} + src2
265675acc68SYinan Xu    def sh1add     = "b010_1001".U // sh1add: {src1[62:0], 1'b0} + src2
266675acc68SYinan Xu    def sh2adduw   = "b010_1010".U // sh2add_uw: {src1[31:0], 2'b0} + src2
267675acc68SYinan Xu    def sh2add     = "b010_1011".U // sh2add: {src1[61:0], 2'b0} + src2
268675acc68SYinan Xu    def sh3adduw   = "b010_1100".U // sh3add_uw: {src1[31:0], 3'b0} + src2
269675acc68SYinan Xu    def sh3add     = "b010_1101".U // sh3add: {src1[60:0], 3'b0} + src2
270675acc68SYinan Xu    def sh4add     = "b010_1111".U // sh4add: {src1[59:0], 4'b0} + src2
271675acc68SYinan Xu
272675acc68SYinan Xu    // SUB-op: src1 - src2
273675acc68SYinan Xu    def sub        = "b011_0000".U
274675acc68SYinan Xu    def sltu       = "b011_0001".U
275675acc68SYinan Xu    def slt        = "b011_0010".U
276675acc68SYinan Xu    def maxu       = "b011_0100".U
277675acc68SYinan Xu    def minu       = "b011_0101".U
278675acc68SYinan Xu    def max        = "b011_0110".U
279675acc68SYinan Xu    def min        = "b011_0111".U
280675acc68SYinan Xu
281675acc68SYinan Xu    // branch
282675acc68SYinan Xu    def beq        = "b111_0000".U
283675acc68SYinan Xu    def bne        = "b111_0010".U
284675acc68SYinan Xu    def blt        = "b111_1000".U
285675acc68SYinan Xu    def bge        = "b111_1010".U
286675acc68SYinan Xu    def bltu       = "b111_1100".U
287675acc68SYinan Xu    def bgeu       = "b111_1110".U
288675acc68SYinan Xu
289675acc68SYinan Xu    // misc optype
290675acc68SYinan Xu    def and        = "b100_0000".U
291675acc68SYinan Xu    def andn       = "b100_0001".U
292675acc68SYinan Xu    def or         = "b100_0010".U
293675acc68SYinan Xu    def orn        = "b100_0011".U
294675acc68SYinan Xu    def xor        = "b100_0100".U
295675acc68SYinan Xu    def xnor       = "b100_0101".U
296675acc68SYinan Xu    def orcb       = "b100_0110".U
297675acc68SYinan Xu
298675acc68SYinan Xu    def sextb      = "b100_1000".U
299675acc68SYinan Xu    def packh      = "b100_1001".U
300675acc68SYinan Xu    def sexth      = "b100_1010".U
301675acc68SYinan Xu    def packw      = "b100_1011".U
302675acc68SYinan Xu
303675acc68SYinan Xu    def revb       = "b101_0000".U
304675acc68SYinan Xu    def rev8       = "b101_0001".U
305675acc68SYinan Xu    def pack       = "b101_0010".U
306675acc68SYinan Xu    def orh48      = "b101_0011".U
307675acc68SYinan Xu
308675acc68SYinan Xu    def szewl1     = "b101_1000".U
309675acc68SYinan Xu    def szewl2     = "b101_1001".U
310675acc68SYinan Xu    def szewl3     = "b101_1010".U
311675acc68SYinan Xu    def byte2      = "b101_1011".U
312675acc68SYinan Xu
313675acc68SYinan Xu    def andlsb     = "b110_0000".U
314675acc68SYinan Xu    def andzexth   = "b110_0001".U
315675acc68SYinan Xu    def orlsb      = "b110_0010".U
316675acc68SYinan Xu    def orzexth    = "b110_0011".U
317675acc68SYinan Xu    def xorlsb     = "b110_0100".U
318675acc68SYinan Xu    def xorzexth   = "b110_0101".U
319675acc68SYinan Xu    def orcblsb    = "b110_0110".U
320675acc68SYinan Xu    def orcbzexth  = "b110_0111".U
321675acc68SYinan Xu
322675acc68SYinan Xu    def isAddw(func: UInt) = func(6, 4) === "b001".U && !func(3) && !func(1)
323675acc68SYinan Xu    def isSimpleLogic(func: UInt) = func(6, 4) === "b100".U && !func(0)
324675acc68SYinan Xu    def logicToLsb(func: UInt) = Cat("b110".U(3.W), func(3, 1), 0.U(1.W))
325675acc68SYinan Xu    def logicToZexth(func: UInt) = Cat("b110".U(3.W), func(3, 1), 1.U(1.W))
326675acc68SYinan Xu    def isBranch(func: UInt) = func(6, 4) === "b111".U
327675acc68SYinan Xu    def getBranchType(func: UInt) = func(3, 2)
328675acc68SYinan Xu    def isBranchInvert(func: UInt) = func(1)
329675acc68SYinan Xu
330675acc68SYinan Xu    def apply() = UInt(7.W)
3312225d46eSJiawei Lin  }
3322225d46eSJiawei Lin
3332225d46eSJiawei Lin  object MDUOpType {
3342225d46eSJiawei Lin    // mul
3352225d46eSJiawei Lin    // bit encoding: | type (2bit) | isWord(1bit) | opcode(2bit) |
3362225d46eSJiawei Lin    def mul    = "b00000".U
3372225d46eSJiawei Lin    def mulh   = "b00001".U
3382225d46eSJiawei Lin    def mulhsu = "b00010".U
3392225d46eSJiawei Lin    def mulhu  = "b00011".U
3402225d46eSJiawei Lin    def mulw   = "b00100".U
3412225d46eSJiawei Lin
34288825c5cSYinan Xu    def mulw7  = "b01100".U
34388825c5cSYinan Xu
3442225d46eSJiawei Lin    // div
3452225d46eSJiawei Lin    // bit encoding: | type (2bit) | isWord(1bit) | isSign(1bit) | opcode(1bit) |
34688825c5cSYinan Xu    def div    = "b10000".U
34788825c5cSYinan Xu    def divu   = "b10010".U
34888825c5cSYinan Xu    def rem    = "b10001".U
34988825c5cSYinan Xu    def remu   = "b10011".U
3502225d46eSJiawei Lin
35188825c5cSYinan Xu    def divw   = "b10100".U
35288825c5cSYinan Xu    def divuw  = "b10110".U
35388825c5cSYinan Xu    def remw   = "b10101".U
35488825c5cSYinan Xu    def remuw  = "b10111".U
3552225d46eSJiawei Lin
35688825c5cSYinan Xu    def isMul(op: UInt) = !op(4)
35788825c5cSYinan Xu    def isDiv(op: UInt) = op(4)
3582225d46eSJiawei Lin
3592225d46eSJiawei Lin    def isDivSign(op: UInt) = isDiv(op) && !op(1)
3602225d46eSJiawei Lin    def isW(op: UInt) = op(2)
3612225d46eSJiawei Lin    def isH(op: UInt) = (isDiv(op) && op(0)) || (isMul(op) && op(1, 0) =/= 0.U)
3622225d46eSJiawei Lin    def getMulOp(op: UInt) = op(1, 0)
3632225d46eSJiawei Lin  }
3642225d46eSJiawei Lin
3652225d46eSJiawei Lin  object LSUOpType {
366d200f594SWilliam Wang    // load pipeline
3672225d46eSJiawei Lin
368d200f594SWilliam Wang    // normal load
369d200f594SWilliam Wang    // Note: bit(1, 0) are size, DO NOT CHANGE
370d200f594SWilliam Wang    // bit encoding: | load 0 | is unsigned(1bit) | size(2bit) |
371d200f594SWilliam Wang    def lb       = "b0000".U
372d200f594SWilliam Wang    def lh       = "b0001".U
373d200f594SWilliam Wang    def lw       = "b0010".U
374d200f594SWilliam Wang    def ld       = "b0011".U
375d200f594SWilliam Wang    def lbu      = "b0100".U
376d200f594SWilliam Wang    def lhu      = "b0101".U
377d200f594SWilliam Wang    def lwu      = "b0110".U
378ca18a0b4SWilliam Wang
379d200f594SWilliam Wang    // Zicbop software prefetch
380d200f594SWilliam Wang    // bit encoding: | prefetch 1 | 0 | prefetch type (2bit) |
381d200f594SWilliam Wang    def prefetch_i = "b1000".U // TODO
382d200f594SWilliam Wang    def prefetch_r = "b1001".U
383d200f594SWilliam Wang    def prefetch_w = "b1010".U
384ca18a0b4SWilliam Wang
385d200f594SWilliam Wang    def isPrefetch(op: UInt): Bool = op(3)
386d200f594SWilliam Wang
387d200f594SWilliam Wang    // store pipeline
388d200f594SWilliam Wang    // normal store
389d200f594SWilliam Wang    // bit encoding: | store 00 | size(2bit) |
390d200f594SWilliam Wang    def sb       = "b0000".U
391d200f594SWilliam Wang    def sh       = "b0001".U
392d200f594SWilliam Wang    def sw       = "b0010".U
393d200f594SWilliam Wang    def sd       = "b0011".U
394d200f594SWilliam Wang
395d200f594SWilliam Wang    // l1 cache op
396d200f594SWilliam Wang    // bit encoding: | cbo_zero 01 | size(2bit) 11 |
397d200f594SWilliam Wang    def cbo_zero  = "b0111".U
398d200f594SWilliam Wang
399d200f594SWilliam Wang    // llc op
400d200f594SWilliam Wang    // bit encoding: | prefetch 11 | suboptype(2bit) |
401d200f594SWilliam Wang    def cbo_clean = "b1100".U
402d200f594SWilliam Wang    def cbo_flush = "b1101".U
403d200f594SWilliam Wang    def cbo_inval = "b1110".U
404d200f594SWilliam Wang
405d200f594SWilliam Wang    def isCbo(op: UInt): Bool = op(3, 2) === "b11".U
4062225d46eSJiawei Lin
4072225d46eSJiawei Lin    // atomics
4082225d46eSJiawei Lin    // bit(1, 0) are size
4092225d46eSJiawei Lin    // since atomics use a different fu type
4102225d46eSJiawei Lin    // so we can safely reuse other load/store's encodings
411d200f594SWilliam Wang    // bit encoding: | optype(4bit) | size (2bit) |
4122225d46eSJiawei Lin    def lr_w      = "b000010".U
4132225d46eSJiawei Lin    def sc_w      = "b000110".U
4142225d46eSJiawei Lin    def amoswap_w = "b001010".U
4152225d46eSJiawei Lin    def amoadd_w  = "b001110".U
4162225d46eSJiawei Lin    def amoxor_w  = "b010010".U
4172225d46eSJiawei Lin    def amoand_w  = "b010110".U
4182225d46eSJiawei Lin    def amoor_w   = "b011010".U
4192225d46eSJiawei Lin    def amomin_w  = "b011110".U
4202225d46eSJiawei Lin    def amomax_w  = "b100010".U
4212225d46eSJiawei Lin    def amominu_w = "b100110".U
4222225d46eSJiawei Lin    def amomaxu_w = "b101010".U
4232225d46eSJiawei Lin
4242225d46eSJiawei Lin    def lr_d      = "b000011".U
4252225d46eSJiawei Lin    def sc_d      = "b000111".U
4262225d46eSJiawei Lin    def amoswap_d = "b001011".U
4272225d46eSJiawei Lin    def amoadd_d  = "b001111".U
4282225d46eSJiawei Lin    def amoxor_d  = "b010011".U
4292225d46eSJiawei Lin    def amoand_d  = "b010111".U
4302225d46eSJiawei Lin    def amoor_d   = "b011011".U
4312225d46eSJiawei Lin    def amomin_d  = "b011111".U
4322225d46eSJiawei Lin    def amomax_d  = "b100011".U
4332225d46eSJiawei Lin    def amominu_d = "b100111".U
4342225d46eSJiawei Lin    def amomaxu_d = "b101011".U
435b6982e83SLemover
436b6982e83SLemover    def size(op: UInt) = op(1,0)
4372225d46eSJiawei Lin  }
4382225d46eSJiawei Lin
4393feeca58Szfw  object BKUOpType {
440ee8ff153Szfw
4413feeca58Szfw    def clmul       = "b000000".U
4423feeca58Szfw    def clmulh      = "b000001".U
4433feeca58Szfw    def clmulr      = "b000010".U
4443feeca58Szfw    def xpermn      = "b000100".U
4453feeca58Szfw    def xpermb      = "b000101".U
446ee8ff153Szfw
4473feeca58Szfw    def clz         = "b001000".U
4483feeca58Szfw    def clzw        = "b001001".U
4493feeca58Szfw    def ctz         = "b001010".U
4503feeca58Szfw    def ctzw        = "b001011".U
4513feeca58Szfw    def cpop        = "b001100".U
4523feeca58Szfw    def cpopw       = "b001101".U
45307596dc6Szfw
4543feeca58Szfw    // 01xxxx is reserve
4553feeca58Szfw    def aes64es     = "b100000".U
4563feeca58Szfw    def aes64esm    = "b100001".U
4573feeca58Szfw    def aes64ds     = "b100010".U
4583feeca58Szfw    def aes64dsm    = "b100011".U
4593feeca58Szfw    def aes64im     = "b100100".U
4603feeca58Szfw    def aes64ks1i   = "b100101".U
4613feeca58Szfw    def aes64ks2    = "b100110".U
4623feeca58Szfw
4633feeca58Szfw    // merge to two instruction sm4ks & sm4ed
46419bcce38SFawang Zhang    def sm4ed0      = "b101000".U
46519bcce38SFawang Zhang    def sm4ed1      = "b101001".U
46619bcce38SFawang Zhang    def sm4ed2      = "b101010".U
46719bcce38SFawang Zhang    def sm4ed3      = "b101011".U
46819bcce38SFawang Zhang    def sm4ks0      = "b101100".U
46919bcce38SFawang Zhang    def sm4ks1      = "b101101".U
47019bcce38SFawang Zhang    def sm4ks2      = "b101110".U
47119bcce38SFawang Zhang    def sm4ks3      = "b101111".U
4723feeca58Szfw
4733feeca58Szfw    def sha256sum0  = "b110000".U
4743feeca58Szfw    def sha256sum1  = "b110001".U
4753feeca58Szfw    def sha256sig0  = "b110010".U
4763feeca58Szfw    def sha256sig1  = "b110011".U
4773feeca58Szfw    def sha512sum0  = "b110100".U
4783feeca58Szfw    def sha512sum1  = "b110101".U
4793feeca58Szfw    def sha512sig0  = "b110110".U
4803feeca58Szfw    def sha512sig1  = "b110111".U
4813feeca58Szfw
4823feeca58Szfw    def sm3p0       = "b111000".U
4833feeca58Szfw    def sm3p1       = "b111001".U
484ee8ff153Szfw  }
485ee8ff153Szfw
4862225d46eSJiawei Lin  object BTBtype {
4872225d46eSJiawei Lin    def B = "b00".U  // branch
4882225d46eSJiawei Lin    def J = "b01".U  // jump
4892225d46eSJiawei Lin    def I = "b10".U  // indirect
4902225d46eSJiawei Lin    def R = "b11".U  // return
4912225d46eSJiawei Lin
4922225d46eSJiawei Lin    def apply() = UInt(2.W)
4932225d46eSJiawei Lin  }
4942225d46eSJiawei Lin
4952225d46eSJiawei Lin  object SelImm {
496ee8ff153Szfw    def IMM_X  = "b0111".U
497ee8ff153Szfw    def IMM_S  = "b0000".U
498ee8ff153Szfw    def IMM_SB = "b0001".U
499ee8ff153Szfw    def IMM_U  = "b0010".U
500ee8ff153Szfw    def IMM_UJ = "b0011".U
501ee8ff153Szfw    def IMM_I  = "b0100".U
502ee8ff153Szfw    def IMM_Z  = "b0101".U
503ee8ff153Szfw    def INVALID_INSTR = "b0110".U
504ee8ff153Szfw    def IMM_B6 = "b1000".U
5052225d46eSJiawei Lin
5066e7c9679Shuxuan0307    def X      = BitPat("b????")
5076e7c9679Shuxuan0307
508ee8ff153Szfw    def apply() = UInt(4.W)
5092225d46eSJiawei Lin  }
5102225d46eSJiawei Lin
5116ab6918fSYinan Xu  object ExceptionNO {
5126ab6918fSYinan Xu    def instrAddrMisaligned = 0
5136ab6918fSYinan Xu    def instrAccessFault    = 1
5146ab6918fSYinan Xu    def illegalInstr        = 2
5156ab6918fSYinan Xu    def breakPoint          = 3
5166ab6918fSYinan Xu    def loadAddrMisaligned  = 4
5176ab6918fSYinan Xu    def loadAccessFault     = 5
5186ab6918fSYinan Xu    def storeAddrMisaligned = 6
5196ab6918fSYinan Xu    def storeAccessFault    = 7
5206ab6918fSYinan Xu    def ecallU              = 8
5216ab6918fSYinan Xu    def ecallS              = 9
5226ab6918fSYinan Xu    def ecallM              = 11
5236ab6918fSYinan Xu    def instrPageFault      = 12
5246ab6918fSYinan Xu    def loadPageFault       = 13
5256ab6918fSYinan Xu    // def singleStep          = 14
5266ab6918fSYinan Xu    def storePageFault      = 15
5276ab6918fSYinan Xu    def priorities = Seq(
5286ab6918fSYinan Xu      breakPoint, // TODO: different BP has different priority
5296ab6918fSYinan Xu      instrPageFault,
5306ab6918fSYinan Xu      instrAccessFault,
5316ab6918fSYinan Xu      illegalInstr,
5326ab6918fSYinan Xu      instrAddrMisaligned,
5336ab6918fSYinan Xu      ecallM, ecallS, ecallU,
534d880177dSYinan Xu      storeAddrMisaligned,
535d880177dSYinan Xu      loadAddrMisaligned,
5366ab6918fSYinan Xu      storePageFault,
5376ab6918fSYinan Xu      loadPageFault,
5386ab6918fSYinan Xu      storeAccessFault,
539d880177dSYinan Xu      loadAccessFault
5406ab6918fSYinan Xu    )
5416ab6918fSYinan Xu    def all = priorities.distinct.sorted
5426ab6918fSYinan Xu    def frontendSet = Seq(
5436ab6918fSYinan Xu      instrAddrMisaligned,
5446ab6918fSYinan Xu      instrAccessFault,
5456ab6918fSYinan Xu      illegalInstr,
5466ab6918fSYinan Xu      instrPageFault
5476ab6918fSYinan Xu    )
5486ab6918fSYinan Xu    def partialSelect(vec: Vec[Bool], select: Seq[Int]): Vec[Bool] = {
5496ab6918fSYinan Xu      val new_vec = Wire(ExceptionVec())
5506ab6918fSYinan Xu      new_vec.foreach(_ := false.B)
5516ab6918fSYinan Xu      select.foreach(i => new_vec(i) := vec(i))
5526ab6918fSYinan Xu      new_vec
5536ab6918fSYinan Xu    }
5546ab6918fSYinan Xu    def selectFrontend(vec: Vec[Bool]): Vec[Bool] = partialSelect(vec, frontendSet)
5556ab6918fSYinan Xu    def selectAll(vec: Vec[Bool]): Vec[Bool] = partialSelect(vec, ExceptionNO.all)
5566ab6918fSYinan Xu    def selectByFu(vec:Vec[Bool], fuConfig: FuConfig): Vec[Bool] =
5576ab6918fSYinan Xu      partialSelect(vec, fuConfig.exceptionOut)
5586ab6918fSYinan Xu    def selectByExu(vec:Vec[Bool], exuConfig: ExuConfig): Vec[Bool] =
5596ab6918fSYinan Xu      partialSelect(vec, exuConfig.exceptionOut)
5606ab6918fSYinan Xu    def selectByExu(vec:Vec[Bool], exuConfigs: Seq[ExuConfig]): Vec[Bool] =
5616ab6918fSYinan Xu      partialSelect(vec, exuConfigs.map(_.exceptionOut).reduce(_ ++ _).distinct.sorted)
5626ab6918fSYinan Xu  }
5636ab6918fSYinan Xu
5641c62c387SYinan Xu  def dividerGen(p: Parameters) = new DividerWrapper(p(XLen))(p)
565c3d7991bSJiawei Lin  def multiplierGen(p: Parameters) = new ArrayMultiplier(p(XLen) + 1)(p)
5662225d46eSJiawei Lin  def aluGen(p: Parameters) = new Alu()(p)
5673feeca58Szfw  def bkuGen(p: Parameters) = new Bku()(p)
5682225d46eSJiawei Lin  def jmpGen(p: Parameters) = new Jump()(p)
5692225d46eSJiawei Lin  def fenceGen(p: Parameters) = new Fence()(p)
5702225d46eSJiawei Lin  def csrGen(p: Parameters) = new CSR()(p)
5712225d46eSJiawei Lin  def i2fGen(p: Parameters) = new IntToFP()(p)
5722225d46eSJiawei Lin  def fmacGen(p: Parameters) = new FMA()(p)
5732225d46eSJiawei Lin  def f2iGen(p: Parameters) = new FPToInt()(p)
5742225d46eSJiawei Lin  def f2fGen(p: Parameters) = new FPToFP()(p)
5752225d46eSJiawei Lin  def fdivSqrtGen(p: Parameters) = new FDivSqrt()(p)
57685b4cd54SYinan Xu  def stdGen(p: Parameters) = new Std()(p)
5776ab6918fSYinan Xu  def mouDataGen(p: Parameters) = new Std()(p)
5782225d46eSJiawei Lin
5796cdd85d9SYinan Xu  def f2iSel(uop: MicroOp): Bool = {
5806cdd85d9SYinan Xu    uop.ctrl.rfWen
5812225d46eSJiawei Lin  }
5822225d46eSJiawei Lin
5836cdd85d9SYinan Xu  def i2fSel(uop: MicroOp): Bool = {
5846cdd85d9SYinan Xu    uop.ctrl.fpu.fromInt
5852225d46eSJiawei Lin  }
5862225d46eSJiawei Lin
5876cdd85d9SYinan Xu  def f2fSel(uop: MicroOp): Bool = {
5886cdd85d9SYinan Xu    val ctrl = uop.ctrl.fpu
5892225d46eSJiawei Lin    ctrl.fpWen && !ctrl.div && !ctrl.sqrt
5902225d46eSJiawei Lin  }
5912225d46eSJiawei Lin
5926cdd85d9SYinan Xu  def fdivSqrtSel(uop: MicroOp): Bool = {
5936cdd85d9SYinan Xu    val ctrl = uop.ctrl.fpu
5942225d46eSJiawei Lin    ctrl.div || ctrl.sqrt
5952225d46eSJiawei Lin  }
5962225d46eSJiawei Lin
5972225d46eSJiawei Lin  val aluCfg = FuConfig(
5981a0f06eeSYinan Xu    name = "alu",
5992225d46eSJiawei Lin    fuGen = aluGen,
6006cdd85d9SYinan Xu    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.alu,
6012225d46eSJiawei Lin    fuType = FuType.alu,
6022225d46eSJiawei Lin    numIntSrc = 2,
6032225d46eSJiawei Lin    numFpSrc = 0,
6042225d46eSJiawei Lin    writeIntRf = true,
6052225d46eSJiawei Lin    writeFpRf = false,
6062225d46eSJiawei Lin    hasRedirect = true,
6072225d46eSJiawei Lin  )
6082225d46eSJiawei Lin
6092225d46eSJiawei Lin  val jmpCfg = FuConfig(
6101a0f06eeSYinan Xu    name = "jmp",
6112225d46eSJiawei Lin    fuGen = jmpGen,
6126cdd85d9SYinan Xu    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.jmp,
6132225d46eSJiawei Lin    fuType = FuType.jmp,
6142225d46eSJiawei Lin    numIntSrc = 1,
6152225d46eSJiawei Lin    numFpSrc = 0,
6162225d46eSJiawei Lin    writeIntRf = true,
6172225d46eSJiawei Lin    writeFpRf = false,
6182225d46eSJiawei Lin    hasRedirect = true,
6192225d46eSJiawei Lin  )
6202225d46eSJiawei Lin
6212225d46eSJiawei Lin  val fenceCfg = FuConfig(
6221a0f06eeSYinan Xu    name = "fence",
6232225d46eSJiawei Lin    fuGen = fenceGen,
6246cdd85d9SYinan Xu    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.fence,
6256ab6918fSYinan Xu    FuType.fence, 2, 0, writeIntRf = false, writeFpRf = false,
626f1fe8698SLemover    latency = UncertainLatency(), exceptionOut = Seq(illegalInstr), // TODO: need rewrite latency structure, not just this value,
627f1fe8698SLemover    flushPipe = true
6282225d46eSJiawei Lin  )
6292225d46eSJiawei Lin
6302225d46eSJiawei Lin  val csrCfg = FuConfig(
6311a0f06eeSYinan Xu    name = "csr",
6322225d46eSJiawei Lin    fuGen = csrGen,
6336cdd85d9SYinan Xu    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.csr,
6342225d46eSJiawei Lin    fuType = FuType.csr,
6352225d46eSJiawei Lin    numIntSrc = 1,
6362225d46eSJiawei Lin    numFpSrc = 0,
6372225d46eSJiawei Lin    writeIntRf = true,
6382225d46eSJiawei Lin    writeFpRf = false,
6396ab6918fSYinan Xu    exceptionOut = Seq(illegalInstr, breakPoint, ecallU, ecallS, ecallM),
6406ab6918fSYinan Xu    flushPipe = true
6412225d46eSJiawei Lin  )
6422225d46eSJiawei Lin
6432225d46eSJiawei Lin  val i2fCfg = FuConfig(
6441a0f06eeSYinan Xu    name = "i2f",
6452225d46eSJiawei Lin    fuGen = i2fGen,
6462225d46eSJiawei Lin    fuSel = i2fSel,
6472225d46eSJiawei Lin    FuType.i2f,
6482225d46eSJiawei Lin    numIntSrc = 1,
6492225d46eSJiawei Lin    numFpSrc = 0,
6502225d46eSJiawei Lin    writeIntRf = false,
6512225d46eSJiawei Lin    writeFpRf = true,
6526ab6918fSYinan Xu    writeFflags = true,
653e174d629SJiawei Lin    latency = CertainLatency(2),
654e174d629SJiawei Lin    fastUopOut = true, fastImplemented = true
6552225d46eSJiawei Lin  )
6562225d46eSJiawei Lin
6572225d46eSJiawei Lin  val divCfg = FuConfig(
6581a0f06eeSYinan Xu    name = "div",
6592225d46eSJiawei Lin    fuGen = dividerGen,
66007596dc6Szfw    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.div,
6612225d46eSJiawei Lin    FuType.div,
6622225d46eSJiawei Lin    2,
6632225d46eSJiawei Lin    0,
6642225d46eSJiawei Lin    writeIntRf = true,
6652225d46eSJiawei Lin    writeFpRf = false,
666f83b578aSYinan Xu    latency = UncertainLatency(),
667f83b578aSYinan Xu    fastUopOut = true,
6681c62c387SYinan Xu    fastImplemented = true,
669*5ee7cabeSYinan Xu    hasInputBuffer = (true, 4, true)
6702225d46eSJiawei Lin  )
6712225d46eSJiawei Lin
6722225d46eSJiawei Lin  val mulCfg = FuConfig(
6731a0f06eeSYinan Xu    name = "mul",
6742225d46eSJiawei Lin    fuGen = multiplierGen,
67507596dc6Szfw    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.mul,
6762225d46eSJiawei Lin    FuType.mul,
6772225d46eSJiawei Lin    2,
6782225d46eSJiawei Lin    0,
6792225d46eSJiawei Lin    writeIntRf = true,
6802225d46eSJiawei Lin    writeFpRf = false,
681b2482bc1SYinan Xu    latency = CertainLatency(2),
682f83b578aSYinan Xu    fastUopOut = true,
683b2482bc1SYinan Xu    fastImplemented = true
6842225d46eSJiawei Lin  )
6852225d46eSJiawei Lin
6863feeca58Szfw  val bkuCfg = FuConfig(
6873feeca58Szfw    name = "bku",
6883feeca58Szfw    fuGen = bkuGen,
6893feeca58Szfw    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.bku,
6903feeca58Szfw    fuType = FuType.bku,
691ee8ff153Szfw    numIntSrc = 2,
692ee8ff153Szfw    numFpSrc = 0,
693ee8ff153Szfw    writeIntRf = true,
694ee8ff153Szfw    writeFpRf = false,
695f83b578aSYinan Xu    latency = CertainLatency(1),
696f83b578aSYinan Xu    fastUopOut = true,
69707596dc6Szfw    fastImplemented = true
698ee8ff153Szfw )
699ee8ff153Szfw
7002225d46eSJiawei Lin  val fmacCfg = FuConfig(
7011a0f06eeSYinan Xu    name = "fmac",
7022225d46eSJiawei Lin    fuGen = fmacGen,
7032225d46eSJiawei Lin    fuSel = _ => true.B,
7046ab6918fSYinan Xu    FuType.fmac, 0, 3, writeIntRf = false, writeFpRf = true, writeFflags = true,
7054b65fc7eSJiawei Lin    latency = UncertainLatency(), fastUopOut = true, fastImplemented = true
7062225d46eSJiawei Lin  )
7072225d46eSJiawei Lin
7082225d46eSJiawei Lin  val f2iCfg = FuConfig(
7091a0f06eeSYinan Xu    name = "f2i",
7102225d46eSJiawei Lin    fuGen = f2iGen,
7112225d46eSJiawei Lin    fuSel = f2iSel,
7126ab6918fSYinan Xu    FuType.fmisc, 0, 1, writeIntRf = true, writeFpRf = false, writeFflags = true, latency = CertainLatency(2),
713b2482bc1SYinan Xu    fastUopOut = true, fastImplemented = true
7142225d46eSJiawei Lin  )
7152225d46eSJiawei Lin
7162225d46eSJiawei Lin  val f2fCfg = FuConfig(
7171a0f06eeSYinan Xu    name = "f2f",
7182225d46eSJiawei Lin    fuGen = f2fGen,
7192225d46eSJiawei Lin    fuSel = f2fSel,
7206ab6918fSYinan Xu    FuType.fmisc, 0, 1, writeIntRf = false, writeFpRf = true, writeFflags = true, latency = CertainLatency(2),
721b2482bc1SYinan Xu    fastUopOut = true, fastImplemented = true
7222225d46eSJiawei Lin  )
7232225d46eSJiawei Lin
7242225d46eSJiawei Lin  val fdivSqrtCfg = FuConfig(
7251a0f06eeSYinan Xu    name = "fdivSqrt",
7262225d46eSJiawei Lin    fuGen = fdivSqrtGen,
7272225d46eSJiawei Lin    fuSel = fdivSqrtSel,
7286ab6918fSYinan Xu    FuType.fDivSqrt, 0, 2, writeIntRf = false, writeFpRf = true, writeFflags = true, latency = UncertainLatency(),
729*5ee7cabeSYinan Xu    fastUopOut = true, fastImplemented = true, hasInputBuffer = (true, 8, false)
7302225d46eSJiawei Lin  )
7312225d46eSJiawei Lin
7322225d46eSJiawei Lin  val lduCfg = FuConfig(
7331a0f06eeSYinan Xu    "ldu",
7342225d46eSJiawei Lin    null, // DontCare
7352b4e8253SYinan Xu    (uop: MicroOp) => FuType.loadCanAccept(uop.ctrl.fuType),
7366ab6918fSYinan Xu    FuType.ldu, 1, 0, writeIntRf = true, writeFpRf = true,
7376ab6918fSYinan Xu    latency = UncertainLatency(),
7386ab6918fSYinan Xu    exceptionOut = Seq(loadAddrMisaligned, loadAccessFault, loadPageFault),
7396ab6918fSYinan Xu    flushPipe = true,
7406786cfb7SWilliam Wang    replayInst = true,
7416786cfb7SWilliam Wang    hasLoadError = true
7422225d46eSJiawei Lin  )
7432225d46eSJiawei Lin
74485b4cd54SYinan Xu  val staCfg = FuConfig(
7451a0f06eeSYinan Xu    "sta",
7462225d46eSJiawei Lin    null,
7472b4e8253SYinan Xu    (uop: MicroOp) => FuType.storeCanAccept(uop.ctrl.fuType),
7486ab6918fSYinan Xu    FuType.stu, 1, 0, writeIntRf = false, writeFpRf = false,
7496ab6918fSYinan Xu    latency = UncertainLatency(),
7506ab6918fSYinan Xu    exceptionOut = Seq(storeAddrMisaligned, storeAccessFault, storePageFault)
7512225d46eSJiawei Lin  )
7522225d46eSJiawei Lin
75385b4cd54SYinan Xu  val stdCfg = FuConfig(
7541a0f06eeSYinan Xu    "std",
7552b4e8253SYinan Xu    fuGen = stdGen, fuSel = (uop: MicroOp) => FuType.storeCanAccept(uop.ctrl.fuType), FuType.stu, 1, 1,
7566ab6918fSYinan Xu    writeIntRf = false, writeFpRf = false, latency = CertainLatency(1)
75785b4cd54SYinan Xu  )
75885b4cd54SYinan Xu
7592225d46eSJiawei Lin  val mouCfg = FuConfig(
7601a0f06eeSYinan Xu    "mou",
7612225d46eSJiawei Lin    null,
7622b4e8253SYinan Xu    (uop: MicroOp) => FuType.storeCanAccept(uop.ctrl.fuType),
7636ab6918fSYinan Xu    FuType.mou, 1, 0, writeIntRf = false, writeFpRf = false,
7646ab6918fSYinan Xu    latency = UncertainLatency(), exceptionOut = lduCfg.exceptionOut ++ staCfg.exceptionOut
7652b4e8253SYinan Xu  )
7662b4e8253SYinan Xu
7672b4e8253SYinan Xu  val mouDataCfg = FuConfig(
7682b4e8253SYinan Xu    "mou",
7692b4e8253SYinan Xu    mouDataGen,
7702b4e8253SYinan Xu    (uop: MicroOp) => FuType.storeCanAccept(uop.ctrl.fuType),
7716ab6918fSYinan Xu    FuType.mou, 1, 0, writeIntRf = false, writeFpRf = false,
7726ab6918fSYinan Xu    latency = UncertainLatency()
7732225d46eSJiawei Lin  )
7742225d46eSJiawei Lin
775adb5df20SYinan Xu  val JumpExeUnitCfg = ExuConfig("JmpExeUnit", "Int", Seq(jmpCfg, i2fCfg), 2, Int.MaxValue)
776b6220f0dSLemover  val AluExeUnitCfg = ExuConfig("AluExeUnit", "Int", Seq(aluCfg), 0, Int.MaxValue)
777adb5df20SYinan Xu  val JumpCSRExeUnitCfg = ExuConfig("JmpCSRExeUnit", "Int", Seq(jmpCfg, csrCfg, fenceCfg, i2fCfg), 2, Int.MaxValue)
7783feeca58Szfw  val MulDivExeUnitCfg = ExuConfig("MulDivExeUnit", "Int", Seq(mulCfg, divCfg, bkuCfg), 1, Int.MaxValue)
779b6220f0dSLemover  val FmacExeUnitCfg = ExuConfig("FmacExeUnit", "Fp", Seq(fmacCfg), Int.MaxValue, 0)
7802225d46eSJiawei Lin  val FmiscExeUnitCfg = ExuConfig(
7812225d46eSJiawei Lin    "FmiscExeUnit",
782b6220f0dSLemover    "Fp",
7832225d46eSJiawei Lin    Seq(f2iCfg, f2fCfg, fdivSqrtCfg),
7842225d46eSJiawei Lin    Int.MaxValue, 1
7852225d46eSJiawei Lin  )
7862b4e8253SYinan Xu  val LdExeUnitCfg = ExuConfig("LoadExu", "Mem", Seq(lduCfg), wbIntPriority = 0, wbFpPriority = 0, extendsExu = false)
7872b4e8253SYinan Xu  val StaExeUnitCfg = ExuConfig("StaExu", "Mem", Seq(staCfg, mouCfg), wbIntPriority = Int.MaxValue, wbFpPriority = Int.MaxValue, extendsExu = false)
7882b4e8253SYinan Xu  val StdExeUnitCfg = ExuConfig("StdExu", "Mem", Seq(stdCfg, mouDataCfg), wbIntPriority = Int.MaxValue, wbFpPriority = Int.MaxValue, extendsExu = false)
7899a2e6b8aSLinJiawei}
790