xref: /XiangShan/src/main/scala/xiangshan/package.scala (revision d16f4ea41280c8c0fa2dbe906ea4b132b8d2d860)
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 {
309a2e6b8aSLinJiawei    def reg = "b00".U
319a2e6b8aSLinJiawei    def pc  = "b01".U
329a2e6b8aSLinJiawei    def imm = "b01".U
339a2e6b8aSLinJiawei    def fp  = "b10".U
3404b56283SZhangZifei
351a3df1feSYikeZhou    def DC  = imm // Don't Care
366e7c9679Shuxuan0307    def X   = BitPat("b??")
374d24c305SYikeZhou
3804b56283SZhangZifei    def isReg(srcType: UInt) = srcType===reg
3904b56283SZhangZifei    def isPc(srcType: UInt) = srcType===pc
4004b56283SZhangZifei    def isImm(srcType: UInt) = srcType===imm
412b4e8253SYinan Xu    def isFp(srcType: UInt) = srcType(1)
42c9ebdf90SYinan Xu    def isPcOrImm(srcType: UInt) = srcType(0)
432b4e8253SYinan Xu    def isRegOrFp(srcType: UInt) = !srcType(0)
44c9ebdf90SYinan Xu    def regIsFp(srcType: UInt) = srcType(1)
4504b56283SZhangZifei
469a2e6b8aSLinJiawei    def apply() = UInt(2.W)
479a2e6b8aSLinJiawei  }
489a2e6b8aSLinJiawei
499a2e6b8aSLinJiawei  object SrcState {
50100aa93cSYinan Xu    def busy    = "b0".U
51100aa93cSYinan Xu    def rdy     = "b1".U
52100aa93cSYinan Xu    // def specRdy = "b10".U // speculative ready, for future use
53100aa93cSYinan Xu    def apply() = UInt(1.W)
549a2e6b8aSLinJiawei  }
559a2e6b8aSLinJiawei
562225d46eSJiawei Lin  object FuType {
57cafb3558SLinJiawei    def jmp          = "b0000".U
58cafb3558SLinJiawei    def i2f          = "b0001".U
59cafb3558SLinJiawei    def csr          = "b0010".U
60975b9ea3SYinan Xu    def alu          = "b0110".U
61cafb3558SLinJiawei    def mul          = "b0100".U
62cafb3558SLinJiawei    def div          = "b0101".U
63975b9ea3SYinan Xu    def fence        = "b0011".U
643feeca58Szfw    def bku          = "b0111".U
65cafb3558SLinJiawei
66cafb3558SLinJiawei    def fmac         = "b1000".U
6792ab24ebSYinan Xu    def fmisc        = "b1011".U
68cafb3558SLinJiawei    def fDivSqrt     = "b1010".U
69cafb3558SLinJiawei
70cafb3558SLinJiawei    def ldu          = "b1100".U
71cafb3558SLinJiawei    def stu          = "b1101".U
7292ab24ebSYinan Xu    def mou          = "b1111".U // for amo, lr, sc, fence
739a2e6b8aSLinJiawei
746e7c9679Shuxuan0307    def X            = BitPat("b????")
756e7c9679Shuxuan0307
76ee8ff153Szfw    def num = 14
772225d46eSJiawei Lin
789a2e6b8aSLinJiawei    def apply() = UInt(log2Up(num).W)
799a2e6b8aSLinJiawei
80cafb3558SLinJiawei    def isIntExu(fuType: UInt) = !fuType(3)
816ac289b3SLinJiawei    def isJumpExu(fuType: UInt) = fuType === jmp
82cafb3558SLinJiawei    def isFpExu(fuType: UInt) = fuType(3, 2) === "b10".U
83cafb3558SLinJiawei    def isMemExu(fuType: UInt) = fuType(3, 2) === "b11".U
8492ab24ebSYinan Xu    def isLoadStore(fuType: UInt) = isMemExu(fuType) && !fuType(1)
8592ab24ebSYinan Xu    def isStoreExu(fuType: UInt) = isMemExu(fuType) && fuType(0)
860f9d3717SYinan Xu    def isAMO(fuType: UInt) = fuType(1)
87af2f7849Shappy-lx    def isFence(fuType: UInt) = fuType === fence
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 {
153baf8def6SYinan Xu    def apply() = Vec(16, Bool())
154baf8def6SYinan Xu  }
155a8e04b1dSYinan Xu
156c60c1ab4SWilliam Wang  object PMAMode {
1578d9a04fcSWilliam Wang    def R = "b1".U << 0 //readable
1588d9a04fcSWilliam Wang    def W = "b1".U << 1 //writeable
1598d9a04fcSWilliam Wang    def X = "b1".U << 2 //executable
1608d9a04fcSWilliam Wang    def I = "b1".U << 3 //cacheable: icache
1618d9a04fcSWilliam Wang    def D = "b1".U << 4 //cacheable: dcache
1628d9a04fcSWilliam Wang    def S = "b1".U << 5 //enable speculative access
163cff68e26SWilliam Wang    def A = "b1".U << 6 //enable atomic operation, A imply R & W
1648d9a04fcSWilliam Wang    def C = "b1".U << 7 //if it is cacheable is configable
165c60c1ab4SWilliam Wang    def Reserved = "b0".U
166c60c1ab4SWilliam Wang
167c60c1ab4SWilliam Wang    def apply() = UInt(7.W)
168c60c1ab4SWilliam Wang
169c60c1ab4SWilliam Wang    def read(mode: UInt) = mode(0)
170c60c1ab4SWilliam Wang    def write(mode: UInt) = mode(1)
171c60c1ab4SWilliam Wang    def execute(mode: UInt) = mode(2)
172c60c1ab4SWilliam Wang    def icache(mode: UInt) = mode(3)
173c60c1ab4SWilliam Wang    def dcache(mode: UInt) = mode(4)
174c60c1ab4SWilliam Wang    def speculate(mode: UInt) = mode(5)
175c60c1ab4SWilliam Wang    def atomic(mode: UInt) = mode(6)
176c60c1ab4SWilliam Wang    def configable_cache(mode: UInt) = mode(7)
177c60c1ab4SWilliam Wang
178c60c1ab4SWilliam Wang    def strToMode(s: String) = {
179423b9255SWilliam Wang      var result = 0.U(8.W)
180c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("R") >= 0) result = result + R
181c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("W") >= 0) result = result + W
182c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("X") >= 0) result = result + X
183c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("I") >= 0) result = result + I
184c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("D") >= 0) result = result + D
185c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("S") >= 0) result = result + S
186c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("A") >= 0) result = result + A
187c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("C") >= 0) result = result + C
188c60c1ab4SWilliam Wang      result
189c60c1ab4SWilliam Wang    }
190c60c1ab4SWilliam Wang  }
1912225d46eSJiawei Lin
1922225d46eSJiawei Lin
1932225d46eSJiawei Lin  object CSROpType {
1942225d46eSJiawei Lin    def jmp  = "b000".U
1952225d46eSJiawei Lin    def wrt  = "b001".U
1962225d46eSJiawei Lin    def set  = "b010".U
1972225d46eSJiawei Lin    def clr  = "b011".U
198b6900d94SYinan Xu    def wfi  = "b100".U
1992225d46eSJiawei Lin    def wrti = "b101".U
2002225d46eSJiawei Lin    def seti = "b110".U
2012225d46eSJiawei Lin    def clri = "b111".U
2025d669833SYinan Xu    def needAccess(op: UInt): Bool = op(1, 0) =/= 0.U
2032225d46eSJiawei Lin  }
2042225d46eSJiawei Lin
2052225d46eSJiawei Lin  // jump
2062225d46eSJiawei Lin  object JumpOpType {
2072225d46eSJiawei Lin    def jal  = "b00".U
2082225d46eSJiawei Lin    def jalr = "b01".U
2092225d46eSJiawei Lin    def auipc = "b10".U
2102225d46eSJiawei Lin//    def call = "b11_011".U
2112225d46eSJiawei Lin//    def ret  = "b11_100".U
2122225d46eSJiawei Lin    def jumpOpisJalr(op: UInt) = op(0)
2132225d46eSJiawei Lin    def jumpOpisAuipc(op: UInt) = op(1)
2142225d46eSJiawei Lin  }
2152225d46eSJiawei Lin
2162225d46eSJiawei Lin  object FenceOpType {
2172225d46eSJiawei Lin    def fence  = "b10000".U
2182225d46eSJiawei Lin    def sfence = "b10001".U
2192225d46eSJiawei Lin    def fencei = "b10010".U
220af2f7849Shappy-lx    def nofence= "b00000".U
2212225d46eSJiawei Lin  }
2222225d46eSJiawei Lin
2232225d46eSJiawei Lin  object ALUOpType {
224ee8ff153Szfw    // shift optype
225675acc68SYinan Xu    def slliuw     = "b000_0000".U // slliuw: ZEXT(src1[31:0]) << shamt
226675acc68SYinan Xu    def sll        = "b000_0001".U // sll:     src1 << src2
227ee8ff153Szfw
228675acc68SYinan Xu    def bclr       = "b000_0010".U // bclr:    src1 & ~(1 << src2[5:0])
229675acc68SYinan Xu    def bset       = "b000_0011".U // bset:    src1 | (1 << src2[5:0])
230675acc68SYinan Xu    def binv       = "b000_0100".U // binv:    src1 ^ ~(1 << src2[5:0])
231ee8ff153Szfw
232675acc68SYinan Xu    def srl        = "b000_0101".U // srl:     src1 >> src2
233675acc68SYinan Xu    def bext       = "b000_0110".U // bext:    (src1 >> src2)[0]
234675acc68SYinan Xu    def sra        = "b000_0111".U // sra:     src1 >> src2 (arithmetic)
235ee8ff153Szfw
2367b441e5eSYinan Xu    def rol        = "b000_1001".U // rol:     (src1 << src2) | (src1 >> (xlen - src2))
2377b441e5eSYinan Xu    def ror        = "b000_1011".U // ror:     (src1 >> src2) | (src1 << (xlen - src2))
238184a1958Szfw
239ee8ff153Szfw    // RV64 32bit optype
240675acc68SYinan Xu    def addw       = "b001_0000".U // addw:      SEXT((src1 + src2)[31:0])
241675acc68SYinan Xu    def oddaddw    = "b001_0001".U // oddaddw:   SEXT((src1[0] + src2)[31:0])
242675acc68SYinan Xu    def subw       = "b001_0010".U // subw:      SEXT((src1 - src2)[31:0])
243ee8ff153Szfw
244675acc68SYinan Xu    def addwbit    = "b001_0100".U // addwbit:   (src1 + src2)[0]
245675acc68SYinan Xu    def addwbyte   = "b001_0101".U // addwbyte:  (src1 + src2)[7:0]
246675acc68SYinan Xu    def addwzexth  = "b001_0110".U // addwzexth: ZEXT((src1  + src2)[15:0])
247675acc68SYinan Xu    def addwsexth  = "b001_0111".U // addwsexth: SEXT((src1  + src2)[15:0])
248ee8ff153Szfw
249675acc68SYinan Xu    def sllw       = "b001_1000".U // sllw:     SEXT((src1 << src2)[31:0])
250675acc68SYinan Xu    def srlw       = "b001_1001".U // srlw:     SEXT((src1[31:0] >> src2)[31:0])
251675acc68SYinan Xu    def sraw       = "b001_1010".U // sraw:     SEXT((src1[31:0] >> src2)[31:0])
252675acc68SYinan Xu    def rolw       = "b001_1100".U
253675acc68SYinan Xu    def rorw       = "b001_1101".U
254675acc68SYinan Xu
255675acc68SYinan Xu    // ADD-op
256675acc68SYinan Xu    def adduw      = "b010_0000".U // adduw:  src1[31:0]  + src2
257675acc68SYinan Xu    def add        = "b010_0001".U // add:     src1        + src2
258675acc68SYinan Xu    def oddadd     = "b010_0010".U // oddadd:  src1[0]     + src2
259675acc68SYinan Xu
260675acc68SYinan Xu    def sr29add    = "b010_0100".U // sr29add: src1[63:29] + src2
261675acc68SYinan Xu    def sr30add    = "b010_0101".U // sr30add: src1[63:30] + src2
262675acc68SYinan Xu    def sr31add    = "b010_0110".U // sr31add: src1[63:31] + src2
263675acc68SYinan Xu    def sr32add    = "b010_0111".U // sr32add: src1[63:32] + src2
264675acc68SYinan Xu
265675acc68SYinan Xu    def sh1adduw   = "b010_1000".U // sh1adduw: {src1[31:0], 1'b0} + src2
266675acc68SYinan Xu    def sh1add     = "b010_1001".U // sh1add: {src1[62:0], 1'b0} + src2
267675acc68SYinan Xu    def sh2adduw   = "b010_1010".U // sh2add_uw: {src1[31:0], 2'b0} + src2
268675acc68SYinan Xu    def sh2add     = "b010_1011".U // sh2add: {src1[61:0], 2'b0} + src2
269675acc68SYinan Xu    def sh3adduw   = "b010_1100".U // sh3add_uw: {src1[31:0], 3'b0} + src2
270675acc68SYinan Xu    def sh3add     = "b010_1101".U // sh3add: {src1[60:0], 3'b0} + src2
271675acc68SYinan Xu    def sh4add     = "b010_1111".U // sh4add: {src1[59:0], 4'b0} + src2
272675acc68SYinan Xu
273675acc68SYinan Xu    // SUB-op: src1 - src2
274675acc68SYinan Xu    def sub        = "b011_0000".U
275675acc68SYinan Xu    def sltu       = "b011_0001".U
276675acc68SYinan Xu    def slt        = "b011_0010".U
277675acc68SYinan Xu    def maxu       = "b011_0100".U
278675acc68SYinan Xu    def minu       = "b011_0101".U
279675acc68SYinan Xu    def max        = "b011_0110".U
280675acc68SYinan Xu    def min        = "b011_0111".U
281675acc68SYinan Xu
282675acc68SYinan Xu    // branch
283675acc68SYinan Xu    def beq        = "b111_0000".U
284675acc68SYinan Xu    def bne        = "b111_0010".U
285675acc68SYinan Xu    def blt        = "b111_1000".U
286675acc68SYinan Xu    def bge        = "b111_1010".U
287675acc68SYinan Xu    def bltu       = "b111_1100".U
288675acc68SYinan Xu    def bgeu       = "b111_1110".U
289675acc68SYinan Xu
290675acc68SYinan Xu    // misc optype
291675acc68SYinan Xu    def and        = "b100_0000".U
292675acc68SYinan Xu    def andn       = "b100_0001".U
293675acc68SYinan Xu    def or         = "b100_0010".U
294675acc68SYinan Xu    def orn        = "b100_0011".U
295675acc68SYinan Xu    def xor        = "b100_0100".U
296675acc68SYinan Xu    def xnor       = "b100_0101".U
297675acc68SYinan Xu    def orcb       = "b100_0110".U
298675acc68SYinan Xu
299675acc68SYinan Xu    def sextb      = "b100_1000".U
300675acc68SYinan Xu    def packh      = "b100_1001".U
301675acc68SYinan Xu    def sexth      = "b100_1010".U
302675acc68SYinan Xu    def packw      = "b100_1011".U
303675acc68SYinan Xu
304675acc68SYinan Xu    def revb       = "b101_0000".U
305675acc68SYinan Xu    def rev8       = "b101_0001".U
306675acc68SYinan Xu    def pack       = "b101_0010".U
307675acc68SYinan Xu    def orh48      = "b101_0011".U
308675acc68SYinan Xu
309675acc68SYinan Xu    def szewl1     = "b101_1000".U
310675acc68SYinan Xu    def szewl2     = "b101_1001".U
311675acc68SYinan Xu    def szewl3     = "b101_1010".U
312675acc68SYinan Xu    def byte2      = "b101_1011".U
313675acc68SYinan Xu
314675acc68SYinan Xu    def andlsb     = "b110_0000".U
315675acc68SYinan Xu    def andzexth   = "b110_0001".U
316675acc68SYinan Xu    def orlsb      = "b110_0010".U
317675acc68SYinan Xu    def orzexth    = "b110_0011".U
318675acc68SYinan Xu    def xorlsb     = "b110_0100".U
319675acc68SYinan Xu    def xorzexth   = "b110_0101".U
320675acc68SYinan Xu    def orcblsb    = "b110_0110".U
321675acc68SYinan Xu    def orcbzexth  = "b110_0111".U
322675acc68SYinan Xu
323675acc68SYinan Xu    def isAddw(func: UInt) = func(6, 4) === "b001".U && !func(3) && !func(1)
324675acc68SYinan Xu    def isSimpleLogic(func: UInt) = func(6, 4) === "b100".U && !func(0)
325675acc68SYinan Xu    def logicToLsb(func: UInt) = Cat("b110".U(3.W), func(3, 1), 0.U(1.W))
326675acc68SYinan Xu    def logicToZexth(func: UInt) = Cat("b110".U(3.W), func(3, 1), 1.U(1.W))
327675acc68SYinan Xu    def isBranch(func: UInt) = func(6, 4) === "b111".U
328675acc68SYinan Xu    def getBranchType(func: UInt) = func(3, 2)
329675acc68SYinan Xu    def isBranchInvert(func: UInt) = func(1)
330675acc68SYinan Xu
331675acc68SYinan Xu    def apply() = UInt(7.W)
3322225d46eSJiawei Lin  }
3332225d46eSJiawei Lin
3342225d46eSJiawei Lin  object MDUOpType {
3352225d46eSJiawei Lin    // mul
3362225d46eSJiawei Lin    // bit encoding: | type (2bit) | isWord(1bit) | opcode(2bit) |
3372225d46eSJiawei Lin    def mul    = "b00000".U
3382225d46eSJiawei Lin    def mulh   = "b00001".U
3392225d46eSJiawei Lin    def mulhsu = "b00010".U
3402225d46eSJiawei Lin    def mulhu  = "b00011".U
3412225d46eSJiawei Lin    def mulw   = "b00100".U
3422225d46eSJiawei Lin
34388825c5cSYinan Xu    def mulw7  = "b01100".U
34488825c5cSYinan Xu
3452225d46eSJiawei Lin    // div
3462225d46eSJiawei Lin    // bit encoding: | type (2bit) | isWord(1bit) | isSign(1bit) | opcode(1bit) |
34788825c5cSYinan Xu    def div    = "b10000".U
34888825c5cSYinan Xu    def divu   = "b10010".U
34988825c5cSYinan Xu    def rem    = "b10001".U
35088825c5cSYinan Xu    def remu   = "b10011".U
3512225d46eSJiawei Lin
35288825c5cSYinan Xu    def divw   = "b10100".U
35388825c5cSYinan Xu    def divuw  = "b10110".U
35488825c5cSYinan Xu    def remw   = "b10101".U
35588825c5cSYinan Xu    def remuw  = "b10111".U
3562225d46eSJiawei Lin
35788825c5cSYinan Xu    def isMul(op: UInt) = !op(4)
35888825c5cSYinan Xu    def isDiv(op: UInt) = op(4)
3592225d46eSJiawei Lin
3602225d46eSJiawei Lin    def isDivSign(op: UInt) = isDiv(op) && !op(1)
3612225d46eSJiawei Lin    def isW(op: UInt) = op(2)
3622225d46eSJiawei Lin    def isH(op: UInt) = (isDiv(op) && op(0)) || (isMul(op) && op(1, 0) =/= 0.U)
3632225d46eSJiawei Lin    def getMulOp(op: UInt) = op(1, 0)
3642225d46eSJiawei Lin  }
3652225d46eSJiawei Lin
3662225d46eSJiawei Lin  object LSUOpType {
367d200f594SWilliam Wang    // load pipeline
3682225d46eSJiawei Lin
369d200f594SWilliam Wang    // normal load
370d200f594SWilliam Wang    // Note: bit(1, 0) are size, DO NOT CHANGE
371d200f594SWilliam Wang    // bit encoding: | load 0 | is unsigned(1bit) | size(2bit) |
372d200f594SWilliam Wang    def lb       = "b0000".U
373d200f594SWilliam Wang    def lh       = "b0001".U
374d200f594SWilliam Wang    def lw       = "b0010".U
375d200f594SWilliam Wang    def ld       = "b0011".U
376d200f594SWilliam Wang    def lbu      = "b0100".U
377d200f594SWilliam Wang    def lhu      = "b0101".U
378d200f594SWilliam Wang    def lwu      = "b0110".U
379ca18a0b4SWilliam Wang
380d200f594SWilliam Wang    // Zicbop software prefetch
381d200f594SWilliam Wang    // bit encoding: | prefetch 1 | 0 | prefetch type (2bit) |
382d200f594SWilliam Wang    def prefetch_i = "b1000".U // TODO
383d200f594SWilliam Wang    def prefetch_r = "b1001".U
384d200f594SWilliam Wang    def prefetch_w = "b1010".U
385ca18a0b4SWilliam Wang
386d200f594SWilliam Wang    def isPrefetch(op: UInt): Bool = op(3)
387d200f594SWilliam Wang
388d200f594SWilliam Wang    // store pipeline
389d200f594SWilliam Wang    // normal store
390d200f594SWilliam Wang    // bit encoding: | store 00 | size(2bit) |
391d200f594SWilliam Wang    def sb       = "b0000".U
392d200f594SWilliam Wang    def sh       = "b0001".U
393d200f594SWilliam Wang    def sw       = "b0010".U
394d200f594SWilliam Wang    def sd       = "b0011".U
395d200f594SWilliam Wang
396d200f594SWilliam Wang    // l1 cache op
397d200f594SWilliam Wang    // bit encoding: | cbo_zero 01 | size(2bit) 11 |
398d200f594SWilliam Wang    def cbo_zero  = "b0111".U
399d200f594SWilliam Wang
400d200f594SWilliam Wang    // llc op
401d200f594SWilliam Wang    // bit encoding: | prefetch 11 | suboptype(2bit) |
402d200f594SWilliam Wang    def cbo_clean = "b1100".U
403d200f594SWilliam Wang    def cbo_flush = "b1101".U
404d200f594SWilliam Wang    def cbo_inval = "b1110".U
405d200f594SWilliam Wang
406d200f594SWilliam Wang    def isCbo(op: UInt): Bool = op(3, 2) === "b11".U
4072225d46eSJiawei Lin
4082225d46eSJiawei Lin    // atomics
4092225d46eSJiawei Lin    // bit(1, 0) are size
4102225d46eSJiawei Lin    // since atomics use a different fu type
4112225d46eSJiawei Lin    // so we can safely reuse other load/store's encodings
412d200f594SWilliam Wang    // bit encoding: | optype(4bit) | size (2bit) |
4132225d46eSJiawei Lin    def lr_w      = "b000010".U
4142225d46eSJiawei Lin    def sc_w      = "b000110".U
4152225d46eSJiawei Lin    def amoswap_w = "b001010".U
4162225d46eSJiawei Lin    def amoadd_w  = "b001110".U
4172225d46eSJiawei Lin    def amoxor_w  = "b010010".U
4182225d46eSJiawei Lin    def amoand_w  = "b010110".U
4192225d46eSJiawei Lin    def amoor_w   = "b011010".U
4202225d46eSJiawei Lin    def amomin_w  = "b011110".U
4212225d46eSJiawei Lin    def amomax_w  = "b100010".U
4222225d46eSJiawei Lin    def amominu_w = "b100110".U
4232225d46eSJiawei Lin    def amomaxu_w = "b101010".U
4242225d46eSJiawei Lin
4252225d46eSJiawei Lin    def lr_d      = "b000011".U
4262225d46eSJiawei Lin    def sc_d      = "b000111".U
4272225d46eSJiawei Lin    def amoswap_d = "b001011".U
4282225d46eSJiawei Lin    def amoadd_d  = "b001111".U
4292225d46eSJiawei Lin    def amoxor_d  = "b010011".U
4302225d46eSJiawei Lin    def amoand_d  = "b010111".U
4312225d46eSJiawei Lin    def amoor_d   = "b011011".U
4322225d46eSJiawei Lin    def amomin_d  = "b011111".U
4332225d46eSJiawei Lin    def amomax_d  = "b100011".U
4342225d46eSJiawei Lin    def amominu_d = "b100111".U
4352225d46eSJiawei Lin    def amomaxu_d = "b101011".U
436b6982e83SLemover
437b6982e83SLemover    def size(op: UInt) = op(1,0)
4382225d46eSJiawei Lin  }
4392225d46eSJiawei Lin
4403feeca58Szfw  object BKUOpType {
441ee8ff153Szfw
4423feeca58Szfw    def clmul       = "b000000".U
4433feeca58Szfw    def clmulh      = "b000001".U
4443feeca58Szfw    def clmulr      = "b000010".U
4453feeca58Szfw    def xpermn      = "b000100".U
4463feeca58Szfw    def xpermb      = "b000101".U
447ee8ff153Szfw
4483feeca58Szfw    def clz         = "b001000".U
4493feeca58Szfw    def clzw        = "b001001".U
4503feeca58Szfw    def ctz         = "b001010".U
4513feeca58Szfw    def ctzw        = "b001011".U
4523feeca58Szfw    def cpop        = "b001100".U
4533feeca58Szfw    def cpopw       = "b001101".U
45407596dc6Szfw
4553feeca58Szfw    // 01xxxx is reserve
4563feeca58Szfw    def aes64es     = "b100000".U
4573feeca58Szfw    def aes64esm    = "b100001".U
4583feeca58Szfw    def aes64ds     = "b100010".U
4593feeca58Szfw    def aes64dsm    = "b100011".U
4603feeca58Szfw    def aes64im     = "b100100".U
4613feeca58Szfw    def aes64ks1i   = "b100101".U
4623feeca58Szfw    def aes64ks2    = "b100110".U
4633feeca58Szfw
4643feeca58Szfw    // merge to two instruction sm4ks & sm4ed
46519bcce38SFawang Zhang    def sm4ed0      = "b101000".U
46619bcce38SFawang Zhang    def sm4ed1      = "b101001".U
46719bcce38SFawang Zhang    def sm4ed2      = "b101010".U
46819bcce38SFawang Zhang    def sm4ed3      = "b101011".U
46919bcce38SFawang Zhang    def sm4ks0      = "b101100".U
47019bcce38SFawang Zhang    def sm4ks1      = "b101101".U
47119bcce38SFawang Zhang    def sm4ks2      = "b101110".U
47219bcce38SFawang Zhang    def sm4ks3      = "b101111".U
4733feeca58Szfw
4743feeca58Szfw    def sha256sum0  = "b110000".U
4753feeca58Szfw    def sha256sum1  = "b110001".U
4763feeca58Szfw    def sha256sig0  = "b110010".U
4773feeca58Szfw    def sha256sig1  = "b110011".U
4783feeca58Szfw    def sha512sum0  = "b110100".U
4793feeca58Szfw    def sha512sum1  = "b110101".U
4803feeca58Szfw    def sha512sig0  = "b110110".U
4813feeca58Szfw    def sha512sig1  = "b110111".U
4823feeca58Szfw
4833feeca58Szfw    def sm3p0       = "b111000".U
4843feeca58Szfw    def sm3p1       = "b111001".U
485ee8ff153Szfw  }
486ee8ff153Szfw
4872225d46eSJiawei Lin  object BTBtype {
4882225d46eSJiawei Lin    def B = "b00".U  // branch
4892225d46eSJiawei Lin    def J = "b01".U  // jump
4902225d46eSJiawei Lin    def I = "b10".U  // indirect
4912225d46eSJiawei Lin    def R = "b11".U  // return
4922225d46eSJiawei Lin
4932225d46eSJiawei Lin    def apply() = UInt(2.W)
4942225d46eSJiawei Lin  }
4952225d46eSJiawei Lin
4962225d46eSJiawei Lin  object SelImm {
497ee8ff153Szfw    def IMM_X  = "b0111".U
498ee8ff153Szfw    def IMM_S  = "b0000".U
499ee8ff153Szfw    def IMM_SB = "b0001".U
500ee8ff153Szfw    def IMM_U  = "b0010".U
501ee8ff153Szfw    def IMM_UJ = "b0011".U
502ee8ff153Szfw    def IMM_I  = "b0100".U
503ee8ff153Szfw    def IMM_Z  = "b0101".U
504ee8ff153Szfw    def INVALID_INSTR = "b0110".U
505ee8ff153Szfw    def IMM_B6 = "b1000".U
5062225d46eSJiawei Lin
5076e7c9679Shuxuan0307    def X      = BitPat("b????")
5086e7c9679Shuxuan0307
509ee8ff153Szfw    def apply() = UInt(4.W)
5102225d46eSJiawei Lin  }
5112225d46eSJiawei Lin
5126ab6918fSYinan Xu  object ExceptionNO {
5136ab6918fSYinan Xu    def instrAddrMisaligned = 0
5146ab6918fSYinan Xu    def instrAccessFault    = 1
5156ab6918fSYinan Xu    def illegalInstr        = 2
5166ab6918fSYinan Xu    def breakPoint          = 3
5176ab6918fSYinan Xu    def loadAddrMisaligned  = 4
5186ab6918fSYinan Xu    def loadAccessFault     = 5
5196ab6918fSYinan Xu    def storeAddrMisaligned = 6
5206ab6918fSYinan Xu    def storeAccessFault    = 7
5216ab6918fSYinan Xu    def ecallU              = 8
5226ab6918fSYinan Xu    def ecallS              = 9
5236ab6918fSYinan Xu    def ecallM              = 11
5246ab6918fSYinan Xu    def instrPageFault      = 12
5256ab6918fSYinan Xu    def loadPageFault       = 13
5266ab6918fSYinan Xu    // def singleStep          = 14
5276ab6918fSYinan Xu    def storePageFault      = 15
5286ab6918fSYinan Xu    def priorities = Seq(
5296ab6918fSYinan Xu      breakPoint, // TODO: different BP has different priority
5306ab6918fSYinan Xu      instrPageFault,
5316ab6918fSYinan Xu      instrAccessFault,
5326ab6918fSYinan Xu      illegalInstr,
5336ab6918fSYinan Xu      instrAddrMisaligned,
5346ab6918fSYinan Xu      ecallM, ecallS, ecallU,
535d880177dSYinan Xu      storeAddrMisaligned,
536d880177dSYinan Xu      loadAddrMisaligned,
5376ab6918fSYinan Xu      storePageFault,
5386ab6918fSYinan Xu      loadPageFault,
5396ab6918fSYinan Xu      storeAccessFault,
540d880177dSYinan Xu      loadAccessFault
5416ab6918fSYinan Xu    )
5426ab6918fSYinan Xu    def all = priorities.distinct.sorted
5436ab6918fSYinan Xu    def frontendSet = Seq(
5446ab6918fSYinan Xu      instrAddrMisaligned,
5456ab6918fSYinan Xu      instrAccessFault,
5466ab6918fSYinan Xu      illegalInstr,
5476ab6918fSYinan Xu      instrPageFault
5486ab6918fSYinan Xu    )
5496ab6918fSYinan Xu    def partialSelect(vec: Vec[Bool], select: Seq[Int]): Vec[Bool] = {
5506ab6918fSYinan Xu      val new_vec = Wire(ExceptionVec())
5516ab6918fSYinan Xu      new_vec.foreach(_ := false.B)
5526ab6918fSYinan Xu      select.foreach(i => new_vec(i) := vec(i))
5536ab6918fSYinan Xu      new_vec
5546ab6918fSYinan Xu    }
5556ab6918fSYinan Xu    def selectFrontend(vec: Vec[Bool]): Vec[Bool] = partialSelect(vec, frontendSet)
5566ab6918fSYinan Xu    def selectAll(vec: Vec[Bool]): Vec[Bool] = partialSelect(vec, ExceptionNO.all)
5576ab6918fSYinan Xu    def selectByFu(vec:Vec[Bool], fuConfig: FuConfig): Vec[Bool] =
5586ab6918fSYinan Xu      partialSelect(vec, fuConfig.exceptionOut)
5596ab6918fSYinan Xu    def selectByExu(vec:Vec[Bool], exuConfig: ExuConfig): Vec[Bool] =
5606ab6918fSYinan Xu      partialSelect(vec, exuConfig.exceptionOut)
5616ab6918fSYinan Xu    def selectByExu(vec:Vec[Bool], exuConfigs: Seq[ExuConfig]): Vec[Bool] =
5626ab6918fSYinan Xu      partialSelect(vec, exuConfigs.map(_.exceptionOut).reduce(_ ++ _).distinct.sorted)
5636ab6918fSYinan Xu  }
5646ab6918fSYinan Xu
5651c62c387SYinan Xu  def dividerGen(p: Parameters) = new DividerWrapper(p(XLen))(p)
566c3d7991bSJiawei Lin  def multiplierGen(p: Parameters) = new ArrayMultiplier(p(XLen) + 1)(p)
5672225d46eSJiawei Lin  def aluGen(p: Parameters) = new Alu()(p)
5683feeca58Szfw  def bkuGen(p: Parameters) = new Bku()(p)
5692225d46eSJiawei Lin  def jmpGen(p: Parameters) = new Jump()(p)
5702225d46eSJiawei Lin  def fenceGen(p: Parameters) = new Fence()(p)
5712225d46eSJiawei Lin  def csrGen(p: Parameters) = new CSR()(p)
5722225d46eSJiawei Lin  def i2fGen(p: Parameters) = new IntToFP()(p)
5732225d46eSJiawei Lin  def fmacGen(p: Parameters) = new FMA()(p)
5742225d46eSJiawei Lin  def f2iGen(p: Parameters) = new FPToInt()(p)
5752225d46eSJiawei Lin  def f2fGen(p: Parameters) = new FPToFP()(p)
5762225d46eSJiawei Lin  def fdivSqrtGen(p: Parameters) = new FDivSqrt()(p)
57785b4cd54SYinan Xu  def stdGen(p: Parameters) = new Std()(p)
5786ab6918fSYinan Xu  def mouDataGen(p: Parameters) = new Std()(p)
5792225d46eSJiawei Lin
5806cdd85d9SYinan Xu  def f2iSel(uop: MicroOp): Bool = {
5816cdd85d9SYinan Xu    uop.ctrl.rfWen
5822225d46eSJiawei Lin  }
5832225d46eSJiawei Lin
5846cdd85d9SYinan Xu  def i2fSel(uop: MicroOp): Bool = {
5856cdd85d9SYinan Xu    uop.ctrl.fpu.fromInt
5862225d46eSJiawei Lin  }
5872225d46eSJiawei Lin
5886cdd85d9SYinan Xu  def f2fSel(uop: MicroOp): Bool = {
5896cdd85d9SYinan Xu    val ctrl = uop.ctrl.fpu
5902225d46eSJiawei Lin    ctrl.fpWen && !ctrl.div && !ctrl.sqrt
5912225d46eSJiawei Lin  }
5922225d46eSJiawei Lin
5936cdd85d9SYinan Xu  def fdivSqrtSel(uop: MicroOp): Bool = {
5946cdd85d9SYinan Xu    val ctrl = uop.ctrl.fpu
5952225d46eSJiawei Lin    ctrl.div || ctrl.sqrt
5962225d46eSJiawei Lin  }
5972225d46eSJiawei Lin
5982225d46eSJiawei Lin  val aluCfg = FuConfig(
5991a0f06eeSYinan Xu    name = "alu",
6002225d46eSJiawei Lin    fuGen = aluGen,
6016cdd85d9SYinan Xu    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.alu,
6022225d46eSJiawei Lin    fuType = FuType.alu,
6032225d46eSJiawei Lin    numIntSrc = 2,
6042225d46eSJiawei Lin    numFpSrc = 0,
6052225d46eSJiawei Lin    writeIntRf = true,
6062225d46eSJiawei Lin    writeFpRf = false,
6072225d46eSJiawei Lin    hasRedirect = true,
6082225d46eSJiawei Lin  )
6092225d46eSJiawei Lin
6102225d46eSJiawei Lin  val jmpCfg = FuConfig(
6111a0f06eeSYinan Xu    name = "jmp",
6122225d46eSJiawei Lin    fuGen = jmpGen,
6136cdd85d9SYinan Xu    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.jmp,
6142225d46eSJiawei Lin    fuType = FuType.jmp,
6152225d46eSJiawei Lin    numIntSrc = 1,
6162225d46eSJiawei Lin    numFpSrc = 0,
6172225d46eSJiawei Lin    writeIntRf = true,
6182225d46eSJiawei Lin    writeFpRf = false,
6192225d46eSJiawei Lin    hasRedirect = true,
6202225d46eSJiawei Lin  )
6212225d46eSJiawei Lin
6222225d46eSJiawei Lin  val fenceCfg = FuConfig(
6231a0f06eeSYinan Xu    name = "fence",
6242225d46eSJiawei Lin    fuGen = fenceGen,
6256cdd85d9SYinan Xu    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.fence,
6266ab6918fSYinan Xu    FuType.fence, 2, 0, writeIntRf = false, writeFpRf = false,
627f1fe8698SLemover    latency = UncertainLatency(), exceptionOut = Seq(illegalInstr), // TODO: need rewrite latency structure, not just this value,
628f1fe8698SLemover    flushPipe = true
6292225d46eSJiawei Lin  )
6302225d46eSJiawei Lin
6312225d46eSJiawei Lin  val csrCfg = FuConfig(
6321a0f06eeSYinan Xu    name = "csr",
6332225d46eSJiawei Lin    fuGen = csrGen,
6346cdd85d9SYinan Xu    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.csr,
6352225d46eSJiawei Lin    fuType = FuType.csr,
6362225d46eSJiawei Lin    numIntSrc = 1,
6372225d46eSJiawei Lin    numFpSrc = 0,
6382225d46eSJiawei Lin    writeIntRf = true,
6392225d46eSJiawei Lin    writeFpRf = false,
6406ab6918fSYinan Xu    exceptionOut = Seq(illegalInstr, breakPoint, ecallU, ecallS, ecallM),
6416ab6918fSYinan Xu    flushPipe = true
6422225d46eSJiawei Lin  )
6432225d46eSJiawei Lin
6442225d46eSJiawei Lin  val i2fCfg = FuConfig(
6451a0f06eeSYinan Xu    name = "i2f",
6462225d46eSJiawei Lin    fuGen = i2fGen,
6472225d46eSJiawei Lin    fuSel = i2fSel,
6482225d46eSJiawei Lin    FuType.i2f,
6492225d46eSJiawei Lin    numIntSrc = 1,
6502225d46eSJiawei Lin    numFpSrc = 0,
6512225d46eSJiawei Lin    writeIntRf = false,
6522225d46eSJiawei Lin    writeFpRf = true,
6536ab6918fSYinan Xu    writeFflags = true,
654e174d629SJiawei Lin    latency = CertainLatency(2),
655e174d629SJiawei Lin    fastUopOut = true, fastImplemented = true
6562225d46eSJiawei Lin  )
6572225d46eSJiawei Lin
6582225d46eSJiawei Lin  val divCfg = FuConfig(
6591a0f06eeSYinan Xu    name = "div",
6602225d46eSJiawei Lin    fuGen = dividerGen,
66107596dc6Szfw    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.div,
6622225d46eSJiawei Lin    FuType.div,
6632225d46eSJiawei Lin    2,
6642225d46eSJiawei Lin    0,
6652225d46eSJiawei Lin    writeIntRf = true,
6662225d46eSJiawei Lin    writeFpRf = false,
667f83b578aSYinan Xu    latency = UncertainLatency(),
668f83b578aSYinan Xu    fastUopOut = true,
6691c62c387SYinan Xu    fastImplemented = true,
6705ee7cabeSYinan Xu    hasInputBuffer = (true, 4, true)
6712225d46eSJiawei Lin  )
6722225d46eSJiawei Lin
6732225d46eSJiawei Lin  val mulCfg = FuConfig(
6741a0f06eeSYinan Xu    name = "mul",
6752225d46eSJiawei Lin    fuGen = multiplierGen,
67607596dc6Szfw    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.mul,
6772225d46eSJiawei Lin    FuType.mul,
6782225d46eSJiawei Lin    2,
6792225d46eSJiawei Lin    0,
6802225d46eSJiawei Lin    writeIntRf = true,
6812225d46eSJiawei Lin    writeFpRf = false,
682b2482bc1SYinan Xu    latency = CertainLatency(2),
683f83b578aSYinan Xu    fastUopOut = true,
684b2482bc1SYinan Xu    fastImplemented = true
6852225d46eSJiawei Lin  )
6862225d46eSJiawei Lin
6873feeca58Szfw  val bkuCfg = FuConfig(
6883feeca58Szfw    name = "bku",
6893feeca58Szfw    fuGen = bkuGen,
6903feeca58Szfw    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.bku,
6913feeca58Szfw    fuType = FuType.bku,
692ee8ff153Szfw    numIntSrc = 2,
693ee8ff153Szfw    numFpSrc = 0,
694ee8ff153Szfw    writeIntRf = true,
695ee8ff153Szfw    writeFpRf = false,
696f83b578aSYinan Xu    latency = CertainLatency(1),
697f83b578aSYinan Xu    fastUopOut = true,
69807596dc6Szfw    fastImplemented = true
699ee8ff153Szfw )
700ee8ff153Szfw
7012225d46eSJiawei Lin  val fmacCfg = FuConfig(
7021a0f06eeSYinan Xu    name = "fmac",
7032225d46eSJiawei Lin    fuGen = fmacGen,
7042225d46eSJiawei Lin    fuSel = _ => true.B,
7056ab6918fSYinan Xu    FuType.fmac, 0, 3, writeIntRf = false, writeFpRf = true, writeFflags = true,
7064b65fc7eSJiawei Lin    latency = UncertainLatency(), fastUopOut = true, fastImplemented = true
7072225d46eSJiawei Lin  )
7082225d46eSJiawei Lin
7092225d46eSJiawei Lin  val f2iCfg = FuConfig(
7101a0f06eeSYinan Xu    name = "f2i",
7112225d46eSJiawei Lin    fuGen = f2iGen,
7122225d46eSJiawei Lin    fuSel = f2iSel,
7136ab6918fSYinan Xu    FuType.fmisc, 0, 1, writeIntRf = true, writeFpRf = false, writeFflags = true, latency = CertainLatency(2),
714b2482bc1SYinan Xu    fastUopOut = true, fastImplemented = true
7152225d46eSJiawei Lin  )
7162225d46eSJiawei Lin
7172225d46eSJiawei Lin  val f2fCfg = FuConfig(
7181a0f06eeSYinan Xu    name = "f2f",
7192225d46eSJiawei Lin    fuGen = f2fGen,
7202225d46eSJiawei Lin    fuSel = f2fSel,
7216ab6918fSYinan Xu    FuType.fmisc, 0, 1, writeIntRf = false, writeFpRf = true, writeFflags = true, latency = CertainLatency(2),
722b2482bc1SYinan Xu    fastUopOut = true, fastImplemented = true
7232225d46eSJiawei Lin  )
7242225d46eSJiawei Lin
7252225d46eSJiawei Lin  val fdivSqrtCfg = FuConfig(
7261a0f06eeSYinan Xu    name = "fdivSqrt",
7272225d46eSJiawei Lin    fuGen = fdivSqrtGen,
7282225d46eSJiawei Lin    fuSel = fdivSqrtSel,
7296ab6918fSYinan Xu    FuType.fDivSqrt, 0, 2, writeIntRf = false, writeFpRf = true, writeFflags = true, latency = UncertainLatency(),
730140aff85SYinan Xu    fastUopOut = true, fastImplemented = true, hasInputBuffer = (true, 8, true)
7312225d46eSJiawei Lin  )
7322225d46eSJiawei Lin
7332225d46eSJiawei Lin  val lduCfg = FuConfig(
7341a0f06eeSYinan Xu    "ldu",
7352225d46eSJiawei Lin    null, // DontCare
7362b4e8253SYinan Xu    (uop: MicroOp) => FuType.loadCanAccept(uop.ctrl.fuType),
7376ab6918fSYinan Xu    FuType.ldu, 1, 0, writeIntRf = true, writeFpRf = true,
7386ab6918fSYinan Xu    latency = UncertainLatency(),
7396ab6918fSYinan Xu    exceptionOut = Seq(loadAddrMisaligned, loadAccessFault, loadPageFault),
7406ab6918fSYinan Xu    flushPipe = true,
7416786cfb7SWilliam Wang    replayInst = true,
7426786cfb7SWilliam Wang    hasLoadError = true
7432225d46eSJiawei Lin  )
7442225d46eSJiawei Lin
74585b4cd54SYinan Xu  val staCfg = FuConfig(
7461a0f06eeSYinan Xu    "sta",
7472225d46eSJiawei Lin    null,
7482b4e8253SYinan Xu    (uop: MicroOp) => FuType.storeCanAccept(uop.ctrl.fuType),
7496ab6918fSYinan Xu    FuType.stu, 1, 0, writeIntRf = false, writeFpRf = false,
7506ab6918fSYinan Xu    latency = UncertainLatency(),
7516ab6918fSYinan Xu    exceptionOut = Seq(storeAddrMisaligned, storeAccessFault, storePageFault)
7522225d46eSJiawei Lin  )
7532225d46eSJiawei Lin
75485b4cd54SYinan Xu  val stdCfg = FuConfig(
7551a0f06eeSYinan Xu    "std",
7562b4e8253SYinan Xu    fuGen = stdGen, fuSel = (uop: MicroOp) => FuType.storeCanAccept(uop.ctrl.fuType), FuType.stu, 1, 1,
7576ab6918fSYinan Xu    writeIntRf = false, writeFpRf = false, latency = CertainLatency(1)
75885b4cd54SYinan Xu  )
75985b4cd54SYinan Xu
7602225d46eSJiawei Lin  val mouCfg = FuConfig(
7611a0f06eeSYinan Xu    "mou",
7622225d46eSJiawei Lin    null,
7632b4e8253SYinan Xu    (uop: MicroOp) => FuType.storeCanAccept(uop.ctrl.fuType),
7646ab6918fSYinan Xu    FuType.mou, 1, 0, writeIntRf = false, writeFpRf = false,
7656ab6918fSYinan Xu    latency = UncertainLatency(), exceptionOut = lduCfg.exceptionOut ++ staCfg.exceptionOut
7662b4e8253SYinan Xu  )
7672b4e8253SYinan Xu
7682b4e8253SYinan Xu  val mouDataCfg = FuConfig(
7692b4e8253SYinan Xu    "mou",
7702b4e8253SYinan Xu    mouDataGen,
7712b4e8253SYinan Xu    (uop: MicroOp) => FuType.storeCanAccept(uop.ctrl.fuType),
7726ab6918fSYinan Xu    FuType.mou, 1, 0, writeIntRf = false, writeFpRf = false,
7736ab6918fSYinan Xu    latency = UncertainLatency()
7742225d46eSJiawei Lin  )
7752225d46eSJiawei Lin
776adb5df20SYinan Xu  val JumpExeUnitCfg = ExuConfig("JmpExeUnit", "Int", Seq(jmpCfg, i2fCfg), 2, Int.MaxValue)
777b6220f0dSLemover  val AluExeUnitCfg = ExuConfig("AluExeUnit", "Int", Seq(aluCfg), 0, Int.MaxValue)
778adb5df20SYinan Xu  val JumpCSRExeUnitCfg = ExuConfig("JmpCSRExeUnit", "Int", Seq(jmpCfg, csrCfg, fenceCfg, i2fCfg), 2, Int.MaxValue)
7793feeca58Szfw  val MulDivExeUnitCfg = ExuConfig("MulDivExeUnit", "Int", Seq(mulCfg, divCfg, bkuCfg), 1, Int.MaxValue)
780b6220f0dSLemover  val FmacExeUnitCfg = ExuConfig("FmacExeUnit", "Fp", Seq(fmacCfg), Int.MaxValue, 0)
7812225d46eSJiawei Lin  val FmiscExeUnitCfg = ExuConfig(
7822225d46eSJiawei Lin    "FmiscExeUnit",
783b6220f0dSLemover    "Fp",
7842225d46eSJiawei Lin    Seq(f2iCfg, f2fCfg, fdivSqrtCfg),
7852225d46eSJiawei Lin    Int.MaxValue, 1
7862225d46eSJiawei Lin  )
7872b4e8253SYinan Xu  val LdExeUnitCfg = ExuConfig("LoadExu", "Mem", Seq(lduCfg), wbIntPriority = 0, wbFpPriority = 0, extendsExu = false)
7882b4e8253SYinan Xu  val StaExeUnitCfg = ExuConfig("StaExu", "Mem", Seq(staCfg, mouCfg), wbIntPriority = Int.MaxValue, wbFpPriority = Int.MaxValue, extendsExu = false)
7892b4e8253SYinan Xu  val StdExeUnitCfg = ExuConfig("StdExu", "Mem", Seq(stdCfg, mouDataCfg), wbIntPriority = Int.MaxValue, wbFpPriority = Int.MaxValue, extendsExu = false)
79054034ccdSZhangZifei
791*d16f4ea4SZhangZifei  // def jumpRSWrapperGen(p: Parameters) = new JumpRSWrapper()(p)
792*d16f4ea4SZhangZifei  // def mulRSWrapperGen(p: Parameters) = new MulRSWrapper()(p)
793*d16f4ea4SZhangZifei  // def loadRSWrapperGen(p: Parameters) = new LoadRSWrapper()(p)
794*d16f4ea4SZhangZifei  // def stdRSWrapperGen(p: Parameters) = new StdRSWrapper()(p)
795*d16f4ea4SZhangZifei  // def staRSWrapperGen(p: Parameters) = new StaRSWrapper()(p)
796*d16f4ea4SZhangZifei  // def fmaRSWrapperGen(p: Parameters) = new FMARSWrapper()(p)
797*d16f4ea4SZhangZifei  // def fmiscRSWrapperGen(p: Parameters) = new FMiscRSWrapper()(p)
79854034ccdSZhangZifei
799*d16f4ea4SZhangZifei  val aluRSMod = new RSMod(
800*d16f4ea4SZhangZifei    rsWrapperGen = (modGen: RSMod, p: Parameters) => new ALURSWrapper(modGen)(p),
801*d16f4ea4SZhangZifei    rsGen = (a: RSParams, b: Parameters) => new ALURS(a)(b),
802*d16f4ea4SZhangZifei    immExtractorGen = (src: Int, width: Int, p: Parameters) => new AluImmExtractor()(p)
803*d16f4ea4SZhangZifei  )
804*d16f4ea4SZhangZifei  val fmaRSMod = new RSMod(
805*d16f4ea4SZhangZifei    rsWrapperGen = (modGen: RSMod, p: Parameters) => new FMARSWrapper(modGen)(p),
806*d16f4ea4SZhangZifei    rsGen = (a: RSParams, b: Parameters) => new FMARS(a)(b),
807*d16f4ea4SZhangZifei  )
808*d16f4ea4SZhangZifei  val fmiscRSMod = new RSMod(
809*d16f4ea4SZhangZifei    rsWrapperGen = (modGen: RSMod, p: Parameters) => new FMiscRSWrapper(modGen)(p),
810*d16f4ea4SZhangZifei    rsGen = (a: RSParams, b: Parameters) => new FMiscRS(a)(b),
811*d16f4ea4SZhangZifei  )
812*d16f4ea4SZhangZifei  val jumpRSMod = new RSMod(
813*d16f4ea4SZhangZifei    rsWrapperGen = (modGen: RSMod, p: Parameters) => new JumpRSWrapper(modGen)(p),
814*d16f4ea4SZhangZifei    rsGen = (a: RSParams, b: Parameters) => new JumpRS(a)(b),
815*d16f4ea4SZhangZifei    immExtractorGen = (src: Int, width: Int, p: Parameters) => new JumpImmExtractor()(p)
816*d16f4ea4SZhangZifei  )
817*d16f4ea4SZhangZifei  val loadRSMod = new RSMod(
818*d16f4ea4SZhangZifei    rsWrapperGen = (modGen: RSMod, p: Parameters) => new LoadRSWrapper(modGen)(p),
819*d16f4ea4SZhangZifei    rsGen = (a: RSParams, b: Parameters) => new LoadRS(a)(b),
820*d16f4ea4SZhangZifei    immExtractorGen = (src: Int, width: Int, p: Parameters) => new LoadImmExtractor()(p)
821*d16f4ea4SZhangZifei  )
822*d16f4ea4SZhangZifei  val mulRSMod = new RSMod(
823*d16f4ea4SZhangZifei    rsWrapperGen = (modGen: RSMod, p: Parameters) => new MulRSWrapper(modGen)(p),
824*d16f4ea4SZhangZifei    rsGen = (a: RSParams, b: Parameters) => new MulRS(a)(b),
825*d16f4ea4SZhangZifei    immExtractorGen = (src: Int, width: Int, p: Parameters) => new MduImmExtractor()(p)
826*d16f4ea4SZhangZifei  )
827*d16f4ea4SZhangZifei  val staRSMod = new RSMod(
828*d16f4ea4SZhangZifei    rsWrapperGen = (modGen: RSMod, p: Parameters) => new StaRSWrapper(modGen)(p),
829*d16f4ea4SZhangZifei    rsGen = (a: RSParams, b: Parameters) => new StaRS(a)(b),
830*d16f4ea4SZhangZifei  )
831*d16f4ea4SZhangZifei  val stdRSMod = new RSMod(
832*d16f4ea4SZhangZifei    rsWrapperGen = (modGen: RSMod, p: Parameters) => new StdRSWrapper(modGen)(p),
833*d16f4ea4SZhangZifei    rsGen = (a: RSParams, b: Parameters) => new StdRS(a)(b),
834*d16f4ea4SZhangZifei  )
8359a2e6b8aSLinJiawei}
836