xref: /XiangShan/src/main/scala/xiangshan/package.scala (revision 1285b047a7acd549090577f30fe04acb33bbac9e)
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._
252225d46eSJiawei Linimport xiangshan.backend.exu._
2654034ccdSZhangZifeiimport xiangshan.backend.{Std, ScheLaneConfig}
272225d46eSJiawei Lin
289a2e6b8aSLinJiaweipackage object xiangshan {
299ee9f926SYikeZhou  object SrcType {
30*1285b047SXuan Hu    def imm = "b000".U
31*1285b047SXuan Hu    def pc  = "b000".U
32*1285b047SXuan Hu    def xp  = "b001".U
33*1285b047SXuan Hu    def fp  = "b010".U
34*1285b047SXuan Hu    def vp  = "b100".U
3504b56283SZhangZifei
36*1285b047SXuan Hu    // alias
37*1285b047SXuan Hu    def reg = this.xp
381a3df1feSYikeZhou    def DC  = imm // Don't Care
39*1285b047SXuan Hu    def X   = BitPat("b???")
404d24c305SYikeZhou
4104b56283SZhangZifei    def isPc(srcType: UInt) = srcType===pc
4204b56283SZhangZifei    def isImm(srcType: UInt) = srcType===imm
43*1285b047SXuan Hu    def isReg(srcType: UInt) = srcType(0)
442b4e8253SYinan Xu    def isFp(srcType: UInt) = srcType(1)
45*1285b047SXuan Hu    def isVp(srcType: UInt) = srcType(2)
46*1285b047SXuan Hu    def isPcOrImm(srcType: UInt) = isPc(srcType) || isImm(srcType)
4704b56283SZhangZifei
48*1285b047SXuan Hu    def apply() = UInt(3.W)
499a2e6b8aSLinJiawei  }
509a2e6b8aSLinJiawei
519a2e6b8aSLinJiawei  object SrcState {
52100aa93cSYinan Xu    def busy    = "b0".U
53100aa93cSYinan Xu    def rdy     = "b1".U
54100aa93cSYinan Xu    // def specRdy = "b10".U // speculative ready, for future use
55100aa93cSYinan Xu    def apply() = UInt(1.W)
569a2e6b8aSLinJiawei  }
579a2e6b8aSLinJiawei
582225d46eSJiawei Lin  object FuType {
59cafb3558SLinJiawei    def jmp          = "b0000".U
60cafb3558SLinJiawei    def i2f          = "b0001".U
61cafb3558SLinJiawei    def csr          = "b0010".U
62975b9ea3SYinan Xu    def alu          = "b0110".U
63cafb3558SLinJiawei    def mul          = "b0100".U
64cafb3558SLinJiawei    def div          = "b0101".U
65975b9ea3SYinan Xu    def fence        = "b0011".U
663feeca58Szfw    def bku          = "b0111".U
67cafb3558SLinJiawei
68cafb3558SLinJiawei    def fmac         = "b1000".U
6992ab24ebSYinan Xu    def fmisc        = "b1011".U
70cafb3558SLinJiawei    def fDivSqrt     = "b1010".U
71cafb3558SLinJiawei
72cafb3558SLinJiawei    def ldu          = "b1100".U
73cafb3558SLinJiawei    def stu          = "b1101".U
7492ab24ebSYinan Xu    def mou          = "b1111".U // for amo, lr, sc, fence
759a2e6b8aSLinJiawei
766e7c9679Shuxuan0307    def X            = BitPat("b????")
776e7c9679Shuxuan0307
78ee8ff153Szfw    def num = 14
792225d46eSJiawei Lin
809a2e6b8aSLinJiawei    def apply() = UInt(log2Up(num).W)
819a2e6b8aSLinJiawei
82cafb3558SLinJiawei    def isIntExu(fuType: UInt) = !fuType(3)
836ac289b3SLinJiawei    def isJumpExu(fuType: UInt) = fuType === jmp
84cafb3558SLinJiawei    def isFpExu(fuType: UInt) = fuType(3, 2) === "b10".U
85cafb3558SLinJiawei    def isMemExu(fuType: UInt) = fuType(3, 2) === "b11".U
8692ab24ebSYinan Xu    def isLoadStore(fuType: UInt) = isMemExu(fuType) && !fuType(1)
8792ab24ebSYinan Xu    def isStoreExu(fuType: UInt) = isMemExu(fuType) && fuType(0)
880f9d3717SYinan Xu    def isAMO(fuType: UInt) = fuType(1)
89af2f7849Shappy-lx    def isFence(fuType: UInt) = fuType === fence
90af2f7849Shappy-lx    def isSvinvalBegin(fuType: UInt, func: UInt, flush: Bool) = isFence(fuType) && func === FenceOpType.nofence && !flush
91af2f7849Shappy-lx    def isSvinval(fuType: UInt, func: UInt, flush: Bool) = isFence(fuType) && func === FenceOpType.sfence && !flush
92af2f7849Shappy-lx    def isSvinvalEnd(fuType: UInt, func: UInt, flush: Bool) = isFence(fuType) && func === FenceOpType.nofence && flush
93af2f7849Shappy-lx
9492ab24ebSYinan Xu
9592ab24ebSYinan Xu    def jmpCanAccept(fuType: UInt) = !fuType(2)
96ee8ff153Szfw    def mduCanAccept(fuType: UInt) = fuType(2) && !fuType(1) || fuType(2) && fuType(1) && fuType(0)
97ee8ff153Szfw    def aluCanAccept(fuType: UInt) = fuType(2) && fuType(1) && !fuType(0)
9892ab24ebSYinan Xu
9992ab24ebSYinan Xu    def fmacCanAccept(fuType: UInt) = !fuType(1)
10092ab24ebSYinan Xu    def fmiscCanAccept(fuType: UInt) = fuType(1)
10192ab24ebSYinan Xu
10292ab24ebSYinan Xu    def loadCanAccept(fuType: UInt) = !fuType(0)
10392ab24ebSYinan Xu    def storeCanAccept(fuType: UInt) = fuType(0)
10492ab24ebSYinan Xu
10592ab24ebSYinan Xu    def storeIsAMO(fuType: UInt) = fuType(1)
106cafb3558SLinJiawei
107cafb3558SLinJiawei    val functionNameMap = Map(
108cafb3558SLinJiawei      jmp.litValue() -> "jmp",
109ebb8ebf8SYinan Xu      i2f.litValue() -> "int_to_float",
110cafb3558SLinJiawei      csr.litValue() -> "csr",
111cafb3558SLinJiawei      alu.litValue() -> "alu",
112cafb3558SLinJiawei      mul.litValue() -> "mul",
113cafb3558SLinJiawei      div.litValue() -> "div",
114b8f08ca0SZhangZifei      fence.litValue() -> "fence",
1153feeca58Szfw      bku.litValue() -> "bku",
116cafb3558SLinJiawei      fmac.litValue() -> "fmac",
117cafb3558SLinJiawei      fmisc.litValue() -> "fmisc",
118d18dc7e6Swakafa      fDivSqrt.litValue() -> "fdiv_fsqrt",
119cafb3558SLinJiawei      ldu.litValue() -> "load",
120ebb8ebf8SYinan Xu      stu.litValue() -> "store",
121ebb8ebf8SYinan Xu      mou.litValue() -> "mou"
122cafb3558SLinJiawei    )
1239a2e6b8aSLinJiawei  }
1249a2e6b8aSLinJiawei
1252225d46eSJiawei Lin  object FuOpType {
126675acc68SYinan Xu    def apply() = UInt(7.W)
127361e6d51SJiuyang Liu    def X = BitPat("b???????")
128ebd97ecbSzhanglinjuan  }
129518d8658SYinan Xu
130a3edac52SYinan Xu  object CommitType {
131c3abb8b6SYinan Xu    def NORMAL = "b000".U  // int/fp
132c3abb8b6SYinan Xu    def BRANCH = "b001".U  // branch
133c3abb8b6SYinan Xu    def LOAD   = "b010".U  // load
134c3abb8b6SYinan Xu    def STORE  = "b011".U  // store
135518d8658SYinan Xu
136c3abb8b6SYinan Xu    def apply() = UInt(3.W)
137c3abb8b6SYinan Xu    def isFused(commitType: UInt): Bool = commitType(2)
138c3abb8b6SYinan Xu    def isLoadStore(commitType: UInt): Bool = !isFused(commitType) && commitType(1)
139c3abb8b6SYinan Xu    def lsInstIsStore(commitType: UInt): Bool = commitType(0)
140c3abb8b6SYinan Xu    def isStore(commitType: UInt): Bool = isLoadStore(commitType) && lsInstIsStore(commitType)
141c3abb8b6SYinan Xu    def isBranch(commitType: UInt): Bool = commitType(0) && !commitType(1) && !isFused(commitType)
142518d8658SYinan Xu  }
143bfb958a3SYinan Xu
144bfb958a3SYinan Xu  object RedirectLevel {
1452d7c7105SYinan Xu    def flushAfter = "b0".U
1462d7c7105SYinan Xu    def flush      = "b1".U
147bfb958a3SYinan Xu
1482d7c7105SYinan Xu    def apply() = UInt(1.W)
1492d7c7105SYinan Xu    // def isUnconditional(level: UInt) = level(1)
150bfb958a3SYinan Xu    def flushItself(level: UInt) = level(0)
1512d7c7105SYinan Xu    // def isException(level: UInt) = level(1) && level(0)
152bfb958a3SYinan Xu  }
153baf8def6SYinan Xu
154baf8def6SYinan Xu  object ExceptionVec {
155baf8def6SYinan Xu    def apply() = Vec(16, Bool())
156baf8def6SYinan Xu  }
157a8e04b1dSYinan Xu
158c60c1ab4SWilliam Wang  object PMAMode {
1598d9a04fcSWilliam Wang    def R = "b1".U << 0 //readable
1608d9a04fcSWilliam Wang    def W = "b1".U << 1 //writeable
1618d9a04fcSWilliam Wang    def X = "b1".U << 2 //executable
1628d9a04fcSWilliam Wang    def I = "b1".U << 3 //cacheable: icache
1638d9a04fcSWilliam Wang    def D = "b1".U << 4 //cacheable: dcache
1648d9a04fcSWilliam Wang    def S = "b1".U << 5 //enable speculative access
165cff68e26SWilliam Wang    def A = "b1".U << 6 //enable atomic operation, A imply R & W
1668d9a04fcSWilliam Wang    def C = "b1".U << 7 //if it is cacheable is configable
167c60c1ab4SWilliam Wang    def Reserved = "b0".U
168c60c1ab4SWilliam Wang
169c60c1ab4SWilliam Wang    def apply() = UInt(7.W)
170c60c1ab4SWilliam Wang
171c60c1ab4SWilliam Wang    def read(mode: UInt) = mode(0)
172c60c1ab4SWilliam Wang    def write(mode: UInt) = mode(1)
173c60c1ab4SWilliam Wang    def execute(mode: UInt) = mode(2)
174c60c1ab4SWilliam Wang    def icache(mode: UInt) = mode(3)
175c60c1ab4SWilliam Wang    def dcache(mode: UInt) = mode(4)
176c60c1ab4SWilliam Wang    def speculate(mode: UInt) = mode(5)
177c60c1ab4SWilliam Wang    def atomic(mode: UInt) = mode(6)
178c60c1ab4SWilliam Wang    def configable_cache(mode: UInt) = mode(7)
179c60c1ab4SWilliam Wang
180c60c1ab4SWilliam Wang    def strToMode(s: String) = {
181423b9255SWilliam Wang      var result = 0.U(8.W)
182c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("R") >= 0) result = result + R
183c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("W") >= 0) result = result + W
184c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("X") >= 0) result = result + X
185c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("I") >= 0) result = result + I
186c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("D") >= 0) result = result + D
187c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("S") >= 0) result = result + S
188c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("A") >= 0) result = result + A
189c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("C") >= 0) result = result + C
190c60c1ab4SWilliam Wang      result
191c60c1ab4SWilliam Wang    }
192c60c1ab4SWilliam Wang  }
1932225d46eSJiawei Lin
1942225d46eSJiawei Lin
1952225d46eSJiawei Lin  object CSROpType {
1962225d46eSJiawei Lin    def jmp  = "b000".U
1972225d46eSJiawei Lin    def wrt  = "b001".U
1982225d46eSJiawei Lin    def set  = "b010".U
1992225d46eSJiawei Lin    def clr  = "b011".U
200b6900d94SYinan Xu    def wfi  = "b100".U
2012225d46eSJiawei Lin    def wrti = "b101".U
2022225d46eSJiawei Lin    def seti = "b110".U
2032225d46eSJiawei Lin    def clri = "b111".U
2045d669833SYinan Xu    def needAccess(op: UInt): Bool = op(1, 0) =/= 0.U
2052225d46eSJiawei Lin  }
2062225d46eSJiawei Lin
2072225d46eSJiawei Lin  // jump
2082225d46eSJiawei Lin  object JumpOpType {
2092225d46eSJiawei Lin    def jal  = "b00".U
2102225d46eSJiawei Lin    def jalr = "b01".U
2112225d46eSJiawei Lin    def auipc = "b10".U
2122225d46eSJiawei Lin//    def call = "b11_011".U
2132225d46eSJiawei Lin//    def ret  = "b11_100".U
2142225d46eSJiawei Lin    def jumpOpisJalr(op: UInt) = op(0)
2152225d46eSJiawei Lin    def jumpOpisAuipc(op: UInt) = op(1)
2162225d46eSJiawei Lin  }
2172225d46eSJiawei Lin
2182225d46eSJiawei Lin  object FenceOpType {
2192225d46eSJiawei Lin    def fence  = "b10000".U
2202225d46eSJiawei Lin    def sfence = "b10001".U
2212225d46eSJiawei Lin    def fencei = "b10010".U
222af2f7849Shappy-lx    def nofence= "b00000".U
2232225d46eSJiawei Lin  }
2242225d46eSJiawei Lin
2252225d46eSJiawei Lin  object ALUOpType {
226ee8ff153Szfw    // shift optype
227675acc68SYinan Xu    def slliuw     = "b000_0000".U // slliuw: ZEXT(src1[31:0]) << shamt
228675acc68SYinan Xu    def sll        = "b000_0001".U // sll:     src1 << src2
229ee8ff153Szfw
230675acc68SYinan Xu    def bclr       = "b000_0010".U // bclr:    src1 & ~(1 << src2[5:0])
231675acc68SYinan Xu    def bset       = "b000_0011".U // bset:    src1 | (1 << src2[5:0])
232675acc68SYinan Xu    def binv       = "b000_0100".U // binv:    src1 ^ ~(1 << src2[5:0])
233ee8ff153Szfw
234675acc68SYinan Xu    def srl        = "b000_0101".U // srl:     src1 >> src2
235675acc68SYinan Xu    def bext       = "b000_0110".U // bext:    (src1 >> src2)[0]
236675acc68SYinan Xu    def sra        = "b000_0111".U // sra:     src1 >> src2 (arithmetic)
237ee8ff153Szfw
2387b441e5eSYinan Xu    def rol        = "b000_1001".U // rol:     (src1 << src2) | (src1 >> (xlen - src2))
2397b441e5eSYinan Xu    def ror        = "b000_1011".U // ror:     (src1 >> src2) | (src1 << (xlen - src2))
240184a1958Szfw
241ee8ff153Szfw    // RV64 32bit optype
242675acc68SYinan Xu    def addw       = "b001_0000".U // addw:      SEXT((src1 + src2)[31:0])
243675acc68SYinan Xu    def oddaddw    = "b001_0001".U // oddaddw:   SEXT((src1[0] + src2)[31:0])
244675acc68SYinan Xu    def subw       = "b001_0010".U // subw:      SEXT((src1 - src2)[31:0])
245ee8ff153Szfw
246675acc68SYinan Xu    def addwbit    = "b001_0100".U // addwbit:   (src1 + src2)[0]
247675acc68SYinan Xu    def addwbyte   = "b001_0101".U // addwbyte:  (src1 + src2)[7:0]
248675acc68SYinan Xu    def addwzexth  = "b001_0110".U // addwzexth: ZEXT((src1  + src2)[15:0])
249675acc68SYinan Xu    def addwsexth  = "b001_0111".U // addwsexth: SEXT((src1  + src2)[15:0])
250ee8ff153Szfw
251675acc68SYinan Xu    def sllw       = "b001_1000".U // sllw:     SEXT((src1 << src2)[31:0])
252675acc68SYinan Xu    def srlw       = "b001_1001".U // srlw:     SEXT((src1[31:0] >> src2)[31:0])
253675acc68SYinan Xu    def sraw       = "b001_1010".U // sraw:     SEXT((src1[31:0] >> src2)[31:0])
254675acc68SYinan Xu    def rolw       = "b001_1100".U
255675acc68SYinan Xu    def rorw       = "b001_1101".U
256675acc68SYinan Xu
257675acc68SYinan Xu    // ADD-op
258675acc68SYinan Xu    def adduw      = "b010_0000".U // adduw:  src1[31:0]  + src2
259675acc68SYinan Xu    def add        = "b010_0001".U // add:     src1        + src2
260675acc68SYinan Xu    def oddadd     = "b010_0010".U // oddadd:  src1[0]     + src2
261675acc68SYinan Xu
262675acc68SYinan Xu    def sr29add    = "b010_0100".U // sr29add: src1[63:29] + src2
263675acc68SYinan Xu    def sr30add    = "b010_0101".U // sr30add: src1[63:30] + src2
264675acc68SYinan Xu    def sr31add    = "b010_0110".U // sr31add: src1[63:31] + src2
265675acc68SYinan Xu    def sr32add    = "b010_0111".U // sr32add: src1[63:32] + src2
266675acc68SYinan Xu
267675acc68SYinan Xu    def sh1adduw   = "b010_1000".U // sh1adduw: {src1[31:0], 1'b0} + src2
268675acc68SYinan Xu    def sh1add     = "b010_1001".U // sh1add: {src1[62:0], 1'b0} + src2
269675acc68SYinan Xu    def sh2adduw   = "b010_1010".U // sh2add_uw: {src1[31:0], 2'b0} + src2
270675acc68SYinan Xu    def sh2add     = "b010_1011".U // sh2add: {src1[61:0], 2'b0} + src2
271675acc68SYinan Xu    def sh3adduw   = "b010_1100".U // sh3add_uw: {src1[31:0], 3'b0} + src2
272675acc68SYinan Xu    def sh3add     = "b010_1101".U // sh3add: {src1[60:0], 3'b0} + src2
273675acc68SYinan Xu    def sh4add     = "b010_1111".U // sh4add: {src1[59:0], 4'b0} + src2
274675acc68SYinan Xu
275675acc68SYinan Xu    // SUB-op: src1 - src2
276675acc68SYinan Xu    def sub        = "b011_0000".U
277675acc68SYinan Xu    def sltu       = "b011_0001".U
278675acc68SYinan Xu    def slt        = "b011_0010".U
279675acc68SYinan Xu    def maxu       = "b011_0100".U
280675acc68SYinan Xu    def minu       = "b011_0101".U
281675acc68SYinan Xu    def max        = "b011_0110".U
282675acc68SYinan Xu    def min        = "b011_0111".U
283675acc68SYinan Xu
284675acc68SYinan Xu    // branch
285675acc68SYinan Xu    def beq        = "b111_0000".U
286675acc68SYinan Xu    def bne        = "b111_0010".U
287675acc68SYinan Xu    def blt        = "b111_1000".U
288675acc68SYinan Xu    def bge        = "b111_1010".U
289675acc68SYinan Xu    def bltu       = "b111_1100".U
290675acc68SYinan Xu    def bgeu       = "b111_1110".U
291675acc68SYinan Xu
292675acc68SYinan Xu    // misc optype
293675acc68SYinan Xu    def and        = "b100_0000".U
294675acc68SYinan Xu    def andn       = "b100_0001".U
295675acc68SYinan Xu    def or         = "b100_0010".U
296675acc68SYinan Xu    def orn        = "b100_0011".U
297675acc68SYinan Xu    def xor        = "b100_0100".U
298675acc68SYinan Xu    def xnor       = "b100_0101".U
299675acc68SYinan Xu    def orcb       = "b100_0110".U
300675acc68SYinan Xu
301675acc68SYinan Xu    def sextb      = "b100_1000".U
302675acc68SYinan Xu    def packh      = "b100_1001".U
303675acc68SYinan Xu    def sexth      = "b100_1010".U
304675acc68SYinan Xu    def packw      = "b100_1011".U
305675acc68SYinan Xu
306675acc68SYinan Xu    def revb       = "b101_0000".U
307675acc68SYinan Xu    def rev8       = "b101_0001".U
308675acc68SYinan Xu    def pack       = "b101_0010".U
309675acc68SYinan Xu    def orh48      = "b101_0011".U
310675acc68SYinan Xu
311675acc68SYinan Xu    def szewl1     = "b101_1000".U
312675acc68SYinan Xu    def szewl2     = "b101_1001".U
313675acc68SYinan Xu    def szewl3     = "b101_1010".U
314675acc68SYinan Xu    def byte2      = "b101_1011".U
315675acc68SYinan Xu
316675acc68SYinan Xu    def andlsb     = "b110_0000".U
317675acc68SYinan Xu    def andzexth   = "b110_0001".U
318675acc68SYinan Xu    def orlsb      = "b110_0010".U
319675acc68SYinan Xu    def orzexth    = "b110_0011".U
320675acc68SYinan Xu    def xorlsb     = "b110_0100".U
321675acc68SYinan Xu    def xorzexth   = "b110_0101".U
322675acc68SYinan Xu    def orcblsb    = "b110_0110".U
323675acc68SYinan Xu    def orcbzexth  = "b110_0111".U
324675acc68SYinan Xu
325675acc68SYinan Xu    def isAddw(func: UInt) = func(6, 4) === "b001".U && !func(3) && !func(1)
326675acc68SYinan Xu    def isSimpleLogic(func: UInt) = func(6, 4) === "b100".U && !func(0)
327675acc68SYinan Xu    def logicToLsb(func: UInt) = Cat("b110".U(3.W), func(3, 1), 0.U(1.W))
328675acc68SYinan Xu    def logicToZexth(func: UInt) = Cat("b110".U(3.W), func(3, 1), 1.U(1.W))
329675acc68SYinan Xu    def isBranch(func: UInt) = func(6, 4) === "b111".U
330675acc68SYinan Xu    def getBranchType(func: UInt) = func(3, 2)
331675acc68SYinan Xu    def isBranchInvert(func: UInt) = func(1)
332675acc68SYinan Xu
333675acc68SYinan Xu    def apply() = UInt(7.W)
3342225d46eSJiawei Lin  }
3352225d46eSJiawei Lin
3362225d46eSJiawei Lin  object MDUOpType {
3372225d46eSJiawei Lin    // mul
3382225d46eSJiawei Lin    // bit encoding: | type (2bit) | isWord(1bit) | opcode(2bit) |
3392225d46eSJiawei Lin    def mul    = "b00000".U
3402225d46eSJiawei Lin    def mulh   = "b00001".U
3412225d46eSJiawei Lin    def mulhsu = "b00010".U
3422225d46eSJiawei Lin    def mulhu  = "b00011".U
3432225d46eSJiawei Lin    def mulw   = "b00100".U
3442225d46eSJiawei Lin
34588825c5cSYinan Xu    def mulw7  = "b01100".U
34688825c5cSYinan Xu
3472225d46eSJiawei Lin    // div
3482225d46eSJiawei Lin    // bit encoding: | type (2bit) | isWord(1bit) | isSign(1bit) | opcode(1bit) |
34988825c5cSYinan Xu    def div    = "b10000".U
35088825c5cSYinan Xu    def divu   = "b10010".U
35188825c5cSYinan Xu    def rem    = "b10001".U
35288825c5cSYinan Xu    def remu   = "b10011".U
3532225d46eSJiawei Lin
35488825c5cSYinan Xu    def divw   = "b10100".U
35588825c5cSYinan Xu    def divuw  = "b10110".U
35688825c5cSYinan Xu    def remw   = "b10101".U
35788825c5cSYinan Xu    def remuw  = "b10111".U
3582225d46eSJiawei Lin
35988825c5cSYinan Xu    def isMul(op: UInt) = !op(4)
36088825c5cSYinan Xu    def isDiv(op: UInt) = op(4)
3612225d46eSJiawei Lin
3622225d46eSJiawei Lin    def isDivSign(op: UInt) = isDiv(op) && !op(1)
3632225d46eSJiawei Lin    def isW(op: UInt) = op(2)
3642225d46eSJiawei Lin    def isH(op: UInt) = (isDiv(op) && op(0)) || (isMul(op) && op(1, 0) =/= 0.U)
3652225d46eSJiawei Lin    def getMulOp(op: UInt) = op(1, 0)
3662225d46eSJiawei Lin  }
3672225d46eSJiawei Lin
3682225d46eSJiawei Lin  object LSUOpType {
369d200f594SWilliam Wang    // load pipeline
3702225d46eSJiawei Lin
371d200f594SWilliam Wang    // normal load
372d200f594SWilliam Wang    // Note: bit(1, 0) are size, DO NOT CHANGE
373d200f594SWilliam Wang    // bit encoding: | load 0 | is unsigned(1bit) | size(2bit) |
374d200f594SWilliam Wang    def lb       = "b0000".U
375d200f594SWilliam Wang    def lh       = "b0001".U
376d200f594SWilliam Wang    def lw       = "b0010".U
377d200f594SWilliam Wang    def ld       = "b0011".U
378d200f594SWilliam Wang    def lbu      = "b0100".U
379d200f594SWilliam Wang    def lhu      = "b0101".U
380d200f594SWilliam Wang    def lwu      = "b0110".U
381ca18a0b4SWilliam Wang
382d200f594SWilliam Wang    // Zicbop software prefetch
383d200f594SWilliam Wang    // bit encoding: | prefetch 1 | 0 | prefetch type (2bit) |
384d200f594SWilliam Wang    def prefetch_i = "b1000".U // TODO
385d200f594SWilliam Wang    def prefetch_r = "b1001".U
386d200f594SWilliam Wang    def prefetch_w = "b1010".U
387ca18a0b4SWilliam Wang
388d200f594SWilliam Wang    def isPrefetch(op: UInt): Bool = op(3)
389d200f594SWilliam Wang
390d200f594SWilliam Wang    // store pipeline
391d200f594SWilliam Wang    // normal store
392d200f594SWilliam Wang    // bit encoding: | store 00 | size(2bit) |
393d200f594SWilliam Wang    def sb       = "b0000".U
394d200f594SWilliam Wang    def sh       = "b0001".U
395d200f594SWilliam Wang    def sw       = "b0010".U
396d200f594SWilliam Wang    def sd       = "b0011".U
397d200f594SWilliam Wang
398d200f594SWilliam Wang    // l1 cache op
399d200f594SWilliam Wang    // bit encoding: | cbo_zero 01 | size(2bit) 11 |
400d200f594SWilliam Wang    def cbo_zero  = "b0111".U
401d200f594SWilliam Wang
402d200f594SWilliam Wang    // llc op
403d200f594SWilliam Wang    // bit encoding: | prefetch 11 | suboptype(2bit) |
404d200f594SWilliam Wang    def cbo_clean = "b1100".U
405d200f594SWilliam Wang    def cbo_flush = "b1101".U
406d200f594SWilliam Wang    def cbo_inval = "b1110".U
407d200f594SWilliam Wang
408d200f594SWilliam Wang    def isCbo(op: UInt): Bool = op(3, 2) === "b11".U
4092225d46eSJiawei Lin
4102225d46eSJiawei Lin    // atomics
4112225d46eSJiawei Lin    // bit(1, 0) are size
4122225d46eSJiawei Lin    // since atomics use a different fu type
4132225d46eSJiawei Lin    // so we can safely reuse other load/store's encodings
414d200f594SWilliam Wang    // bit encoding: | optype(4bit) | size (2bit) |
4152225d46eSJiawei Lin    def lr_w      = "b000010".U
4162225d46eSJiawei Lin    def sc_w      = "b000110".U
4172225d46eSJiawei Lin    def amoswap_w = "b001010".U
4182225d46eSJiawei Lin    def amoadd_w  = "b001110".U
4192225d46eSJiawei Lin    def amoxor_w  = "b010010".U
4202225d46eSJiawei Lin    def amoand_w  = "b010110".U
4212225d46eSJiawei Lin    def amoor_w   = "b011010".U
4222225d46eSJiawei Lin    def amomin_w  = "b011110".U
4232225d46eSJiawei Lin    def amomax_w  = "b100010".U
4242225d46eSJiawei Lin    def amominu_w = "b100110".U
4252225d46eSJiawei Lin    def amomaxu_w = "b101010".U
4262225d46eSJiawei Lin
4272225d46eSJiawei Lin    def lr_d      = "b000011".U
4282225d46eSJiawei Lin    def sc_d      = "b000111".U
4292225d46eSJiawei Lin    def amoswap_d = "b001011".U
4302225d46eSJiawei Lin    def amoadd_d  = "b001111".U
4312225d46eSJiawei Lin    def amoxor_d  = "b010011".U
4322225d46eSJiawei Lin    def amoand_d  = "b010111".U
4332225d46eSJiawei Lin    def amoor_d   = "b011011".U
4342225d46eSJiawei Lin    def amomin_d  = "b011111".U
4352225d46eSJiawei Lin    def amomax_d  = "b100011".U
4362225d46eSJiawei Lin    def amominu_d = "b100111".U
4372225d46eSJiawei Lin    def amomaxu_d = "b101011".U
438b6982e83SLemover
439b6982e83SLemover    def size(op: UInt) = op(1,0)
4402225d46eSJiawei Lin  }
4412225d46eSJiawei Lin
4423feeca58Szfw  object BKUOpType {
443ee8ff153Szfw
4443feeca58Szfw    def clmul       = "b000000".U
4453feeca58Szfw    def clmulh      = "b000001".U
4463feeca58Szfw    def clmulr      = "b000010".U
4473feeca58Szfw    def xpermn      = "b000100".U
4483feeca58Szfw    def xpermb      = "b000101".U
449ee8ff153Szfw
4503feeca58Szfw    def clz         = "b001000".U
4513feeca58Szfw    def clzw        = "b001001".U
4523feeca58Szfw    def ctz         = "b001010".U
4533feeca58Szfw    def ctzw        = "b001011".U
4543feeca58Szfw    def cpop        = "b001100".U
4553feeca58Szfw    def cpopw       = "b001101".U
45607596dc6Szfw
4573feeca58Szfw    // 01xxxx is reserve
4583feeca58Szfw    def aes64es     = "b100000".U
4593feeca58Szfw    def aes64esm    = "b100001".U
4603feeca58Szfw    def aes64ds     = "b100010".U
4613feeca58Szfw    def aes64dsm    = "b100011".U
4623feeca58Szfw    def aes64im     = "b100100".U
4633feeca58Szfw    def aes64ks1i   = "b100101".U
4643feeca58Szfw    def aes64ks2    = "b100110".U
4653feeca58Szfw
4663feeca58Szfw    // merge to two instruction sm4ks & sm4ed
46719bcce38SFawang Zhang    def sm4ed0      = "b101000".U
46819bcce38SFawang Zhang    def sm4ed1      = "b101001".U
46919bcce38SFawang Zhang    def sm4ed2      = "b101010".U
47019bcce38SFawang Zhang    def sm4ed3      = "b101011".U
47119bcce38SFawang Zhang    def sm4ks0      = "b101100".U
47219bcce38SFawang Zhang    def sm4ks1      = "b101101".U
47319bcce38SFawang Zhang    def sm4ks2      = "b101110".U
47419bcce38SFawang Zhang    def sm4ks3      = "b101111".U
4753feeca58Szfw
4763feeca58Szfw    def sha256sum0  = "b110000".U
4773feeca58Szfw    def sha256sum1  = "b110001".U
4783feeca58Szfw    def sha256sig0  = "b110010".U
4793feeca58Szfw    def sha256sig1  = "b110011".U
4803feeca58Szfw    def sha512sum0  = "b110100".U
4813feeca58Szfw    def sha512sum1  = "b110101".U
4823feeca58Szfw    def sha512sig0  = "b110110".U
4833feeca58Szfw    def sha512sig1  = "b110111".U
4843feeca58Szfw
4853feeca58Szfw    def sm3p0       = "b111000".U
4863feeca58Szfw    def sm3p1       = "b111001".U
487ee8ff153Szfw  }
488ee8ff153Szfw
4892225d46eSJiawei Lin  object BTBtype {
4902225d46eSJiawei Lin    def B = "b00".U  // branch
4912225d46eSJiawei Lin    def J = "b01".U  // jump
4922225d46eSJiawei Lin    def I = "b10".U  // indirect
4932225d46eSJiawei Lin    def R = "b11".U  // return
4942225d46eSJiawei Lin
4952225d46eSJiawei Lin    def apply() = UInt(2.W)
4962225d46eSJiawei Lin  }
4972225d46eSJiawei Lin
4982225d46eSJiawei Lin  object SelImm {
499ee8ff153Szfw    def IMM_X  = "b0111".U
500ee8ff153Szfw    def IMM_S  = "b0000".U
501ee8ff153Szfw    def IMM_SB = "b0001".U
502ee8ff153Szfw    def IMM_U  = "b0010".U
503ee8ff153Szfw    def IMM_UJ = "b0011".U
504ee8ff153Szfw    def IMM_I  = "b0100".U
505ee8ff153Szfw    def IMM_Z  = "b0101".U
506ee8ff153Szfw    def INVALID_INSTR = "b0110".U
507ee8ff153Szfw    def IMM_B6 = "b1000".U
5082225d46eSJiawei Lin
5096e7c9679Shuxuan0307    def X      = BitPat("b????")
5106e7c9679Shuxuan0307
511ee8ff153Szfw    def apply() = UInt(4.W)
5122225d46eSJiawei Lin  }
5132225d46eSJiawei Lin
5146ab6918fSYinan Xu  object ExceptionNO {
5156ab6918fSYinan Xu    def instrAddrMisaligned = 0
5166ab6918fSYinan Xu    def instrAccessFault    = 1
5176ab6918fSYinan Xu    def illegalInstr        = 2
5186ab6918fSYinan Xu    def breakPoint          = 3
5196ab6918fSYinan Xu    def loadAddrMisaligned  = 4
5206ab6918fSYinan Xu    def loadAccessFault     = 5
5216ab6918fSYinan Xu    def storeAddrMisaligned = 6
5226ab6918fSYinan Xu    def storeAccessFault    = 7
5236ab6918fSYinan Xu    def ecallU              = 8
5246ab6918fSYinan Xu    def ecallS              = 9
5256ab6918fSYinan Xu    def ecallM              = 11
5266ab6918fSYinan Xu    def instrPageFault      = 12
5276ab6918fSYinan Xu    def loadPageFault       = 13
5286ab6918fSYinan Xu    // def singleStep          = 14
5296ab6918fSYinan Xu    def storePageFault      = 15
5306ab6918fSYinan Xu    def priorities = Seq(
5316ab6918fSYinan Xu      breakPoint, // TODO: different BP has different priority
5326ab6918fSYinan Xu      instrPageFault,
5336ab6918fSYinan Xu      instrAccessFault,
5346ab6918fSYinan Xu      illegalInstr,
5356ab6918fSYinan Xu      instrAddrMisaligned,
5366ab6918fSYinan Xu      ecallM, ecallS, ecallU,
537d880177dSYinan Xu      storeAddrMisaligned,
538d880177dSYinan Xu      loadAddrMisaligned,
5396ab6918fSYinan Xu      storePageFault,
5406ab6918fSYinan Xu      loadPageFault,
5416ab6918fSYinan Xu      storeAccessFault,
542d880177dSYinan Xu      loadAccessFault
5436ab6918fSYinan Xu    )
5446ab6918fSYinan Xu    def all = priorities.distinct.sorted
5456ab6918fSYinan Xu    def frontendSet = Seq(
5466ab6918fSYinan Xu      instrAddrMisaligned,
5476ab6918fSYinan Xu      instrAccessFault,
5486ab6918fSYinan Xu      illegalInstr,
5496ab6918fSYinan Xu      instrPageFault
5506ab6918fSYinan Xu    )
5516ab6918fSYinan Xu    def partialSelect(vec: Vec[Bool], select: Seq[Int]): Vec[Bool] = {
5526ab6918fSYinan Xu      val new_vec = Wire(ExceptionVec())
5536ab6918fSYinan Xu      new_vec.foreach(_ := false.B)
5546ab6918fSYinan Xu      select.foreach(i => new_vec(i) := vec(i))
5556ab6918fSYinan Xu      new_vec
5566ab6918fSYinan Xu    }
5576ab6918fSYinan Xu    def selectFrontend(vec: Vec[Bool]): Vec[Bool] = partialSelect(vec, frontendSet)
5586ab6918fSYinan Xu    def selectAll(vec: Vec[Bool]): Vec[Bool] = partialSelect(vec, ExceptionNO.all)
5596ab6918fSYinan Xu    def selectByFu(vec:Vec[Bool], fuConfig: FuConfig): Vec[Bool] =
5606ab6918fSYinan Xu      partialSelect(vec, fuConfig.exceptionOut)
5616ab6918fSYinan Xu    def selectByExu(vec:Vec[Bool], exuConfig: ExuConfig): Vec[Bool] =
5626ab6918fSYinan Xu      partialSelect(vec, exuConfig.exceptionOut)
5636ab6918fSYinan Xu    def selectByExu(vec:Vec[Bool], exuConfigs: Seq[ExuConfig]): Vec[Bool] =
5646ab6918fSYinan Xu      partialSelect(vec, exuConfigs.map(_.exceptionOut).reduce(_ ++ _).distinct.sorted)
5656ab6918fSYinan Xu  }
5666ab6918fSYinan Xu
5671c62c387SYinan Xu  def dividerGen(p: Parameters) = new DividerWrapper(p(XLen))(p)
568c3d7991bSJiawei Lin  def multiplierGen(p: Parameters) = new ArrayMultiplier(p(XLen) + 1)(p)
5692225d46eSJiawei Lin  def aluGen(p: Parameters) = new Alu()(p)
5703feeca58Szfw  def bkuGen(p: Parameters) = new Bku()(p)
5712225d46eSJiawei Lin  def jmpGen(p: Parameters) = new Jump()(p)
5722225d46eSJiawei Lin  def fenceGen(p: Parameters) = new Fence()(p)
5732225d46eSJiawei Lin  def csrGen(p: Parameters) = new CSR()(p)
5742225d46eSJiawei Lin  def i2fGen(p: Parameters) = new IntToFP()(p)
5752225d46eSJiawei Lin  def fmacGen(p: Parameters) = new FMA()(p)
5762225d46eSJiawei Lin  def f2iGen(p: Parameters) = new FPToInt()(p)
5772225d46eSJiawei Lin  def f2fGen(p: Parameters) = new FPToFP()(p)
5782225d46eSJiawei Lin  def fdivSqrtGen(p: Parameters) = new FDivSqrt()(p)
57985b4cd54SYinan Xu  def stdGen(p: Parameters) = new Std()(p)
5806ab6918fSYinan Xu  def mouDataGen(p: Parameters) = new Std()(p)
5812225d46eSJiawei Lin
5826cdd85d9SYinan Xu  def f2iSel(uop: MicroOp): Bool = {
5836cdd85d9SYinan Xu    uop.ctrl.rfWen
5842225d46eSJiawei Lin  }
5852225d46eSJiawei Lin
5866cdd85d9SYinan Xu  def i2fSel(uop: MicroOp): Bool = {
5876cdd85d9SYinan Xu    uop.ctrl.fpu.fromInt
5882225d46eSJiawei Lin  }
5892225d46eSJiawei Lin
5906cdd85d9SYinan Xu  def f2fSel(uop: MicroOp): Bool = {
5916cdd85d9SYinan Xu    val ctrl = uop.ctrl.fpu
5922225d46eSJiawei Lin    ctrl.fpWen && !ctrl.div && !ctrl.sqrt
5932225d46eSJiawei Lin  }
5942225d46eSJiawei Lin
5956cdd85d9SYinan Xu  def fdivSqrtSel(uop: MicroOp): Bool = {
5966cdd85d9SYinan Xu    val ctrl = uop.ctrl.fpu
5972225d46eSJiawei Lin    ctrl.div || ctrl.sqrt
5982225d46eSJiawei Lin  }
5992225d46eSJiawei Lin
6002225d46eSJiawei Lin  val aluCfg = FuConfig(
6011a0f06eeSYinan Xu    name = "alu",
6022225d46eSJiawei Lin    fuGen = aluGen,
6036cdd85d9SYinan Xu    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.alu,
6042225d46eSJiawei Lin    fuType = FuType.alu,
6052225d46eSJiawei Lin    numIntSrc = 2,
6062225d46eSJiawei Lin    numFpSrc = 0,
6072225d46eSJiawei Lin    writeIntRf = true,
6082225d46eSJiawei Lin    writeFpRf = false,
6092225d46eSJiawei Lin    hasRedirect = true,
6102225d46eSJiawei Lin  )
6112225d46eSJiawei Lin
6122225d46eSJiawei Lin  val jmpCfg = FuConfig(
6131a0f06eeSYinan Xu    name = "jmp",
6142225d46eSJiawei Lin    fuGen = jmpGen,
6156cdd85d9SYinan Xu    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.jmp,
6162225d46eSJiawei Lin    fuType = FuType.jmp,
6172225d46eSJiawei Lin    numIntSrc = 1,
6182225d46eSJiawei Lin    numFpSrc = 0,
6192225d46eSJiawei Lin    writeIntRf = true,
6202225d46eSJiawei Lin    writeFpRf = false,
6212225d46eSJiawei Lin    hasRedirect = true,
6222225d46eSJiawei Lin  )
6232225d46eSJiawei Lin
6242225d46eSJiawei Lin  val fenceCfg = FuConfig(
6251a0f06eeSYinan Xu    name = "fence",
6262225d46eSJiawei Lin    fuGen = fenceGen,
6276cdd85d9SYinan Xu    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.fence,
6286ab6918fSYinan Xu    FuType.fence, 2, 0, writeIntRf = false, writeFpRf = false,
629f1fe8698SLemover    latency = UncertainLatency(), exceptionOut = Seq(illegalInstr), // TODO: need rewrite latency structure, not just this value,
630f1fe8698SLemover    flushPipe = true
6312225d46eSJiawei Lin  )
6322225d46eSJiawei Lin
6332225d46eSJiawei Lin  val csrCfg = FuConfig(
6341a0f06eeSYinan Xu    name = "csr",
6352225d46eSJiawei Lin    fuGen = csrGen,
6366cdd85d9SYinan Xu    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.csr,
6372225d46eSJiawei Lin    fuType = FuType.csr,
6382225d46eSJiawei Lin    numIntSrc = 1,
6392225d46eSJiawei Lin    numFpSrc = 0,
6402225d46eSJiawei Lin    writeIntRf = true,
6412225d46eSJiawei Lin    writeFpRf = false,
6426ab6918fSYinan Xu    exceptionOut = Seq(illegalInstr, breakPoint, ecallU, ecallS, ecallM),
6436ab6918fSYinan Xu    flushPipe = true
6442225d46eSJiawei Lin  )
6452225d46eSJiawei Lin
6462225d46eSJiawei Lin  val i2fCfg = FuConfig(
6471a0f06eeSYinan Xu    name = "i2f",
6482225d46eSJiawei Lin    fuGen = i2fGen,
6492225d46eSJiawei Lin    fuSel = i2fSel,
6502225d46eSJiawei Lin    FuType.i2f,
6512225d46eSJiawei Lin    numIntSrc = 1,
6522225d46eSJiawei Lin    numFpSrc = 0,
6532225d46eSJiawei Lin    writeIntRf = false,
6542225d46eSJiawei Lin    writeFpRf = true,
6556ab6918fSYinan Xu    writeFflags = true,
656e174d629SJiawei Lin    latency = CertainLatency(2),
657e174d629SJiawei Lin    fastUopOut = true, fastImplemented = true
6582225d46eSJiawei Lin  )
6592225d46eSJiawei Lin
6602225d46eSJiawei Lin  val divCfg = FuConfig(
6611a0f06eeSYinan Xu    name = "div",
6622225d46eSJiawei Lin    fuGen = dividerGen,
66307596dc6Szfw    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.div,
6642225d46eSJiawei Lin    FuType.div,
6652225d46eSJiawei Lin    2,
6662225d46eSJiawei Lin    0,
6672225d46eSJiawei Lin    writeIntRf = true,
6682225d46eSJiawei Lin    writeFpRf = false,
669f83b578aSYinan Xu    latency = UncertainLatency(),
670f83b578aSYinan Xu    fastUopOut = true,
6711c62c387SYinan Xu    fastImplemented = true,
6725ee7cabeSYinan Xu    hasInputBuffer = (true, 4, true)
6732225d46eSJiawei Lin  )
6742225d46eSJiawei Lin
6752225d46eSJiawei Lin  val mulCfg = FuConfig(
6761a0f06eeSYinan Xu    name = "mul",
6772225d46eSJiawei Lin    fuGen = multiplierGen,
67807596dc6Szfw    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.mul,
6792225d46eSJiawei Lin    FuType.mul,
6802225d46eSJiawei Lin    2,
6812225d46eSJiawei Lin    0,
6822225d46eSJiawei Lin    writeIntRf = true,
6832225d46eSJiawei Lin    writeFpRf = false,
684b2482bc1SYinan Xu    latency = CertainLatency(2),
685f83b578aSYinan Xu    fastUopOut = true,
686b2482bc1SYinan Xu    fastImplemented = true
6872225d46eSJiawei Lin  )
6882225d46eSJiawei Lin
6893feeca58Szfw  val bkuCfg = FuConfig(
6903feeca58Szfw    name = "bku",
6913feeca58Szfw    fuGen = bkuGen,
6923feeca58Szfw    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.bku,
6933feeca58Szfw    fuType = FuType.bku,
694ee8ff153Szfw    numIntSrc = 2,
695ee8ff153Szfw    numFpSrc = 0,
696ee8ff153Szfw    writeIntRf = true,
697ee8ff153Szfw    writeFpRf = false,
698f83b578aSYinan Xu    latency = CertainLatency(1),
699f83b578aSYinan Xu    fastUopOut = true,
70007596dc6Szfw    fastImplemented = true
701ee8ff153Szfw )
702ee8ff153Szfw
7032225d46eSJiawei Lin  val fmacCfg = FuConfig(
7041a0f06eeSYinan Xu    name = "fmac",
7052225d46eSJiawei Lin    fuGen = fmacGen,
7062225d46eSJiawei Lin    fuSel = _ => true.B,
7076ab6918fSYinan Xu    FuType.fmac, 0, 3, writeIntRf = false, writeFpRf = true, writeFflags = true,
7084b65fc7eSJiawei Lin    latency = UncertainLatency(), fastUopOut = true, fastImplemented = true
7092225d46eSJiawei Lin  )
7102225d46eSJiawei Lin
7112225d46eSJiawei Lin  val f2iCfg = FuConfig(
7121a0f06eeSYinan Xu    name = "f2i",
7132225d46eSJiawei Lin    fuGen = f2iGen,
7142225d46eSJiawei Lin    fuSel = f2iSel,
7156ab6918fSYinan Xu    FuType.fmisc, 0, 1, writeIntRf = true, writeFpRf = false, writeFflags = true, latency = CertainLatency(2),
716b2482bc1SYinan Xu    fastUopOut = true, fastImplemented = true
7172225d46eSJiawei Lin  )
7182225d46eSJiawei Lin
7192225d46eSJiawei Lin  val f2fCfg = FuConfig(
7201a0f06eeSYinan Xu    name = "f2f",
7212225d46eSJiawei Lin    fuGen = f2fGen,
7222225d46eSJiawei Lin    fuSel = f2fSel,
7236ab6918fSYinan Xu    FuType.fmisc, 0, 1, writeIntRf = false, writeFpRf = true, writeFflags = true, latency = CertainLatency(2),
724b2482bc1SYinan Xu    fastUopOut = true, fastImplemented = true
7252225d46eSJiawei Lin  )
7262225d46eSJiawei Lin
7272225d46eSJiawei Lin  val fdivSqrtCfg = FuConfig(
7281a0f06eeSYinan Xu    name = "fdivSqrt",
7292225d46eSJiawei Lin    fuGen = fdivSqrtGen,
7302225d46eSJiawei Lin    fuSel = fdivSqrtSel,
7316ab6918fSYinan Xu    FuType.fDivSqrt, 0, 2, writeIntRf = false, writeFpRf = true, writeFflags = true, latency = UncertainLatency(),
732140aff85SYinan Xu    fastUopOut = true, fastImplemented = true, hasInputBuffer = (true, 8, true)
7332225d46eSJiawei Lin  )
7342225d46eSJiawei Lin
7352225d46eSJiawei Lin  val lduCfg = FuConfig(
7361a0f06eeSYinan Xu    "ldu",
7372225d46eSJiawei Lin    null, // DontCare
7382b4e8253SYinan Xu    (uop: MicroOp) => FuType.loadCanAccept(uop.ctrl.fuType),
7396ab6918fSYinan Xu    FuType.ldu, 1, 0, writeIntRf = true, writeFpRf = true,
7406ab6918fSYinan Xu    latency = UncertainLatency(),
7416ab6918fSYinan Xu    exceptionOut = Seq(loadAddrMisaligned, loadAccessFault, loadPageFault),
7426ab6918fSYinan Xu    flushPipe = true,
7436786cfb7SWilliam Wang    replayInst = true,
7446786cfb7SWilliam Wang    hasLoadError = true
7452225d46eSJiawei Lin  )
7462225d46eSJiawei Lin
74785b4cd54SYinan Xu  val staCfg = FuConfig(
7481a0f06eeSYinan Xu    "sta",
7492225d46eSJiawei Lin    null,
7502b4e8253SYinan Xu    (uop: MicroOp) => FuType.storeCanAccept(uop.ctrl.fuType),
7516ab6918fSYinan Xu    FuType.stu, 1, 0, writeIntRf = false, writeFpRf = false,
7526ab6918fSYinan Xu    latency = UncertainLatency(),
7536ab6918fSYinan Xu    exceptionOut = Seq(storeAddrMisaligned, storeAccessFault, storePageFault)
7542225d46eSJiawei Lin  )
7552225d46eSJiawei Lin
75685b4cd54SYinan Xu  val stdCfg = FuConfig(
7571a0f06eeSYinan Xu    "std",
7582b4e8253SYinan Xu    fuGen = stdGen, fuSel = (uop: MicroOp) => FuType.storeCanAccept(uop.ctrl.fuType), FuType.stu, 1, 1,
7596ab6918fSYinan Xu    writeIntRf = false, writeFpRf = false, latency = CertainLatency(1)
76085b4cd54SYinan Xu  )
76185b4cd54SYinan Xu
7622225d46eSJiawei Lin  val mouCfg = FuConfig(
7631a0f06eeSYinan Xu    "mou",
7642225d46eSJiawei Lin    null,
7652b4e8253SYinan Xu    (uop: MicroOp) => FuType.storeCanAccept(uop.ctrl.fuType),
7666ab6918fSYinan Xu    FuType.mou, 1, 0, writeIntRf = false, writeFpRf = false,
7676ab6918fSYinan Xu    latency = UncertainLatency(), exceptionOut = lduCfg.exceptionOut ++ staCfg.exceptionOut
7682b4e8253SYinan Xu  )
7692b4e8253SYinan Xu
7702b4e8253SYinan Xu  val mouDataCfg = FuConfig(
7712b4e8253SYinan Xu    "mou",
7722b4e8253SYinan Xu    mouDataGen,
7732b4e8253SYinan Xu    (uop: MicroOp) => FuType.storeCanAccept(uop.ctrl.fuType),
7746ab6918fSYinan Xu    FuType.mou, 1, 0, writeIntRf = false, writeFpRf = false,
7756ab6918fSYinan Xu    latency = UncertainLatency()
7762225d46eSJiawei Lin  )
7772225d46eSJiawei Lin
778adb5df20SYinan Xu  val JumpExeUnitCfg = ExuConfig("JmpExeUnit", "Int", Seq(jmpCfg, i2fCfg), 2, Int.MaxValue)
779b6220f0dSLemover  val AluExeUnitCfg = ExuConfig("AluExeUnit", "Int", Seq(aluCfg), 0, Int.MaxValue)
780adb5df20SYinan Xu  val JumpCSRExeUnitCfg = ExuConfig("JmpCSRExeUnit", "Int", Seq(jmpCfg, csrCfg, fenceCfg, i2fCfg), 2, Int.MaxValue)
7813feeca58Szfw  val MulDivExeUnitCfg = ExuConfig("MulDivExeUnit", "Int", Seq(mulCfg, divCfg, bkuCfg), 1, Int.MaxValue)
782b6220f0dSLemover  val FmacExeUnitCfg = ExuConfig("FmacExeUnit", "Fp", Seq(fmacCfg), Int.MaxValue, 0)
7832225d46eSJiawei Lin  val FmiscExeUnitCfg = ExuConfig(
7842225d46eSJiawei Lin    "FmiscExeUnit",
785b6220f0dSLemover    "Fp",
7862225d46eSJiawei Lin    Seq(f2iCfg, f2fCfg, fdivSqrtCfg),
7872225d46eSJiawei Lin    Int.MaxValue, 1
7882225d46eSJiawei Lin  )
7892b4e8253SYinan Xu  val LdExeUnitCfg = ExuConfig("LoadExu", "Mem", Seq(lduCfg), wbIntPriority = 0, wbFpPriority = 0, extendsExu = false)
7902b4e8253SYinan Xu  val StaExeUnitCfg = ExuConfig("StaExu", "Mem", Seq(staCfg, mouCfg), wbIntPriority = Int.MaxValue, wbFpPriority = Int.MaxValue, extendsExu = false)
7912b4e8253SYinan Xu  val StdExeUnitCfg = ExuConfig("StdExu", "Mem", Seq(stdCfg, mouDataCfg), wbIntPriority = Int.MaxValue, wbFpPriority = Int.MaxValue, extendsExu = false)
79254034ccdSZhangZifei
793d16f4ea4SZhangZifei  // def jumpRSWrapperGen(p: Parameters) = new JumpRSWrapper()(p)
794d16f4ea4SZhangZifei  // def mulRSWrapperGen(p: Parameters) = new MulRSWrapper()(p)
795d16f4ea4SZhangZifei  // def loadRSWrapperGen(p: Parameters) = new LoadRSWrapper()(p)
796d16f4ea4SZhangZifei  // def stdRSWrapperGen(p: Parameters) = new StdRSWrapper()(p)
797d16f4ea4SZhangZifei  // def staRSWrapperGen(p: Parameters) = new StaRSWrapper()(p)
798d16f4ea4SZhangZifei  // def fmaRSWrapperGen(p: Parameters) = new FMARSWrapper()(p)
799d16f4ea4SZhangZifei  // def fmiscRSWrapperGen(p: Parameters) = new FMiscRSWrapper()(p)
80054034ccdSZhangZifei
801d16f4ea4SZhangZifei  val aluRSMod = new RSMod(
802d16f4ea4SZhangZifei    rsWrapperGen = (modGen: RSMod, p: Parameters) => new ALURSWrapper(modGen)(p),
803d16f4ea4SZhangZifei    rsGen = (a: RSParams, b: Parameters) => new ALURS(a)(b),
804d16f4ea4SZhangZifei    immExtractorGen = (src: Int, width: Int, p: Parameters) => new AluImmExtractor()(p)
805d16f4ea4SZhangZifei  )
806d16f4ea4SZhangZifei  val fmaRSMod = new RSMod(
807d16f4ea4SZhangZifei    rsWrapperGen = (modGen: RSMod, p: Parameters) => new FMARSWrapper(modGen)(p),
808d16f4ea4SZhangZifei    rsGen = (a: RSParams, b: Parameters) => new FMARS(a)(b),
809d16f4ea4SZhangZifei  )
810d16f4ea4SZhangZifei  val fmiscRSMod = new RSMod(
811d16f4ea4SZhangZifei    rsWrapperGen = (modGen: RSMod, p: Parameters) => new FMiscRSWrapper(modGen)(p),
812d16f4ea4SZhangZifei    rsGen = (a: RSParams, b: Parameters) => new FMiscRS(a)(b),
813d16f4ea4SZhangZifei  )
814d16f4ea4SZhangZifei  val jumpRSMod = new RSMod(
815d16f4ea4SZhangZifei    rsWrapperGen = (modGen: RSMod, p: Parameters) => new JumpRSWrapper(modGen)(p),
816d16f4ea4SZhangZifei    rsGen = (a: RSParams, b: Parameters) => new JumpRS(a)(b),
817d16f4ea4SZhangZifei    immExtractorGen = (src: Int, width: Int, p: Parameters) => new JumpImmExtractor()(p)
818d16f4ea4SZhangZifei  )
819d16f4ea4SZhangZifei  val loadRSMod = new RSMod(
820d16f4ea4SZhangZifei    rsWrapperGen = (modGen: RSMod, p: Parameters) => new LoadRSWrapper(modGen)(p),
821d16f4ea4SZhangZifei    rsGen = (a: RSParams, b: Parameters) => new LoadRS(a)(b),
822d16f4ea4SZhangZifei    immExtractorGen = (src: Int, width: Int, p: Parameters) => new LoadImmExtractor()(p)
823d16f4ea4SZhangZifei  )
824d16f4ea4SZhangZifei  val mulRSMod = new RSMod(
825d16f4ea4SZhangZifei    rsWrapperGen = (modGen: RSMod, p: Parameters) => new MulRSWrapper(modGen)(p),
826d16f4ea4SZhangZifei    rsGen = (a: RSParams, b: Parameters) => new MulRS(a)(b),
827d16f4ea4SZhangZifei    immExtractorGen = (src: Int, width: Int, p: Parameters) => new MduImmExtractor()(p)
828d16f4ea4SZhangZifei  )
829d16f4ea4SZhangZifei  val staRSMod = new RSMod(
830d16f4ea4SZhangZifei    rsWrapperGen = (modGen: RSMod, p: Parameters) => new StaRSWrapper(modGen)(p),
831d16f4ea4SZhangZifei    rsGen = (a: RSParams, b: Parameters) => new StaRS(a)(b),
832d16f4ea4SZhangZifei  )
833d16f4ea4SZhangZifei  val stdRSMod = new RSMod(
834d16f4ea4SZhangZifei    rsWrapperGen = (modGen: RSMod, p: Parameters) => new StdRSWrapper(modGen)(p),
835d16f4ea4SZhangZifei    rsGen = (a: RSParams, b: Parameters) => new StdRS(a)(b),
836d16f4ea4SZhangZifei  )
8379a2e6b8aSLinJiawei}
838