xref: /XiangShan/src/main/scala/xiangshan/package.scala (revision d2b20d1a96e238e36a849bd253f65ec7b6a5db38)
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
71*d2b20d1aSTang Haojin    def mou          = "b1111".U // for amo, lr, sc
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
87*d2b20d1aSTang Haojin    def isDivSqrt(fuType: UInt) = fuType === div || fuType === fDivSqrt
88af2f7849Shappy-lx    def isSvinvalBegin(fuType: UInt, func: UInt, flush: Bool) = isFence(fuType) && func === FenceOpType.nofence && !flush
89af2f7849Shappy-lx    def isSvinval(fuType: UInt, func: UInt, flush: Bool) = isFence(fuType) && func === FenceOpType.sfence && !flush
90af2f7849Shappy-lx    def isSvinvalEnd(fuType: UInt, func: UInt, flush: Bool) = isFence(fuType) && func === FenceOpType.nofence && flush
91af2f7849Shappy-lx
9292ab24ebSYinan Xu
9392ab24ebSYinan Xu    def jmpCanAccept(fuType: UInt) = !fuType(2)
94ee8ff153Szfw    def mduCanAccept(fuType: UInt) = fuType(2) && !fuType(1) || fuType(2) && fuType(1) && fuType(0)
95ee8ff153Szfw    def aluCanAccept(fuType: UInt) = fuType(2) && fuType(1) && !fuType(0)
9692ab24ebSYinan Xu
9792ab24ebSYinan Xu    def fmacCanAccept(fuType: UInt) = !fuType(1)
9892ab24ebSYinan Xu    def fmiscCanAccept(fuType: UInt) = fuType(1)
9992ab24ebSYinan Xu
10092ab24ebSYinan Xu    def loadCanAccept(fuType: UInt) = !fuType(0)
10192ab24ebSYinan Xu    def storeCanAccept(fuType: UInt) = fuType(0)
10292ab24ebSYinan Xu
10392ab24ebSYinan Xu    def storeIsAMO(fuType: UInt) = fuType(1)
104cafb3558SLinJiawei
105cafb3558SLinJiawei    val functionNameMap = Map(
106cafb3558SLinJiawei      jmp.litValue() -> "jmp",
107ebb8ebf8SYinan Xu      i2f.litValue() -> "int_to_float",
108cafb3558SLinJiawei      csr.litValue() -> "csr",
109cafb3558SLinJiawei      alu.litValue() -> "alu",
110cafb3558SLinJiawei      mul.litValue() -> "mul",
111cafb3558SLinJiawei      div.litValue() -> "div",
112b8f08ca0SZhangZifei      fence.litValue() -> "fence",
1133feeca58Szfw      bku.litValue() -> "bku",
114cafb3558SLinJiawei      fmac.litValue() -> "fmac",
115cafb3558SLinJiawei      fmisc.litValue() -> "fmisc",
116d18dc7e6Swakafa      fDivSqrt.litValue() -> "fdiv_fsqrt",
117cafb3558SLinJiawei      ldu.litValue() -> "load",
118ebb8ebf8SYinan Xu      stu.litValue() -> "store",
119ebb8ebf8SYinan Xu      mou.litValue() -> "mou"
120cafb3558SLinJiawei    )
1219a2e6b8aSLinJiawei  }
1229a2e6b8aSLinJiawei
1232225d46eSJiawei Lin  object FuOpType {
124675acc68SYinan Xu    def apply() = UInt(7.W)
125361e6d51SJiuyang Liu    def X = BitPat("b???????")
126ebd97ecbSzhanglinjuan  }
127518d8658SYinan Xu
128a3edac52SYinan Xu  object CommitType {
129c3abb8b6SYinan Xu    def NORMAL = "b000".U  // int/fp
130c3abb8b6SYinan Xu    def BRANCH = "b001".U  // branch
131c3abb8b6SYinan Xu    def LOAD   = "b010".U  // load
132c3abb8b6SYinan Xu    def STORE  = "b011".U  // store
133518d8658SYinan Xu
134c3abb8b6SYinan Xu    def apply() = UInt(3.W)
135c3abb8b6SYinan Xu    def isFused(commitType: UInt): Bool = commitType(2)
136c3abb8b6SYinan Xu    def isLoadStore(commitType: UInt): Bool = !isFused(commitType) && commitType(1)
137c3abb8b6SYinan Xu    def lsInstIsStore(commitType: UInt): Bool = commitType(0)
138c3abb8b6SYinan Xu    def isStore(commitType: UInt): Bool = isLoadStore(commitType) && lsInstIsStore(commitType)
139c3abb8b6SYinan Xu    def isBranch(commitType: UInt): Bool = commitType(0) && !commitType(1) && !isFused(commitType)
140518d8658SYinan Xu  }
141bfb958a3SYinan Xu
142bfb958a3SYinan Xu  object RedirectLevel {
1432d7c7105SYinan Xu    def flushAfter = "b0".U
1442d7c7105SYinan Xu    def flush      = "b1".U
145bfb958a3SYinan Xu
1462d7c7105SYinan Xu    def apply() = UInt(1.W)
1472d7c7105SYinan Xu    // def isUnconditional(level: UInt) = level(1)
148bfb958a3SYinan Xu    def flushItself(level: UInt) = level(0)
1492d7c7105SYinan Xu    // def isException(level: UInt) = level(1) && level(0)
150bfb958a3SYinan Xu  }
151baf8def6SYinan Xu
152baf8def6SYinan Xu  object ExceptionVec {
153da3bf434SMaxpicca-Li    val ExceptionVecSize = 16
154da3bf434SMaxpicca-Li    def apply() = Vec(ExceptionVecSize, Bool())
155baf8def6SYinan Xu  }
156a8e04b1dSYinan Xu
157c60c1ab4SWilliam Wang  object PMAMode {
1588d9a04fcSWilliam Wang    def R = "b1".U << 0 //readable
1598d9a04fcSWilliam Wang    def W = "b1".U << 1 //writeable
1608d9a04fcSWilliam Wang    def X = "b1".U << 2 //executable
1618d9a04fcSWilliam Wang    def I = "b1".U << 3 //cacheable: icache
1628d9a04fcSWilliam Wang    def D = "b1".U << 4 //cacheable: dcache
1638d9a04fcSWilliam Wang    def S = "b1".U << 5 //enable speculative access
164cff68e26SWilliam Wang    def A = "b1".U << 6 //enable atomic operation, A imply R & W
1658d9a04fcSWilliam Wang    def C = "b1".U << 7 //if it is cacheable is configable
166c60c1ab4SWilliam Wang    def Reserved = "b0".U
167c60c1ab4SWilliam Wang
168c60c1ab4SWilliam Wang    def apply() = UInt(7.W)
169c60c1ab4SWilliam Wang
170c60c1ab4SWilliam Wang    def read(mode: UInt) = mode(0)
171c60c1ab4SWilliam Wang    def write(mode: UInt) = mode(1)
172c60c1ab4SWilliam Wang    def execute(mode: UInt) = mode(2)
173c60c1ab4SWilliam Wang    def icache(mode: UInt) = mode(3)
174c60c1ab4SWilliam Wang    def dcache(mode: UInt) = mode(4)
175c60c1ab4SWilliam Wang    def speculate(mode: UInt) = mode(5)
176c60c1ab4SWilliam Wang    def atomic(mode: UInt) = mode(6)
177c60c1ab4SWilliam Wang    def configable_cache(mode: UInt) = mode(7)
178c60c1ab4SWilliam Wang
179c60c1ab4SWilliam Wang    def strToMode(s: String) = {
180423b9255SWilliam Wang      var result = 0.U(8.W)
181c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("R") >= 0) result = result + R
182c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("W") >= 0) result = result + W
183c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("X") >= 0) result = result + X
184c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("I") >= 0) result = result + I
185c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("D") >= 0) result = result + D
186c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("S") >= 0) result = result + S
187c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("A") >= 0) result = result + A
188c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("C") >= 0) result = result + C
189c60c1ab4SWilliam Wang      result
190c60c1ab4SWilliam Wang    }
191c60c1ab4SWilliam Wang  }
1922225d46eSJiawei Lin
1932225d46eSJiawei Lin
1942225d46eSJiawei Lin  object CSROpType {
1952225d46eSJiawei Lin    def jmp  = "b000".U
1962225d46eSJiawei Lin    def wrt  = "b001".U
1972225d46eSJiawei Lin    def set  = "b010".U
1982225d46eSJiawei Lin    def clr  = "b011".U
199b6900d94SYinan Xu    def wfi  = "b100".U
2002225d46eSJiawei Lin    def wrti = "b101".U
2012225d46eSJiawei Lin    def seti = "b110".U
2022225d46eSJiawei Lin    def clri = "b111".U
2035d669833SYinan Xu    def needAccess(op: UInt): Bool = op(1, 0) =/= 0.U
2042225d46eSJiawei Lin  }
2052225d46eSJiawei Lin
2062225d46eSJiawei Lin  // jump
2072225d46eSJiawei Lin  object JumpOpType {
2082225d46eSJiawei Lin    def jal  = "b00".U
2092225d46eSJiawei Lin    def jalr = "b01".U
2102225d46eSJiawei Lin    def auipc = "b10".U
2112225d46eSJiawei Lin//    def call = "b11_011".U
2122225d46eSJiawei Lin//    def ret  = "b11_100".U
2132225d46eSJiawei Lin    def jumpOpisJalr(op: UInt) = op(0)
2142225d46eSJiawei Lin    def jumpOpisAuipc(op: UInt) = op(1)
2152225d46eSJiawei Lin  }
2162225d46eSJiawei Lin
2172225d46eSJiawei Lin  object FenceOpType {
2182225d46eSJiawei Lin    def fence  = "b10000".U
2192225d46eSJiawei Lin    def sfence = "b10001".U
2202225d46eSJiawei Lin    def fencei = "b10010".U
221af2f7849Shappy-lx    def nofence= "b00000".U
2222225d46eSJiawei Lin  }
2232225d46eSJiawei Lin
2242225d46eSJiawei Lin  object ALUOpType {
225ee8ff153Szfw    // shift optype
226675acc68SYinan Xu    def slliuw     = "b000_0000".U // slliuw: ZEXT(src1[31:0]) << shamt
227675acc68SYinan Xu    def sll        = "b000_0001".U // sll:     src1 << src2
228ee8ff153Szfw
229675acc68SYinan Xu    def bclr       = "b000_0010".U // bclr:    src1 & ~(1 << src2[5:0])
230675acc68SYinan Xu    def bset       = "b000_0011".U // bset:    src1 | (1 << src2[5:0])
231675acc68SYinan Xu    def binv       = "b000_0100".U // binv:    src1 ^ ~(1 << src2[5:0])
232ee8ff153Szfw
233675acc68SYinan Xu    def srl        = "b000_0101".U // srl:     src1 >> src2
234675acc68SYinan Xu    def bext       = "b000_0110".U // bext:    (src1 >> src2)[0]
235675acc68SYinan Xu    def sra        = "b000_0111".U // sra:     src1 >> src2 (arithmetic)
236ee8ff153Szfw
2377b441e5eSYinan Xu    def rol        = "b000_1001".U // rol:     (src1 << src2) | (src1 >> (xlen - src2))
2387b441e5eSYinan Xu    def ror        = "b000_1011".U // ror:     (src1 >> src2) | (src1 << (xlen - src2))
239184a1958Szfw
240ee8ff153Szfw    // RV64 32bit optype
241675acc68SYinan Xu    def addw       = "b001_0000".U // addw:      SEXT((src1 + src2)[31:0])
242675acc68SYinan Xu    def oddaddw    = "b001_0001".U // oddaddw:   SEXT((src1[0] + src2)[31:0])
243675acc68SYinan Xu    def subw       = "b001_0010".U // subw:      SEXT((src1 - src2)[31:0])
244ee8ff153Szfw
245675acc68SYinan Xu    def addwbit    = "b001_0100".U // addwbit:   (src1 + src2)[0]
246675acc68SYinan Xu    def addwbyte   = "b001_0101".U // addwbyte:  (src1 + src2)[7:0]
247675acc68SYinan Xu    def addwzexth  = "b001_0110".U // addwzexth: ZEXT((src1  + src2)[15:0])
248675acc68SYinan Xu    def addwsexth  = "b001_0111".U // addwsexth: SEXT((src1  + src2)[15:0])
249ee8ff153Szfw
250675acc68SYinan Xu    def sllw       = "b001_1000".U // sllw:     SEXT((src1 << src2)[31:0])
251675acc68SYinan Xu    def srlw       = "b001_1001".U // srlw:     SEXT((src1[31:0] >> src2)[31:0])
252675acc68SYinan Xu    def sraw       = "b001_1010".U // sraw:     SEXT((src1[31:0] >> src2)[31:0])
253675acc68SYinan Xu    def rolw       = "b001_1100".U
254675acc68SYinan Xu    def rorw       = "b001_1101".U
255675acc68SYinan Xu
256675acc68SYinan Xu    // ADD-op
257675acc68SYinan Xu    def adduw      = "b010_0000".U // adduw:  src1[31:0]  + src2
258675acc68SYinan Xu    def add        = "b010_0001".U // add:     src1        + src2
259675acc68SYinan Xu    def oddadd     = "b010_0010".U // oddadd:  src1[0]     + src2
260675acc68SYinan Xu
261675acc68SYinan Xu    def sr29add    = "b010_0100".U // sr29add: src1[63:29] + src2
262675acc68SYinan Xu    def sr30add    = "b010_0101".U // sr30add: src1[63:30] + src2
263675acc68SYinan Xu    def sr31add    = "b010_0110".U // sr31add: src1[63:31] + src2
264675acc68SYinan Xu    def sr32add    = "b010_0111".U // sr32add: src1[63:32] + src2
265675acc68SYinan Xu
266675acc68SYinan Xu    def sh1adduw   = "b010_1000".U // sh1adduw: {src1[31:0], 1'b0} + src2
267675acc68SYinan Xu    def sh1add     = "b010_1001".U // sh1add: {src1[62:0], 1'b0} + src2
268675acc68SYinan Xu    def sh2adduw   = "b010_1010".U // sh2add_uw: {src1[31:0], 2'b0} + src2
269675acc68SYinan Xu    def sh2add     = "b010_1011".U // sh2add: {src1[61:0], 2'b0} + src2
270675acc68SYinan Xu    def sh3adduw   = "b010_1100".U // sh3add_uw: {src1[31:0], 3'b0} + src2
271675acc68SYinan Xu    def sh3add     = "b010_1101".U // sh3add: {src1[60:0], 3'b0} + src2
272675acc68SYinan Xu    def sh4add     = "b010_1111".U // sh4add: {src1[59:0], 4'b0} + src2
273675acc68SYinan Xu
274675acc68SYinan Xu    // SUB-op: src1 - src2
275675acc68SYinan Xu    def sub        = "b011_0000".U
276675acc68SYinan Xu    def sltu       = "b011_0001".U
277675acc68SYinan Xu    def slt        = "b011_0010".U
278675acc68SYinan Xu    def maxu       = "b011_0100".U
279675acc68SYinan Xu    def minu       = "b011_0101".U
280675acc68SYinan Xu    def max        = "b011_0110".U
281675acc68SYinan Xu    def min        = "b011_0111".U
282675acc68SYinan Xu
283675acc68SYinan Xu    // branch
284675acc68SYinan Xu    def beq        = "b111_0000".U
285675acc68SYinan Xu    def bne        = "b111_0010".U
286675acc68SYinan Xu    def blt        = "b111_1000".U
287675acc68SYinan Xu    def bge        = "b111_1010".U
288675acc68SYinan Xu    def bltu       = "b111_1100".U
289675acc68SYinan Xu    def bgeu       = "b111_1110".U
290675acc68SYinan Xu
291675acc68SYinan Xu    // misc optype
292675acc68SYinan Xu    def and        = "b100_0000".U
293675acc68SYinan Xu    def andn       = "b100_0001".U
294675acc68SYinan Xu    def or         = "b100_0010".U
295675acc68SYinan Xu    def orn        = "b100_0011".U
296675acc68SYinan Xu    def xor        = "b100_0100".U
297675acc68SYinan Xu    def xnor       = "b100_0101".U
298675acc68SYinan Xu    def orcb       = "b100_0110".U
299675acc68SYinan Xu
300675acc68SYinan Xu    def sextb      = "b100_1000".U
301675acc68SYinan Xu    def packh      = "b100_1001".U
302675acc68SYinan Xu    def sexth      = "b100_1010".U
303675acc68SYinan Xu    def packw      = "b100_1011".U
304675acc68SYinan Xu
305675acc68SYinan Xu    def revb       = "b101_0000".U
306675acc68SYinan Xu    def rev8       = "b101_0001".U
307675acc68SYinan Xu    def pack       = "b101_0010".U
308675acc68SYinan Xu    def orh48      = "b101_0011".U
309675acc68SYinan Xu
310675acc68SYinan Xu    def szewl1     = "b101_1000".U
311675acc68SYinan Xu    def szewl2     = "b101_1001".U
312675acc68SYinan Xu    def szewl3     = "b101_1010".U
313675acc68SYinan Xu    def byte2      = "b101_1011".U
314675acc68SYinan Xu
315675acc68SYinan Xu    def andlsb     = "b110_0000".U
316675acc68SYinan Xu    def andzexth   = "b110_0001".U
317675acc68SYinan Xu    def orlsb      = "b110_0010".U
318675acc68SYinan Xu    def orzexth    = "b110_0011".U
319675acc68SYinan Xu    def xorlsb     = "b110_0100".U
320675acc68SYinan Xu    def xorzexth   = "b110_0101".U
321675acc68SYinan Xu    def orcblsb    = "b110_0110".U
322675acc68SYinan Xu    def orcbzexth  = "b110_0111".U
323675acc68SYinan Xu
324675acc68SYinan Xu    def isAddw(func: UInt) = func(6, 4) === "b001".U && !func(3) && !func(1)
325675acc68SYinan Xu    def isSimpleLogic(func: UInt) = func(6, 4) === "b100".U && !func(0)
326675acc68SYinan Xu    def logicToLsb(func: UInt) = Cat("b110".U(3.W), func(3, 1), 0.U(1.W))
327675acc68SYinan Xu    def logicToZexth(func: UInt) = Cat("b110".U(3.W), func(3, 1), 1.U(1.W))
328675acc68SYinan Xu    def isBranch(func: UInt) = func(6, 4) === "b111".U
329675acc68SYinan Xu    def getBranchType(func: UInt) = func(3, 2)
330675acc68SYinan Xu    def isBranchInvert(func: UInt) = func(1)
331675acc68SYinan Xu
332675acc68SYinan Xu    def apply() = UInt(7.W)
3332225d46eSJiawei Lin  }
3342225d46eSJiawei Lin
3352225d46eSJiawei Lin  object MDUOpType {
3362225d46eSJiawei Lin    // mul
3372225d46eSJiawei Lin    // bit encoding: | type (2bit) | isWord(1bit) | opcode(2bit) |
3382225d46eSJiawei Lin    def mul    = "b00000".U
3392225d46eSJiawei Lin    def mulh   = "b00001".U
3402225d46eSJiawei Lin    def mulhsu = "b00010".U
3412225d46eSJiawei Lin    def mulhu  = "b00011".U
3422225d46eSJiawei Lin    def mulw   = "b00100".U
3432225d46eSJiawei Lin
34488825c5cSYinan Xu    def mulw7  = "b01100".U
34588825c5cSYinan Xu
3462225d46eSJiawei Lin    // div
3472225d46eSJiawei Lin    // bit encoding: | type (2bit) | isWord(1bit) | isSign(1bit) | opcode(1bit) |
34888825c5cSYinan Xu    def div    = "b10000".U
34988825c5cSYinan Xu    def divu   = "b10010".U
35088825c5cSYinan Xu    def rem    = "b10001".U
35188825c5cSYinan Xu    def remu   = "b10011".U
3522225d46eSJiawei Lin
35388825c5cSYinan Xu    def divw   = "b10100".U
35488825c5cSYinan Xu    def divuw  = "b10110".U
35588825c5cSYinan Xu    def remw   = "b10101".U
35688825c5cSYinan Xu    def remuw  = "b10111".U
3572225d46eSJiawei Lin
35888825c5cSYinan Xu    def isMul(op: UInt) = !op(4)
35988825c5cSYinan Xu    def isDiv(op: UInt) = op(4)
3602225d46eSJiawei Lin
3612225d46eSJiawei Lin    def isDivSign(op: UInt) = isDiv(op) && !op(1)
3622225d46eSJiawei Lin    def isW(op: UInt) = op(2)
3632225d46eSJiawei Lin    def isH(op: UInt) = (isDiv(op) && op(0)) || (isMul(op) && op(1, 0) =/= 0.U)
3642225d46eSJiawei Lin    def getMulOp(op: UInt) = op(1, 0)
3652225d46eSJiawei Lin  }
3662225d46eSJiawei Lin
3672225d46eSJiawei Lin  object LSUOpType {
368d200f594SWilliam Wang    // load pipeline
3692225d46eSJiawei Lin
370d200f594SWilliam Wang    // normal load
371d200f594SWilliam Wang    // Note: bit(1, 0) are size, DO NOT CHANGE
372d200f594SWilliam Wang    // bit encoding: | load 0 | is unsigned(1bit) | size(2bit) |
373d200f594SWilliam Wang    def lb       = "b0000".U
374d200f594SWilliam Wang    def lh       = "b0001".U
375d200f594SWilliam Wang    def lw       = "b0010".U
376d200f594SWilliam Wang    def ld       = "b0011".U
377d200f594SWilliam Wang    def lbu      = "b0100".U
378d200f594SWilliam Wang    def lhu      = "b0101".U
379d200f594SWilliam Wang    def lwu      = "b0110".U
380ca18a0b4SWilliam Wang
381d200f594SWilliam Wang    // Zicbop software prefetch
382d200f594SWilliam Wang    // bit encoding: | prefetch 1 | 0 | prefetch type (2bit) |
383d200f594SWilliam Wang    def prefetch_i = "b1000".U // TODO
384d200f594SWilliam Wang    def prefetch_r = "b1001".U
385d200f594SWilliam Wang    def prefetch_w = "b1010".U
386ca18a0b4SWilliam Wang
387d200f594SWilliam Wang    def isPrefetch(op: UInt): Bool = op(3)
388d200f594SWilliam Wang
389d200f594SWilliam Wang    // store pipeline
390d200f594SWilliam Wang    // normal store
391d200f594SWilliam Wang    // bit encoding: | store 00 | size(2bit) |
392d200f594SWilliam Wang    def sb       = "b0000".U
393d200f594SWilliam Wang    def sh       = "b0001".U
394d200f594SWilliam Wang    def sw       = "b0010".U
395d200f594SWilliam Wang    def sd       = "b0011".U
396d200f594SWilliam Wang
397d200f594SWilliam Wang    // l1 cache op
398d200f594SWilliam Wang    // bit encoding: | cbo_zero 01 | size(2bit) 11 |
399d200f594SWilliam Wang    def cbo_zero  = "b0111".U
400d200f594SWilliam Wang
401d200f594SWilliam Wang    // llc op
402d200f594SWilliam Wang    // bit encoding: | prefetch 11 | suboptype(2bit) |
403d200f594SWilliam Wang    def cbo_clean = "b1100".U
404d200f594SWilliam Wang    def cbo_flush = "b1101".U
405d200f594SWilliam Wang    def cbo_inval = "b1110".U
406d200f594SWilliam Wang
407d200f594SWilliam Wang    def isCbo(op: UInt): Bool = op(3, 2) === "b11".U
4082225d46eSJiawei Lin
4092225d46eSJiawei Lin    // atomics
4102225d46eSJiawei Lin    // bit(1, 0) are size
4112225d46eSJiawei Lin    // since atomics use a different fu type
4122225d46eSJiawei Lin    // so we can safely reuse other load/store's encodings
413d200f594SWilliam Wang    // bit encoding: | optype(4bit) | size (2bit) |
4142225d46eSJiawei Lin    def lr_w      = "b000010".U
4152225d46eSJiawei Lin    def sc_w      = "b000110".U
4162225d46eSJiawei Lin    def amoswap_w = "b001010".U
4172225d46eSJiawei Lin    def amoadd_w  = "b001110".U
4182225d46eSJiawei Lin    def amoxor_w  = "b010010".U
4192225d46eSJiawei Lin    def amoand_w  = "b010110".U
4202225d46eSJiawei Lin    def amoor_w   = "b011010".U
4212225d46eSJiawei Lin    def amomin_w  = "b011110".U
4222225d46eSJiawei Lin    def amomax_w  = "b100010".U
4232225d46eSJiawei Lin    def amominu_w = "b100110".U
4242225d46eSJiawei Lin    def amomaxu_w = "b101010".U
4252225d46eSJiawei Lin
4262225d46eSJiawei Lin    def lr_d      = "b000011".U
4272225d46eSJiawei Lin    def sc_d      = "b000111".U
4282225d46eSJiawei Lin    def amoswap_d = "b001011".U
4292225d46eSJiawei Lin    def amoadd_d  = "b001111".U
4302225d46eSJiawei Lin    def amoxor_d  = "b010011".U
4312225d46eSJiawei Lin    def amoand_d  = "b010111".U
4322225d46eSJiawei Lin    def amoor_d   = "b011011".U
4332225d46eSJiawei Lin    def amomin_d  = "b011111".U
4342225d46eSJiawei Lin    def amomax_d  = "b100011".U
4352225d46eSJiawei Lin    def amominu_d = "b100111".U
4362225d46eSJiawei Lin    def amomaxu_d = "b101011".U
437b6982e83SLemover
438b6982e83SLemover    def size(op: UInt) = op(1,0)
4392225d46eSJiawei Lin  }
4402225d46eSJiawei Lin
4413feeca58Szfw  object BKUOpType {
442ee8ff153Szfw
4433feeca58Szfw    def clmul       = "b000000".U
4443feeca58Szfw    def clmulh      = "b000001".U
4453feeca58Szfw    def clmulr      = "b000010".U
4463feeca58Szfw    def xpermn      = "b000100".U
4473feeca58Szfw    def xpermb      = "b000101".U
448ee8ff153Szfw
4493feeca58Szfw    def clz         = "b001000".U
4503feeca58Szfw    def clzw        = "b001001".U
4513feeca58Szfw    def ctz         = "b001010".U
4523feeca58Szfw    def ctzw        = "b001011".U
4533feeca58Szfw    def cpop        = "b001100".U
4543feeca58Szfw    def cpopw       = "b001101".U
45507596dc6Szfw
4563feeca58Szfw    // 01xxxx is reserve
4573feeca58Szfw    def aes64es     = "b100000".U
4583feeca58Szfw    def aes64esm    = "b100001".U
4593feeca58Szfw    def aes64ds     = "b100010".U
4603feeca58Szfw    def aes64dsm    = "b100011".U
4613feeca58Szfw    def aes64im     = "b100100".U
4623feeca58Szfw    def aes64ks1i   = "b100101".U
4633feeca58Szfw    def aes64ks2    = "b100110".U
4643feeca58Szfw
4653feeca58Szfw    // merge to two instruction sm4ks & sm4ed
46619bcce38SFawang Zhang    def sm4ed0      = "b101000".U
46719bcce38SFawang Zhang    def sm4ed1      = "b101001".U
46819bcce38SFawang Zhang    def sm4ed2      = "b101010".U
46919bcce38SFawang Zhang    def sm4ed3      = "b101011".U
47019bcce38SFawang Zhang    def sm4ks0      = "b101100".U
47119bcce38SFawang Zhang    def sm4ks1      = "b101101".U
47219bcce38SFawang Zhang    def sm4ks2      = "b101110".U
47319bcce38SFawang Zhang    def sm4ks3      = "b101111".U
4743feeca58Szfw
4753feeca58Szfw    def sha256sum0  = "b110000".U
4763feeca58Szfw    def sha256sum1  = "b110001".U
4773feeca58Szfw    def sha256sig0  = "b110010".U
4783feeca58Szfw    def sha256sig1  = "b110011".U
4793feeca58Szfw    def sha512sum0  = "b110100".U
4803feeca58Szfw    def sha512sum1  = "b110101".U
4813feeca58Szfw    def sha512sig0  = "b110110".U
4823feeca58Szfw    def sha512sig1  = "b110111".U
4833feeca58Szfw
4843feeca58Szfw    def sm3p0       = "b111000".U
4853feeca58Szfw    def sm3p1       = "b111001".U
486ee8ff153Szfw  }
487ee8ff153Szfw
4882225d46eSJiawei Lin  object BTBtype {
4892225d46eSJiawei Lin    def B = "b00".U  // branch
4902225d46eSJiawei Lin    def J = "b01".U  // jump
4912225d46eSJiawei Lin    def I = "b10".U  // indirect
4922225d46eSJiawei Lin    def R = "b11".U  // return
4932225d46eSJiawei Lin
4942225d46eSJiawei Lin    def apply() = UInt(2.W)
4952225d46eSJiawei Lin  }
4962225d46eSJiawei Lin
4972225d46eSJiawei Lin  object SelImm {
498ee8ff153Szfw    def IMM_X  = "b0111".U
499ee8ff153Szfw    def IMM_S  = "b0000".U
500ee8ff153Szfw    def IMM_SB = "b0001".U
501ee8ff153Szfw    def IMM_U  = "b0010".U
502ee8ff153Szfw    def IMM_UJ = "b0011".U
503ee8ff153Szfw    def IMM_I  = "b0100".U
504ee8ff153Szfw    def IMM_Z  = "b0101".U
505ee8ff153Szfw    def INVALID_INSTR = "b0110".U
506ee8ff153Szfw    def IMM_B6 = "b1000".U
5072225d46eSJiawei Lin
5086e7c9679Shuxuan0307    def X      = BitPat("b????")
5096e7c9679Shuxuan0307
510ee8ff153Szfw    def apply() = UInt(4.W)
5112225d46eSJiawei Lin  }
5122225d46eSJiawei Lin
5136ab6918fSYinan Xu  object ExceptionNO {
5146ab6918fSYinan Xu    def instrAddrMisaligned = 0
5156ab6918fSYinan Xu    def instrAccessFault    = 1
5166ab6918fSYinan Xu    def illegalInstr        = 2
5176ab6918fSYinan Xu    def breakPoint          = 3
5186ab6918fSYinan Xu    def loadAddrMisaligned  = 4
5196ab6918fSYinan Xu    def loadAccessFault     = 5
5206ab6918fSYinan Xu    def storeAddrMisaligned = 6
5216ab6918fSYinan Xu    def storeAccessFault    = 7
5226ab6918fSYinan Xu    def ecallU              = 8
5236ab6918fSYinan Xu    def ecallS              = 9
5246ab6918fSYinan Xu    def ecallM              = 11
5256ab6918fSYinan Xu    def instrPageFault      = 12
5266ab6918fSYinan Xu    def loadPageFault       = 13
5276ab6918fSYinan Xu    // def singleStep          = 14
5286ab6918fSYinan Xu    def storePageFault      = 15
5296ab6918fSYinan Xu    def priorities = Seq(
5306ab6918fSYinan Xu      breakPoint, // TODO: different BP has different priority
5316ab6918fSYinan Xu      instrPageFault,
5326ab6918fSYinan Xu      instrAccessFault,
5336ab6918fSYinan Xu      illegalInstr,
5346ab6918fSYinan Xu      instrAddrMisaligned,
5356ab6918fSYinan Xu      ecallM, ecallS, ecallU,
536d880177dSYinan Xu      storeAddrMisaligned,
537d880177dSYinan Xu      loadAddrMisaligned,
5386ab6918fSYinan Xu      storePageFault,
5396ab6918fSYinan Xu      loadPageFault,
5406ab6918fSYinan Xu      storeAccessFault,
541d880177dSYinan Xu      loadAccessFault
5426ab6918fSYinan Xu    )
5436ab6918fSYinan Xu    def all = priorities.distinct.sorted
5446ab6918fSYinan Xu    def frontendSet = Seq(
5456ab6918fSYinan Xu      instrAddrMisaligned,
5466ab6918fSYinan Xu      instrAccessFault,
5476ab6918fSYinan Xu      illegalInstr,
5486ab6918fSYinan Xu      instrPageFault
5496ab6918fSYinan Xu    )
5506ab6918fSYinan Xu    def partialSelect(vec: Vec[Bool], select: Seq[Int]): Vec[Bool] = {
5516ab6918fSYinan Xu      val new_vec = Wire(ExceptionVec())
5526ab6918fSYinan Xu      new_vec.foreach(_ := false.B)
5536ab6918fSYinan Xu      select.foreach(i => new_vec(i) := vec(i))
5546ab6918fSYinan Xu      new_vec
5556ab6918fSYinan Xu    }
5566ab6918fSYinan Xu    def selectFrontend(vec: Vec[Bool]): Vec[Bool] = partialSelect(vec, frontendSet)
5576ab6918fSYinan Xu    def selectAll(vec: Vec[Bool]): Vec[Bool] = partialSelect(vec, ExceptionNO.all)
5586ab6918fSYinan Xu    def selectByFu(vec:Vec[Bool], fuConfig: FuConfig): Vec[Bool] =
5596ab6918fSYinan Xu      partialSelect(vec, fuConfig.exceptionOut)
5606ab6918fSYinan Xu    def selectByExu(vec:Vec[Bool], exuConfig: ExuConfig): Vec[Bool] =
5616ab6918fSYinan Xu      partialSelect(vec, exuConfig.exceptionOut)
5626ab6918fSYinan Xu    def selectByExu(vec:Vec[Bool], exuConfigs: Seq[ExuConfig]): Vec[Bool] =
5636ab6918fSYinan Xu      partialSelect(vec, exuConfigs.map(_.exceptionOut).reduce(_ ++ _).distinct.sorted)
5646ab6918fSYinan Xu  }
5656ab6918fSYinan Xu
5661c62c387SYinan Xu  def dividerGen(p: Parameters) = new DividerWrapper(p(XLen))(p)
567c3d7991bSJiawei Lin  def multiplierGen(p: Parameters) = new ArrayMultiplier(p(XLen) + 1)(p)
5682225d46eSJiawei Lin  def aluGen(p: Parameters) = new Alu()(p)
5693feeca58Szfw  def bkuGen(p: Parameters) = new Bku()(p)
5702225d46eSJiawei Lin  def jmpGen(p: Parameters) = new Jump()(p)
5712225d46eSJiawei Lin  def fenceGen(p: Parameters) = new Fence()(p)
5722225d46eSJiawei Lin  def csrGen(p: Parameters) = new CSR()(p)
5732225d46eSJiawei Lin  def i2fGen(p: Parameters) = new IntToFP()(p)
5742225d46eSJiawei Lin  def fmacGen(p: Parameters) = new FMA()(p)
5752225d46eSJiawei Lin  def f2iGen(p: Parameters) = new FPToInt()(p)
5762225d46eSJiawei Lin  def f2fGen(p: Parameters) = new FPToFP()(p)
5772225d46eSJiawei Lin  def fdivSqrtGen(p: Parameters) = new FDivSqrt()(p)
57885b4cd54SYinan Xu  def stdGen(p: Parameters) = new Std()(p)
5796ab6918fSYinan Xu  def mouDataGen(p: Parameters) = new Std()(p)
5802225d46eSJiawei Lin
5816cdd85d9SYinan Xu  def f2iSel(uop: MicroOp): Bool = {
5826cdd85d9SYinan Xu    uop.ctrl.rfWen
5832225d46eSJiawei Lin  }
5842225d46eSJiawei Lin
5856cdd85d9SYinan Xu  def i2fSel(uop: MicroOp): Bool = {
5866cdd85d9SYinan Xu    uop.ctrl.fpu.fromInt
5872225d46eSJiawei Lin  }
5882225d46eSJiawei Lin
5896cdd85d9SYinan Xu  def f2fSel(uop: MicroOp): Bool = {
5906cdd85d9SYinan Xu    val ctrl = uop.ctrl.fpu
5912225d46eSJiawei Lin    ctrl.fpWen && !ctrl.div && !ctrl.sqrt
5922225d46eSJiawei Lin  }
5932225d46eSJiawei Lin
5946cdd85d9SYinan Xu  def fdivSqrtSel(uop: MicroOp): Bool = {
5956cdd85d9SYinan Xu    val ctrl = uop.ctrl.fpu
5962225d46eSJiawei Lin    ctrl.div || ctrl.sqrt
5972225d46eSJiawei Lin  }
5982225d46eSJiawei Lin
5992225d46eSJiawei Lin  val aluCfg = FuConfig(
6001a0f06eeSYinan Xu    name = "alu",
6012225d46eSJiawei Lin    fuGen = aluGen,
6026cdd85d9SYinan Xu    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.alu,
6032225d46eSJiawei Lin    fuType = FuType.alu,
6042225d46eSJiawei Lin    numIntSrc = 2,
6052225d46eSJiawei Lin    numFpSrc = 0,
6062225d46eSJiawei Lin    writeIntRf = true,
6072225d46eSJiawei Lin    writeFpRf = false,
6082225d46eSJiawei Lin    hasRedirect = true,
6092225d46eSJiawei Lin  )
6102225d46eSJiawei Lin
6112225d46eSJiawei Lin  val jmpCfg = FuConfig(
6121a0f06eeSYinan Xu    name = "jmp",
6132225d46eSJiawei Lin    fuGen = jmpGen,
6146cdd85d9SYinan Xu    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.jmp,
6152225d46eSJiawei Lin    fuType = FuType.jmp,
6162225d46eSJiawei Lin    numIntSrc = 1,
6172225d46eSJiawei Lin    numFpSrc = 0,
6182225d46eSJiawei Lin    writeIntRf = true,
6192225d46eSJiawei Lin    writeFpRf = false,
6202225d46eSJiawei Lin    hasRedirect = true,
6212225d46eSJiawei Lin  )
6222225d46eSJiawei Lin
6232225d46eSJiawei Lin  val fenceCfg = FuConfig(
6241a0f06eeSYinan Xu    name = "fence",
6252225d46eSJiawei Lin    fuGen = fenceGen,
6266cdd85d9SYinan Xu    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.fence,
6276ab6918fSYinan Xu    FuType.fence, 2, 0, writeIntRf = false, writeFpRf = false,
628f1fe8698SLemover    latency = UncertainLatency(), exceptionOut = Seq(illegalInstr), // TODO: need rewrite latency structure, not just this value,
629f1fe8698SLemover    flushPipe = true
6302225d46eSJiawei Lin  )
6312225d46eSJiawei Lin
6322225d46eSJiawei Lin  val csrCfg = FuConfig(
6331a0f06eeSYinan Xu    name = "csr",
6342225d46eSJiawei Lin    fuGen = csrGen,
6356cdd85d9SYinan Xu    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.csr,
6362225d46eSJiawei Lin    fuType = FuType.csr,
6372225d46eSJiawei Lin    numIntSrc = 1,
6382225d46eSJiawei Lin    numFpSrc = 0,
6392225d46eSJiawei Lin    writeIntRf = true,
6402225d46eSJiawei Lin    writeFpRf = false,
6416ab6918fSYinan Xu    exceptionOut = Seq(illegalInstr, breakPoint, ecallU, ecallS, ecallM),
6426ab6918fSYinan Xu    flushPipe = true
6432225d46eSJiawei Lin  )
6442225d46eSJiawei Lin
6452225d46eSJiawei Lin  val i2fCfg = FuConfig(
6461a0f06eeSYinan Xu    name = "i2f",
6472225d46eSJiawei Lin    fuGen = i2fGen,
6482225d46eSJiawei Lin    fuSel = i2fSel,
6492225d46eSJiawei Lin    FuType.i2f,
6502225d46eSJiawei Lin    numIntSrc = 1,
6512225d46eSJiawei Lin    numFpSrc = 0,
6522225d46eSJiawei Lin    writeIntRf = false,
6532225d46eSJiawei Lin    writeFpRf = true,
6546ab6918fSYinan Xu    writeFflags = true,
655e174d629SJiawei Lin    latency = CertainLatency(2),
656e174d629SJiawei Lin    fastUopOut = true, fastImplemented = true
6572225d46eSJiawei Lin  )
6582225d46eSJiawei Lin
6592225d46eSJiawei Lin  val divCfg = FuConfig(
6601a0f06eeSYinan Xu    name = "div",
6612225d46eSJiawei Lin    fuGen = dividerGen,
66207596dc6Szfw    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.div,
6632225d46eSJiawei Lin    FuType.div,
6642225d46eSJiawei Lin    2,
6652225d46eSJiawei Lin    0,
6662225d46eSJiawei Lin    writeIntRf = true,
6672225d46eSJiawei Lin    writeFpRf = false,
668f83b578aSYinan Xu    latency = UncertainLatency(),
669f83b578aSYinan Xu    fastUopOut = true,
6701c62c387SYinan Xu    fastImplemented = true,
6715ee7cabeSYinan Xu    hasInputBuffer = (true, 4, true)
6722225d46eSJiawei Lin  )
6732225d46eSJiawei Lin
6742225d46eSJiawei Lin  val mulCfg = FuConfig(
6751a0f06eeSYinan Xu    name = "mul",
6762225d46eSJiawei Lin    fuGen = multiplierGen,
67707596dc6Szfw    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.mul,
6782225d46eSJiawei Lin    FuType.mul,
6792225d46eSJiawei Lin    2,
6802225d46eSJiawei Lin    0,
6812225d46eSJiawei Lin    writeIntRf = true,
6822225d46eSJiawei Lin    writeFpRf = false,
683b2482bc1SYinan Xu    latency = CertainLatency(2),
684f83b578aSYinan Xu    fastUopOut = true,
685b2482bc1SYinan Xu    fastImplemented = true
6862225d46eSJiawei Lin  )
6872225d46eSJiawei Lin
6883feeca58Szfw  val bkuCfg = FuConfig(
6893feeca58Szfw    name = "bku",
6903feeca58Szfw    fuGen = bkuGen,
6913feeca58Szfw    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.bku,
6923feeca58Szfw    fuType = FuType.bku,
693ee8ff153Szfw    numIntSrc = 2,
694ee8ff153Szfw    numFpSrc = 0,
695ee8ff153Szfw    writeIntRf = true,
696ee8ff153Szfw    writeFpRf = false,
697f83b578aSYinan Xu    latency = CertainLatency(1),
698f83b578aSYinan Xu    fastUopOut = true,
69907596dc6Szfw    fastImplemented = true
700ee8ff153Szfw )
701ee8ff153Szfw
7022225d46eSJiawei Lin  val fmacCfg = FuConfig(
7031a0f06eeSYinan Xu    name = "fmac",
7042225d46eSJiawei Lin    fuGen = fmacGen,
7052225d46eSJiawei Lin    fuSel = _ => true.B,
7066ab6918fSYinan Xu    FuType.fmac, 0, 3, writeIntRf = false, writeFpRf = true, writeFflags = true,
7074b65fc7eSJiawei Lin    latency = UncertainLatency(), fastUopOut = true, fastImplemented = true
7082225d46eSJiawei Lin  )
7092225d46eSJiawei Lin
7102225d46eSJiawei Lin  val f2iCfg = FuConfig(
7111a0f06eeSYinan Xu    name = "f2i",
7122225d46eSJiawei Lin    fuGen = f2iGen,
7132225d46eSJiawei Lin    fuSel = f2iSel,
7146ab6918fSYinan Xu    FuType.fmisc, 0, 1, writeIntRf = true, writeFpRf = false, writeFflags = true, latency = CertainLatency(2),
715b2482bc1SYinan Xu    fastUopOut = true, fastImplemented = true
7162225d46eSJiawei Lin  )
7172225d46eSJiawei Lin
7182225d46eSJiawei Lin  val f2fCfg = FuConfig(
7191a0f06eeSYinan Xu    name = "f2f",
7202225d46eSJiawei Lin    fuGen = f2fGen,
7212225d46eSJiawei Lin    fuSel = f2fSel,
7226ab6918fSYinan Xu    FuType.fmisc, 0, 1, writeIntRf = false, writeFpRf = true, writeFflags = true, latency = CertainLatency(2),
723b2482bc1SYinan Xu    fastUopOut = true, fastImplemented = true
7242225d46eSJiawei Lin  )
7252225d46eSJiawei Lin
7262225d46eSJiawei Lin  val fdivSqrtCfg = FuConfig(
7271a0f06eeSYinan Xu    name = "fdivSqrt",
7282225d46eSJiawei Lin    fuGen = fdivSqrtGen,
7292225d46eSJiawei Lin    fuSel = fdivSqrtSel,
7306ab6918fSYinan Xu    FuType.fDivSqrt, 0, 2, writeIntRf = false, writeFpRf = true, writeFflags = true, latency = UncertainLatency(),
731140aff85SYinan Xu    fastUopOut = true, fastImplemented = true, hasInputBuffer = (true, 8, true)
7322225d46eSJiawei Lin  )
7332225d46eSJiawei Lin
7342225d46eSJiawei Lin  val lduCfg = FuConfig(
7351a0f06eeSYinan Xu    "ldu",
7362225d46eSJiawei Lin    null, // DontCare
7372b4e8253SYinan Xu    (uop: MicroOp) => FuType.loadCanAccept(uop.ctrl.fuType),
7386ab6918fSYinan Xu    FuType.ldu, 1, 0, writeIntRf = true, writeFpRf = true,
7396ab6918fSYinan Xu    latency = UncertainLatency(),
7406ab6918fSYinan Xu    exceptionOut = Seq(loadAddrMisaligned, loadAccessFault, loadPageFault),
7416ab6918fSYinan Xu    flushPipe = true,
7426786cfb7SWilliam Wang    replayInst = true,
7436786cfb7SWilliam Wang    hasLoadError = true
7442225d46eSJiawei Lin  )
7452225d46eSJiawei Lin
74685b4cd54SYinan Xu  val staCfg = FuConfig(
7471a0f06eeSYinan Xu    "sta",
7482225d46eSJiawei Lin    null,
7492b4e8253SYinan Xu    (uop: MicroOp) => FuType.storeCanAccept(uop.ctrl.fuType),
7506ab6918fSYinan Xu    FuType.stu, 1, 0, writeIntRf = false, writeFpRf = false,
7516ab6918fSYinan Xu    latency = UncertainLatency(),
7526ab6918fSYinan Xu    exceptionOut = Seq(storeAddrMisaligned, storeAccessFault, storePageFault)
7532225d46eSJiawei Lin  )
7542225d46eSJiawei Lin
75585b4cd54SYinan Xu  val stdCfg = FuConfig(
7561a0f06eeSYinan Xu    "std",
7572b4e8253SYinan Xu    fuGen = stdGen, fuSel = (uop: MicroOp) => FuType.storeCanAccept(uop.ctrl.fuType), FuType.stu, 1, 1,
7586ab6918fSYinan Xu    writeIntRf = false, writeFpRf = false, latency = CertainLatency(1)
75985b4cd54SYinan Xu  )
76085b4cd54SYinan Xu
7612225d46eSJiawei Lin  val mouCfg = FuConfig(
7621a0f06eeSYinan Xu    "mou",
7632225d46eSJiawei Lin    null,
7642b4e8253SYinan Xu    (uop: MicroOp) => FuType.storeCanAccept(uop.ctrl.fuType),
7656ab6918fSYinan Xu    FuType.mou, 1, 0, writeIntRf = false, writeFpRf = false,
7666ab6918fSYinan Xu    latency = UncertainLatency(), exceptionOut = lduCfg.exceptionOut ++ staCfg.exceptionOut
7672b4e8253SYinan Xu  )
7682b4e8253SYinan Xu
7692b4e8253SYinan Xu  val mouDataCfg = FuConfig(
7702b4e8253SYinan Xu    "mou",
7712b4e8253SYinan Xu    mouDataGen,
7722b4e8253SYinan Xu    (uop: MicroOp) => FuType.storeCanAccept(uop.ctrl.fuType),
7736ab6918fSYinan Xu    FuType.mou, 1, 0, writeIntRf = false, writeFpRf = false,
7746ab6918fSYinan Xu    latency = UncertainLatency()
7752225d46eSJiawei Lin  )
7762225d46eSJiawei Lin
777adb5df20SYinan Xu  val JumpExeUnitCfg = ExuConfig("JmpExeUnit", "Int", Seq(jmpCfg, i2fCfg), 2, Int.MaxValue)
778b6220f0dSLemover  val AluExeUnitCfg = ExuConfig("AluExeUnit", "Int", Seq(aluCfg), 0, Int.MaxValue)
779adb5df20SYinan Xu  val JumpCSRExeUnitCfg = ExuConfig("JmpCSRExeUnit", "Int", Seq(jmpCfg, csrCfg, fenceCfg, i2fCfg), 2, Int.MaxValue)
7803feeca58Szfw  val MulDivExeUnitCfg = ExuConfig("MulDivExeUnit", "Int", Seq(mulCfg, divCfg, bkuCfg), 1, Int.MaxValue)
781b6220f0dSLemover  val FmacExeUnitCfg = ExuConfig("FmacExeUnit", "Fp", Seq(fmacCfg), Int.MaxValue, 0)
7822225d46eSJiawei Lin  val FmiscExeUnitCfg = ExuConfig(
7832225d46eSJiawei Lin    "FmiscExeUnit",
784b6220f0dSLemover    "Fp",
7852225d46eSJiawei Lin    Seq(f2iCfg, f2fCfg, fdivSqrtCfg),
7862225d46eSJiawei Lin    Int.MaxValue, 1
7872225d46eSJiawei Lin  )
7882b4e8253SYinan Xu  val LdExeUnitCfg = ExuConfig("LoadExu", "Mem", Seq(lduCfg), wbIntPriority = 0, wbFpPriority = 0, extendsExu = false)
7892b4e8253SYinan Xu  val StaExeUnitCfg = ExuConfig("StaExu", "Mem", Seq(staCfg, mouCfg), wbIntPriority = Int.MaxValue, wbFpPriority = Int.MaxValue, extendsExu = false)
7902b4e8253SYinan Xu  val StdExeUnitCfg = ExuConfig("StdExu", "Mem", Seq(stdCfg, mouDataCfg), wbIntPriority = Int.MaxValue, wbFpPriority = Int.MaxValue, extendsExu = false)
791*d2b20d1aSTang Haojin
792*d2b20d1aSTang Haojin  // indicates where the memory access request comes from
793*d2b20d1aSTang Haojin  // a dupliacte of this is in HuanCun.common and CoupledL2.common
794*d2b20d1aSTang Haojin  // TODO: consider moving it to Utility, so that they could share the same definition
795*d2b20d1aSTang Haojin  object MemReqSource extends Enumeration {
796*d2b20d1aSTang Haojin    val NoWhere = Value("NoWhere")
797*d2b20d1aSTang Haojin
798*d2b20d1aSTang Haojin    val CPUInst = Value("CPUInst")
799*d2b20d1aSTang Haojin    val CPULoadData = Value("CPULoadData")
800*d2b20d1aSTang Haojin    val CPUStoreData = Value("CPUStoreData")
801*d2b20d1aSTang Haojin    val CPUAtomicData = Value("CPUAtomicData")
802*d2b20d1aSTang Haojin    val L1InstPrefetch = Value("L1InstPrefetch")
803*d2b20d1aSTang Haojin    val L1DataPrefetch = Value("L1DataPrefetch")
804*d2b20d1aSTang Haojin    val PTW = Value("PTW")
805*d2b20d1aSTang Haojin    val L2Prefetch = Value("L2Prefetch")
806*d2b20d1aSTang Haojin    val ReqSourceCount = Value("ReqSourceCount")
807*d2b20d1aSTang Haojin
808*d2b20d1aSTang Haojin    val reqSourceBits = log2Ceil(ReqSourceCount.id)
809*d2b20d1aSTang Haojin  }
810*d2b20d1aSTang Haojin
811*d2b20d1aSTang Haojin  object TopDownCounters extends Enumeration {
812*d2b20d1aSTang Haojin    val NoStall = Value("NoStall")  // Base
813*d2b20d1aSTang Haojin    // frontend
814*d2b20d1aSTang Haojin    val OverrideBubble = Value("OverrideBubble")
815*d2b20d1aSTang Haojin    val FtqUpdateBubble = Value("FtqUpdateBubble")
816*d2b20d1aSTang Haojin    // val ControlRedirectBubble = Value("ControlRedirectBubble")
817*d2b20d1aSTang Haojin    val TAGEMissBubble = Value("TAGEMissBubble")
818*d2b20d1aSTang Haojin    val SCMissBubble = Value("SCMissBubble")
819*d2b20d1aSTang Haojin    val ITTAGEMissBubble = Value("ITTAGEMissBubble")
820*d2b20d1aSTang Haojin    val RASMissBubble = Value("RASMissBubble")
821*d2b20d1aSTang Haojin    val MemVioRedirectBubble = Value("MemVioRedirectBubble")
822*d2b20d1aSTang Haojin    val OtherRedirectBubble = Value("OtherRedirectBubble")
823*d2b20d1aSTang Haojin    val FtqFullStall = Value("FtqFullStall")
824*d2b20d1aSTang Haojin
825*d2b20d1aSTang Haojin    val ICacheMissBubble = Value("ICacheMissBubble")
826*d2b20d1aSTang Haojin    val ITLBMissBubble = Value("ITLBMissBubble")
827*d2b20d1aSTang Haojin    val BTBMissBubble = Value("BTBMissBubble")
828*d2b20d1aSTang Haojin    val FetchFragBubble = Value("FetchFragBubble")
829*d2b20d1aSTang Haojin
830*d2b20d1aSTang Haojin    // backend
831*d2b20d1aSTang Haojin    // long inst stall at rob head
832*d2b20d1aSTang Haojin    val DivStall = Value("DivStall") // int div, float div/sqrt
833*d2b20d1aSTang Haojin    val IntNotReadyStall = Value("IntNotReadyStall") // int-inst at rob head not issue
834*d2b20d1aSTang Haojin    val FPNotReadyStall = Value("FPNotReadyStall") // fp-inst at rob head not issue
835*d2b20d1aSTang Haojin    val MemNotReadyStall = Value("MemNotReadyStall") // mem-inst at rob head not issue
836*d2b20d1aSTang Haojin    // freelist full
837*d2b20d1aSTang Haojin    val IntFlStall = Value("IntFlStall")
838*d2b20d1aSTang Haojin    val FpFlStall = Value("FpFlStall")
839*d2b20d1aSTang Haojin    // dispatch queue full
840*d2b20d1aSTang Haojin    val IntDqStall = Value("IntDqStall")
841*d2b20d1aSTang Haojin    val FpDqStall = Value("FpDqStall")
842*d2b20d1aSTang Haojin    val LsDqStall = Value("LsDqStall")
843*d2b20d1aSTang Haojin
844*d2b20d1aSTang Haojin    // memblock
845*d2b20d1aSTang Haojin    val LoadTLBStall = Value("LoadTLBStall")
846*d2b20d1aSTang Haojin    val LoadL1Stall = Value("LoadL1Stall")
847*d2b20d1aSTang Haojin    val LoadL2Stall = Value("LoadL2Stall")
848*d2b20d1aSTang Haojin    val LoadL3Stall = Value("LoadL3Stall")
849*d2b20d1aSTang Haojin    val LoadMemStall = Value("LoadMemStall")
850*d2b20d1aSTang Haojin    val StoreStall = Value("StoreStall") // include store tlb miss
851*d2b20d1aSTang Haojin    val AtomicStall = Value("AtomicStall") // atomic, load reserved, store conditional
852*d2b20d1aSTang Haojin
853*d2b20d1aSTang Haojin    // xs replay (different to gem5)
854*d2b20d1aSTang Haojin    val LoadVioReplayStall = Value("LoadVioReplayStall")
855*d2b20d1aSTang Haojin    val LoadMSHRReplayStall = Value("LoadMSHRReplayStall")
856*d2b20d1aSTang Haojin
857*d2b20d1aSTang Haojin    // bad speculation
858*d2b20d1aSTang Haojin    val ControlRecoveryStall = Value("ControlRecoveryStall")
859*d2b20d1aSTang Haojin    val MemVioRecoveryStall = Value("MemVioRecoveryStall")
860*d2b20d1aSTang Haojin    val OtherRecoveryStall = Value("OtherRecoveryStall")
861*d2b20d1aSTang Haojin
862*d2b20d1aSTang Haojin    val FlushedInsts = Value("FlushedInsts") // control flushed, memvio flushed, others
863*d2b20d1aSTang Haojin
864*d2b20d1aSTang Haojin    val OtherCoreStall = Value("OtherCoreStall")
865*d2b20d1aSTang Haojin
866*d2b20d1aSTang Haojin    val NumStallReasons = Value("NumStallReasons")
867*d2b20d1aSTang Haojin  }
8689a2e6b8aSLinJiawei}
869