xref: /XiangShan/src/main/scala/xiangshan/package.scala (revision 6786cfb779f39a6e24d4da56a28e63528c7d081e)
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
354d24c305SYikeZhou
3604b56283SZhangZifei    def isReg(srcType: UInt) = srcType===reg
3704b56283SZhangZifei    def isPc(srcType: UInt) = srcType===pc
3804b56283SZhangZifei    def isImm(srcType: UInt) = srcType===imm
392b4e8253SYinan Xu    def isFp(srcType: UInt) = srcType(1)
40c9ebdf90SYinan Xu    def isPcOrImm(srcType: UInt) = srcType(0)
412b4e8253SYinan Xu    def isRegOrFp(srcType: UInt) = !srcType(0)
42c9ebdf90SYinan Xu    def regIsFp(srcType: UInt) = srcType(1)
4304b56283SZhangZifei
449a2e6b8aSLinJiawei    def apply() = UInt(2.W)
459a2e6b8aSLinJiawei  }
469a2e6b8aSLinJiawei
479a2e6b8aSLinJiawei  object SrcState {
48100aa93cSYinan Xu    def busy    = "b0".U
49100aa93cSYinan Xu    def rdy     = "b1".U
50100aa93cSYinan Xu    // def specRdy = "b10".U // speculative ready, for future use
51100aa93cSYinan Xu    def apply() = UInt(1.W)
529a2e6b8aSLinJiawei  }
539a2e6b8aSLinJiawei
542225d46eSJiawei Lin  object FuType {
55cafb3558SLinJiawei    def jmp          = "b0000".U
56cafb3558SLinJiawei    def i2f          = "b0001".U
57cafb3558SLinJiawei    def csr          = "b0010".U
58975b9ea3SYinan Xu    def alu          = "b0110".U
59cafb3558SLinJiawei    def mul          = "b0100".U
60cafb3558SLinJiawei    def div          = "b0101".U
61975b9ea3SYinan Xu    def fence        = "b0011".U
623feeca58Szfw    def bku          = "b0111".U
63cafb3558SLinJiawei
64cafb3558SLinJiawei    def fmac         = "b1000".U
6592ab24ebSYinan Xu    def fmisc        = "b1011".U
66cafb3558SLinJiawei    def fDivSqrt     = "b1010".U
67cafb3558SLinJiawei
68cafb3558SLinJiawei    def ldu          = "b1100".U
69cafb3558SLinJiawei    def stu          = "b1101".U
7092ab24ebSYinan Xu    def mou          = "b1111".U // for amo, lr, sc, fence
719a2e6b8aSLinJiawei
72ee8ff153Szfw    def num = 14
732225d46eSJiawei Lin
749a2e6b8aSLinJiawei    def apply() = UInt(log2Up(num).W)
759a2e6b8aSLinJiawei
76cafb3558SLinJiawei    def isIntExu(fuType: UInt) = !fuType(3)
776ac289b3SLinJiawei    def isJumpExu(fuType: UInt) = fuType === jmp
78cafb3558SLinJiawei    def isFpExu(fuType: UInt) = fuType(3, 2) === "b10".U
79cafb3558SLinJiawei    def isMemExu(fuType: UInt) = fuType(3, 2) === "b11".U
8092ab24ebSYinan Xu    def isLoadStore(fuType: UInt) = isMemExu(fuType) && !fuType(1)
8192ab24ebSYinan Xu    def isStoreExu(fuType: UInt) = isMemExu(fuType) && fuType(0)
820f9d3717SYinan Xu    def isAMO(fuType: UInt) = fuType(1)
83af2f7849Shappy-lx    def isFence(fuType: UInt) = fuType === fence
84af2f7849Shappy-lx    def isSvinvalBegin(fuType: UInt, func: UInt, flush: Bool) = isFence(fuType) && func === FenceOpType.nofence && !flush
85af2f7849Shappy-lx    def isSvinval(fuType: UInt, func: UInt, flush: Bool) = isFence(fuType) && func === FenceOpType.sfence && !flush
86af2f7849Shappy-lx    def isSvinvalEnd(fuType: UInt, func: UInt, flush: Bool) = isFence(fuType) && func === FenceOpType.nofence && flush
87af2f7849Shappy-lx
8892ab24ebSYinan Xu
8992ab24ebSYinan Xu    def jmpCanAccept(fuType: UInt) = !fuType(2)
90ee8ff153Szfw    def mduCanAccept(fuType: UInt) = fuType(2) && !fuType(1) || fuType(2) && fuType(1) && fuType(0)
91ee8ff153Szfw    def aluCanAccept(fuType: UInt) = fuType(2) && fuType(1) && !fuType(0)
9292ab24ebSYinan Xu
9392ab24ebSYinan Xu    def fmacCanAccept(fuType: UInt) = !fuType(1)
9492ab24ebSYinan Xu    def fmiscCanAccept(fuType: UInt) = fuType(1)
9592ab24ebSYinan Xu
9692ab24ebSYinan Xu    def loadCanAccept(fuType: UInt) = !fuType(0)
9792ab24ebSYinan Xu    def storeCanAccept(fuType: UInt) = fuType(0)
9892ab24ebSYinan Xu
9992ab24ebSYinan Xu    def storeIsAMO(fuType: UInt) = fuType(1)
100cafb3558SLinJiawei
101cafb3558SLinJiawei    val functionNameMap = Map(
102cafb3558SLinJiawei      jmp.litValue() -> "jmp",
103ebb8ebf8SYinan Xu      i2f.litValue() -> "int_to_float",
104cafb3558SLinJiawei      csr.litValue() -> "csr",
105cafb3558SLinJiawei      alu.litValue() -> "alu",
106cafb3558SLinJiawei      mul.litValue() -> "mul",
107cafb3558SLinJiawei      div.litValue() -> "div",
108b8f08ca0SZhangZifei      fence.litValue() -> "fence",
1093feeca58Szfw      bku.litValue() -> "bku",
110cafb3558SLinJiawei      fmac.litValue() -> "fmac",
111cafb3558SLinJiawei      fmisc.litValue() -> "fmisc",
112d18dc7e6Swakafa      fDivSqrt.litValue() -> "fdiv_fsqrt",
113cafb3558SLinJiawei      ldu.litValue() -> "load",
114ebb8ebf8SYinan Xu      stu.litValue() -> "store",
115ebb8ebf8SYinan Xu      mou.litValue() -> "mou"
116cafb3558SLinJiawei    )
1179a2e6b8aSLinJiawei  }
1189a2e6b8aSLinJiawei
1192225d46eSJiawei Lin  object FuOpType {
120675acc68SYinan Xu    def apply() = UInt(7.W)
121361e6d51SJiuyang Liu    def X = BitPat("b???????")
122ebd97ecbSzhanglinjuan  }
123518d8658SYinan Xu
124a3edac52SYinan Xu  object CommitType {
125c3abb8b6SYinan Xu    def NORMAL = "b000".U  // int/fp
126c3abb8b6SYinan Xu    def BRANCH = "b001".U  // branch
127c3abb8b6SYinan Xu    def LOAD   = "b010".U  // load
128c3abb8b6SYinan Xu    def STORE  = "b011".U  // store
129518d8658SYinan Xu
130c3abb8b6SYinan Xu    def apply() = UInt(3.W)
131c3abb8b6SYinan Xu    def isFused(commitType: UInt): Bool = commitType(2)
132c3abb8b6SYinan Xu    def isLoadStore(commitType: UInt): Bool = !isFused(commitType) && commitType(1)
133c3abb8b6SYinan Xu    def lsInstIsStore(commitType: UInt): Bool = commitType(0)
134c3abb8b6SYinan Xu    def isStore(commitType: UInt): Bool = isLoadStore(commitType) && lsInstIsStore(commitType)
135c3abb8b6SYinan Xu    def isBranch(commitType: UInt): Bool = commitType(0) && !commitType(1) && !isFused(commitType)
136518d8658SYinan Xu  }
137bfb958a3SYinan Xu
138bfb958a3SYinan Xu  object RedirectLevel {
1392d7c7105SYinan Xu    def flushAfter = "b0".U
1402d7c7105SYinan Xu    def flush      = "b1".U
141bfb958a3SYinan Xu
1422d7c7105SYinan Xu    def apply() = UInt(1.W)
1432d7c7105SYinan Xu    // def isUnconditional(level: UInt) = level(1)
144bfb958a3SYinan Xu    def flushItself(level: UInt) = level(0)
1452d7c7105SYinan Xu    // def isException(level: UInt) = level(1) && level(0)
146bfb958a3SYinan Xu  }
147baf8def6SYinan Xu
148baf8def6SYinan Xu  object ExceptionVec {
149baf8def6SYinan Xu    def apply() = Vec(16, Bool())
150baf8def6SYinan Xu  }
151a8e04b1dSYinan Xu
152c60c1ab4SWilliam Wang  object PMAMode {
1538d9a04fcSWilliam Wang    def R = "b1".U << 0 //readable
1548d9a04fcSWilliam Wang    def W = "b1".U << 1 //writeable
1558d9a04fcSWilliam Wang    def X = "b1".U << 2 //executable
1568d9a04fcSWilliam Wang    def I = "b1".U << 3 //cacheable: icache
1578d9a04fcSWilliam Wang    def D = "b1".U << 4 //cacheable: dcache
1588d9a04fcSWilliam Wang    def S = "b1".U << 5 //enable speculative access
159cff68e26SWilliam Wang    def A = "b1".U << 6 //enable atomic operation, A imply R & W
1608d9a04fcSWilliam Wang    def C = "b1".U << 7 //if it is cacheable is configable
161c60c1ab4SWilliam Wang    def Reserved = "b0".U
162c60c1ab4SWilliam Wang
163c60c1ab4SWilliam Wang    def apply() = UInt(7.W)
164c60c1ab4SWilliam Wang
165c60c1ab4SWilliam Wang    def read(mode: UInt) = mode(0)
166c60c1ab4SWilliam Wang    def write(mode: UInt) = mode(1)
167c60c1ab4SWilliam Wang    def execute(mode: UInt) = mode(2)
168c60c1ab4SWilliam Wang    def icache(mode: UInt) = mode(3)
169c60c1ab4SWilliam Wang    def dcache(mode: UInt) = mode(4)
170c60c1ab4SWilliam Wang    def speculate(mode: UInt) = mode(5)
171c60c1ab4SWilliam Wang    def atomic(mode: UInt) = mode(6)
172c60c1ab4SWilliam Wang    def configable_cache(mode: UInt) = mode(7)
173c60c1ab4SWilliam Wang
174c60c1ab4SWilliam Wang    def strToMode(s: String) = {
175423b9255SWilliam Wang      var result = 0.U(8.W)
176c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("R") >= 0) result = result + R
177c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("W") >= 0) result = result + W
178c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("X") >= 0) result = result + X
179c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("I") >= 0) result = result + I
180c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("D") >= 0) result = result + D
181c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("S") >= 0) result = result + S
182c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("A") >= 0) result = result + A
183c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("C") >= 0) result = result + C
184c60c1ab4SWilliam Wang      result
185c60c1ab4SWilliam Wang    }
186c60c1ab4SWilliam Wang  }
1872225d46eSJiawei Lin
1882225d46eSJiawei Lin
1892225d46eSJiawei Lin  object CSROpType {
1902225d46eSJiawei Lin    def jmp  = "b000".U
1912225d46eSJiawei Lin    def wrt  = "b001".U
1922225d46eSJiawei Lin    def set  = "b010".U
1932225d46eSJiawei Lin    def clr  = "b011".U
194b6900d94SYinan Xu    def wfi  = "b100".U
1952225d46eSJiawei Lin    def wrti = "b101".U
1962225d46eSJiawei Lin    def seti = "b110".U
1972225d46eSJiawei Lin    def clri = "b111".U
1985d669833SYinan Xu    def needAccess(op: UInt): Bool = op(1, 0) =/= 0.U
1992225d46eSJiawei Lin  }
2002225d46eSJiawei Lin
2012225d46eSJiawei Lin  // jump
2022225d46eSJiawei Lin  object JumpOpType {
2032225d46eSJiawei Lin    def jal  = "b00".U
2042225d46eSJiawei Lin    def jalr = "b01".U
2052225d46eSJiawei Lin    def auipc = "b10".U
2062225d46eSJiawei Lin//    def call = "b11_011".U
2072225d46eSJiawei Lin//    def ret  = "b11_100".U
2082225d46eSJiawei Lin    def jumpOpisJalr(op: UInt) = op(0)
2092225d46eSJiawei Lin    def jumpOpisAuipc(op: UInt) = op(1)
2102225d46eSJiawei Lin  }
2112225d46eSJiawei Lin
2122225d46eSJiawei Lin  object FenceOpType {
2132225d46eSJiawei Lin    def fence  = "b10000".U
2142225d46eSJiawei Lin    def sfence = "b10001".U
2152225d46eSJiawei Lin    def fencei = "b10010".U
216af2f7849Shappy-lx    def nofence= "b00000".U
2172225d46eSJiawei Lin  }
2182225d46eSJiawei Lin
2192225d46eSJiawei Lin  object ALUOpType {
220ee8ff153Szfw    // shift optype
221675acc68SYinan Xu    def slliuw     = "b000_0000".U // slliuw: ZEXT(src1[31:0]) << shamt
222675acc68SYinan Xu    def sll        = "b000_0001".U // sll:     src1 << src2
223ee8ff153Szfw
224675acc68SYinan Xu    def bclr       = "b000_0010".U // bclr:    src1 & ~(1 << src2[5:0])
225675acc68SYinan Xu    def bset       = "b000_0011".U // bset:    src1 | (1 << src2[5:0])
226675acc68SYinan Xu    def binv       = "b000_0100".U // binv:    src1 ^ ~(1 << src2[5:0])
227ee8ff153Szfw
228675acc68SYinan Xu    def srl        = "b000_0101".U // srl:     src1 >> src2
229675acc68SYinan Xu    def bext       = "b000_0110".U // bext:    (src1 >> src2)[0]
230675acc68SYinan Xu    def sra        = "b000_0111".U // sra:     src1 >> src2 (arithmetic)
231ee8ff153Szfw
2327b441e5eSYinan Xu    def rol        = "b000_1001".U // rol:     (src1 << src2) | (src1 >> (xlen - src2))
2337b441e5eSYinan Xu    def ror        = "b000_1011".U // ror:     (src1 >> src2) | (src1 << (xlen - src2))
234184a1958Szfw
235ee8ff153Szfw    // RV64 32bit optype
236675acc68SYinan Xu    def addw       = "b001_0000".U // addw:      SEXT((src1 + src2)[31:0])
237675acc68SYinan Xu    def oddaddw    = "b001_0001".U // oddaddw:   SEXT((src1[0] + src2)[31:0])
238675acc68SYinan Xu    def subw       = "b001_0010".U // subw:      SEXT((src1 - src2)[31:0])
239ee8ff153Szfw
240675acc68SYinan Xu    def addwbit    = "b001_0100".U // addwbit:   (src1 + src2)[0]
241675acc68SYinan Xu    def addwbyte   = "b001_0101".U // addwbyte:  (src1 + src2)[7:0]
242675acc68SYinan Xu    def addwzexth  = "b001_0110".U // addwzexth: ZEXT((src1  + src2)[15:0])
243675acc68SYinan Xu    def addwsexth  = "b001_0111".U // addwsexth: SEXT((src1  + src2)[15:0])
244ee8ff153Szfw
245675acc68SYinan Xu    def sllw       = "b001_1000".U // sllw:     SEXT((src1 << src2)[31:0])
246675acc68SYinan Xu    def srlw       = "b001_1001".U // srlw:     SEXT((src1[31:0] >> src2)[31:0])
247675acc68SYinan Xu    def sraw       = "b001_1010".U // sraw:     SEXT((src1[31:0] >> src2)[31:0])
248675acc68SYinan Xu    def rolw       = "b001_1100".U
249675acc68SYinan Xu    def rorw       = "b001_1101".U
250675acc68SYinan Xu
251675acc68SYinan Xu    // ADD-op
252675acc68SYinan Xu    def adduw      = "b010_0000".U // adduw:  src1[31:0]  + src2
253675acc68SYinan Xu    def add        = "b010_0001".U // add:     src1        + src2
254675acc68SYinan Xu    def oddadd     = "b010_0010".U // oddadd:  src1[0]     + src2
255675acc68SYinan Xu
256675acc68SYinan Xu    def sr29add    = "b010_0100".U // sr29add: src1[63:29] + src2
257675acc68SYinan Xu    def sr30add    = "b010_0101".U // sr30add: src1[63:30] + src2
258675acc68SYinan Xu    def sr31add    = "b010_0110".U // sr31add: src1[63:31] + src2
259675acc68SYinan Xu    def sr32add    = "b010_0111".U // sr32add: src1[63:32] + src2
260675acc68SYinan Xu
261675acc68SYinan Xu    def sh1adduw   = "b010_1000".U // sh1adduw: {src1[31:0], 1'b0} + src2
262675acc68SYinan Xu    def sh1add     = "b010_1001".U // sh1add: {src1[62:0], 1'b0} + src2
263675acc68SYinan Xu    def sh2adduw   = "b010_1010".U // sh2add_uw: {src1[31:0], 2'b0} + src2
264675acc68SYinan Xu    def sh2add     = "b010_1011".U // sh2add: {src1[61:0], 2'b0} + src2
265675acc68SYinan Xu    def sh3adduw   = "b010_1100".U // sh3add_uw: {src1[31:0], 3'b0} + src2
266675acc68SYinan Xu    def sh3add     = "b010_1101".U // sh3add: {src1[60:0], 3'b0} + src2
267675acc68SYinan Xu    def sh4add     = "b010_1111".U // sh4add: {src1[59:0], 4'b0} + src2
268675acc68SYinan Xu
269675acc68SYinan Xu    // SUB-op: src1 - src2
270675acc68SYinan Xu    def sub        = "b011_0000".U
271675acc68SYinan Xu    def sltu       = "b011_0001".U
272675acc68SYinan Xu    def slt        = "b011_0010".U
273675acc68SYinan Xu    def maxu       = "b011_0100".U
274675acc68SYinan Xu    def minu       = "b011_0101".U
275675acc68SYinan Xu    def max        = "b011_0110".U
276675acc68SYinan Xu    def min        = "b011_0111".U
277675acc68SYinan Xu
278675acc68SYinan Xu    // branch
279675acc68SYinan Xu    def beq        = "b111_0000".U
280675acc68SYinan Xu    def bne        = "b111_0010".U
281675acc68SYinan Xu    def blt        = "b111_1000".U
282675acc68SYinan Xu    def bge        = "b111_1010".U
283675acc68SYinan Xu    def bltu       = "b111_1100".U
284675acc68SYinan Xu    def bgeu       = "b111_1110".U
285675acc68SYinan Xu
286675acc68SYinan Xu    // misc optype
287675acc68SYinan Xu    def and        = "b100_0000".U
288675acc68SYinan Xu    def andn       = "b100_0001".U
289675acc68SYinan Xu    def or         = "b100_0010".U
290675acc68SYinan Xu    def orn        = "b100_0011".U
291675acc68SYinan Xu    def xor        = "b100_0100".U
292675acc68SYinan Xu    def xnor       = "b100_0101".U
293675acc68SYinan Xu    def orcb       = "b100_0110".U
294675acc68SYinan Xu
295675acc68SYinan Xu    def sextb      = "b100_1000".U
296675acc68SYinan Xu    def packh      = "b100_1001".U
297675acc68SYinan Xu    def sexth      = "b100_1010".U
298675acc68SYinan Xu    def packw      = "b100_1011".U
299675acc68SYinan Xu
300675acc68SYinan Xu    def revb       = "b101_0000".U
301675acc68SYinan Xu    def rev8       = "b101_0001".U
302675acc68SYinan Xu    def pack       = "b101_0010".U
303675acc68SYinan Xu    def orh48      = "b101_0011".U
304675acc68SYinan Xu
305675acc68SYinan Xu    def szewl1     = "b101_1000".U
306675acc68SYinan Xu    def szewl2     = "b101_1001".U
307675acc68SYinan Xu    def szewl3     = "b101_1010".U
308675acc68SYinan Xu    def byte2      = "b101_1011".U
309675acc68SYinan Xu
310675acc68SYinan Xu    def andlsb     = "b110_0000".U
311675acc68SYinan Xu    def andzexth   = "b110_0001".U
312675acc68SYinan Xu    def orlsb      = "b110_0010".U
313675acc68SYinan Xu    def orzexth    = "b110_0011".U
314675acc68SYinan Xu    def xorlsb     = "b110_0100".U
315675acc68SYinan Xu    def xorzexth   = "b110_0101".U
316675acc68SYinan Xu    def orcblsb    = "b110_0110".U
317675acc68SYinan Xu    def orcbzexth  = "b110_0111".U
318675acc68SYinan Xu
319675acc68SYinan Xu    def isAddw(func: UInt) = func(6, 4) === "b001".U && !func(3) && !func(1)
320675acc68SYinan Xu    def isSimpleLogic(func: UInt) = func(6, 4) === "b100".U && !func(0)
321675acc68SYinan Xu    def logicToLsb(func: UInt) = Cat("b110".U(3.W), func(3, 1), 0.U(1.W))
322675acc68SYinan Xu    def logicToZexth(func: UInt) = Cat("b110".U(3.W), func(3, 1), 1.U(1.W))
323675acc68SYinan Xu    def isBranch(func: UInt) = func(6, 4) === "b111".U
324675acc68SYinan Xu    def getBranchType(func: UInt) = func(3, 2)
325675acc68SYinan Xu    def isBranchInvert(func: UInt) = func(1)
326675acc68SYinan Xu
327675acc68SYinan Xu    def apply() = UInt(7.W)
3282225d46eSJiawei Lin  }
3292225d46eSJiawei Lin
3302225d46eSJiawei Lin  object MDUOpType {
3312225d46eSJiawei Lin    // mul
3322225d46eSJiawei Lin    // bit encoding: | type (2bit) | isWord(1bit) | opcode(2bit) |
3332225d46eSJiawei Lin    def mul    = "b00000".U
3342225d46eSJiawei Lin    def mulh   = "b00001".U
3352225d46eSJiawei Lin    def mulhsu = "b00010".U
3362225d46eSJiawei Lin    def mulhu  = "b00011".U
3372225d46eSJiawei Lin    def mulw   = "b00100".U
3382225d46eSJiawei Lin
33988825c5cSYinan Xu    def mulw7  = "b01100".U
34088825c5cSYinan Xu
3412225d46eSJiawei Lin    // div
3422225d46eSJiawei Lin    // bit encoding: | type (2bit) | isWord(1bit) | isSign(1bit) | opcode(1bit) |
34388825c5cSYinan Xu    def div    = "b10000".U
34488825c5cSYinan Xu    def divu   = "b10010".U
34588825c5cSYinan Xu    def rem    = "b10001".U
34688825c5cSYinan Xu    def remu   = "b10011".U
3472225d46eSJiawei Lin
34888825c5cSYinan Xu    def divw   = "b10100".U
34988825c5cSYinan Xu    def divuw  = "b10110".U
35088825c5cSYinan Xu    def remw   = "b10101".U
35188825c5cSYinan Xu    def remuw  = "b10111".U
3522225d46eSJiawei Lin
35388825c5cSYinan Xu    def isMul(op: UInt) = !op(4)
35488825c5cSYinan Xu    def isDiv(op: UInt) = op(4)
3552225d46eSJiawei Lin
3562225d46eSJiawei Lin    def isDivSign(op: UInt) = isDiv(op) && !op(1)
3572225d46eSJiawei Lin    def isW(op: UInt) = op(2)
3582225d46eSJiawei Lin    def isH(op: UInt) = (isDiv(op) && op(0)) || (isMul(op) && op(1, 0) =/= 0.U)
3592225d46eSJiawei Lin    def getMulOp(op: UInt) = op(1, 0)
3602225d46eSJiawei Lin  }
3612225d46eSJiawei Lin
3622225d46eSJiawei Lin  object LSUOpType {
363d200f594SWilliam Wang    // load pipeline
3642225d46eSJiawei Lin
365d200f594SWilliam Wang    // normal load
366d200f594SWilliam Wang    // Note: bit(1, 0) are size, DO NOT CHANGE
367d200f594SWilliam Wang    // bit encoding: | load 0 | is unsigned(1bit) | size(2bit) |
368d200f594SWilliam Wang    def lb       = "b0000".U
369d200f594SWilliam Wang    def lh       = "b0001".U
370d200f594SWilliam Wang    def lw       = "b0010".U
371d200f594SWilliam Wang    def ld       = "b0011".U
372d200f594SWilliam Wang    def lbu      = "b0100".U
373d200f594SWilliam Wang    def lhu      = "b0101".U
374d200f594SWilliam Wang    def lwu      = "b0110".U
375ca18a0b4SWilliam Wang
376d200f594SWilliam Wang    // Zicbop software prefetch
377d200f594SWilliam Wang    // bit encoding: | prefetch 1 | 0 | prefetch type (2bit) |
378d200f594SWilliam Wang    def prefetch_i = "b1000".U // TODO
379d200f594SWilliam Wang    def prefetch_r = "b1001".U
380d200f594SWilliam Wang    def prefetch_w = "b1010".U
381ca18a0b4SWilliam Wang
382d200f594SWilliam Wang    def isPrefetch(op: UInt): Bool = op(3)
383d200f594SWilliam Wang
384d200f594SWilliam Wang    // store pipeline
385d200f594SWilliam Wang    // normal store
386d200f594SWilliam Wang    // bit encoding: | store 00 | size(2bit) |
387d200f594SWilliam Wang    def sb       = "b0000".U
388d200f594SWilliam Wang    def sh       = "b0001".U
389d200f594SWilliam Wang    def sw       = "b0010".U
390d200f594SWilliam Wang    def sd       = "b0011".U
391d200f594SWilliam Wang
392d200f594SWilliam Wang    // l1 cache op
393d200f594SWilliam Wang    // bit encoding: | cbo_zero 01 | size(2bit) 11 |
394d200f594SWilliam Wang    def cbo_zero  = "b0111".U
395d200f594SWilliam Wang
396d200f594SWilliam Wang    // llc op
397d200f594SWilliam Wang    // bit encoding: | prefetch 11 | suboptype(2bit) |
398d200f594SWilliam Wang    def cbo_clean = "b1100".U
399d200f594SWilliam Wang    def cbo_flush = "b1101".U
400d200f594SWilliam Wang    def cbo_inval = "b1110".U
401d200f594SWilliam Wang
402d200f594SWilliam Wang    def isCbo(op: UInt): Bool = op(3, 2) === "b11".U
4032225d46eSJiawei Lin
4042225d46eSJiawei Lin    // atomics
4052225d46eSJiawei Lin    // bit(1, 0) are size
4062225d46eSJiawei Lin    // since atomics use a different fu type
4072225d46eSJiawei Lin    // so we can safely reuse other load/store's encodings
408d200f594SWilliam Wang    // bit encoding: | optype(4bit) | size (2bit) |
4092225d46eSJiawei Lin    def lr_w      = "b000010".U
4102225d46eSJiawei Lin    def sc_w      = "b000110".U
4112225d46eSJiawei Lin    def amoswap_w = "b001010".U
4122225d46eSJiawei Lin    def amoadd_w  = "b001110".U
4132225d46eSJiawei Lin    def amoxor_w  = "b010010".U
4142225d46eSJiawei Lin    def amoand_w  = "b010110".U
4152225d46eSJiawei Lin    def amoor_w   = "b011010".U
4162225d46eSJiawei Lin    def amomin_w  = "b011110".U
4172225d46eSJiawei Lin    def amomax_w  = "b100010".U
4182225d46eSJiawei Lin    def amominu_w = "b100110".U
4192225d46eSJiawei Lin    def amomaxu_w = "b101010".U
4202225d46eSJiawei Lin
4212225d46eSJiawei Lin    def lr_d      = "b000011".U
4222225d46eSJiawei Lin    def sc_d      = "b000111".U
4232225d46eSJiawei Lin    def amoswap_d = "b001011".U
4242225d46eSJiawei Lin    def amoadd_d  = "b001111".U
4252225d46eSJiawei Lin    def amoxor_d  = "b010011".U
4262225d46eSJiawei Lin    def amoand_d  = "b010111".U
4272225d46eSJiawei Lin    def amoor_d   = "b011011".U
4282225d46eSJiawei Lin    def amomin_d  = "b011111".U
4292225d46eSJiawei Lin    def amomax_d  = "b100011".U
4302225d46eSJiawei Lin    def amominu_d = "b100111".U
4312225d46eSJiawei Lin    def amomaxu_d = "b101011".U
432b6982e83SLemover
433b6982e83SLemover    def size(op: UInt) = op(1,0)
4342225d46eSJiawei Lin  }
4352225d46eSJiawei Lin
4363feeca58Szfw  object BKUOpType {
437ee8ff153Szfw
4383feeca58Szfw    def clmul       = "b000000".U
4393feeca58Szfw    def clmulh      = "b000001".U
4403feeca58Szfw    def clmulr      = "b000010".U
4413feeca58Szfw    def xpermn      = "b000100".U
4423feeca58Szfw    def xpermb      = "b000101".U
443ee8ff153Szfw
4443feeca58Szfw    def clz         = "b001000".U
4453feeca58Szfw    def clzw        = "b001001".U
4463feeca58Szfw    def ctz         = "b001010".U
4473feeca58Szfw    def ctzw        = "b001011".U
4483feeca58Szfw    def cpop        = "b001100".U
4493feeca58Szfw    def cpopw       = "b001101".U
45007596dc6Szfw
4513feeca58Szfw    // 01xxxx is reserve
4523feeca58Szfw    def aes64es     = "b100000".U
4533feeca58Szfw    def aes64esm    = "b100001".U
4543feeca58Szfw    def aes64ds     = "b100010".U
4553feeca58Szfw    def aes64dsm    = "b100011".U
4563feeca58Szfw    def aes64im     = "b100100".U
4573feeca58Szfw    def aes64ks1i   = "b100101".U
4583feeca58Szfw    def aes64ks2    = "b100110".U
4593feeca58Szfw
4603feeca58Szfw    // merge to two instruction sm4ks & sm4ed
46119bcce38SFawang Zhang    def sm4ed0      = "b101000".U
46219bcce38SFawang Zhang    def sm4ed1      = "b101001".U
46319bcce38SFawang Zhang    def sm4ed2      = "b101010".U
46419bcce38SFawang Zhang    def sm4ed3      = "b101011".U
46519bcce38SFawang Zhang    def sm4ks0      = "b101100".U
46619bcce38SFawang Zhang    def sm4ks1      = "b101101".U
46719bcce38SFawang Zhang    def sm4ks2      = "b101110".U
46819bcce38SFawang Zhang    def sm4ks3      = "b101111".U
4693feeca58Szfw
4703feeca58Szfw    def sha256sum0  = "b110000".U
4713feeca58Szfw    def sha256sum1  = "b110001".U
4723feeca58Szfw    def sha256sig0  = "b110010".U
4733feeca58Szfw    def sha256sig1  = "b110011".U
4743feeca58Szfw    def sha512sum0  = "b110100".U
4753feeca58Szfw    def sha512sum1  = "b110101".U
4763feeca58Szfw    def sha512sig0  = "b110110".U
4773feeca58Szfw    def sha512sig1  = "b110111".U
4783feeca58Szfw
4793feeca58Szfw    def sm3p0       = "b111000".U
4803feeca58Szfw    def sm3p1       = "b111001".U
481ee8ff153Szfw  }
482ee8ff153Szfw
4832225d46eSJiawei Lin  object BTBtype {
4842225d46eSJiawei Lin    def B = "b00".U  // branch
4852225d46eSJiawei Lin    def J = "b01".U  // jump
4862225d46eSJiawei Lin    def I = "b10".U  // indirect
4872225d46eSJiawei Lin    def R = "b11".U  // return
4882225d46eSJiawei Lin
4892225d46eSJiawei Lin    def apply() = UInt(2.W)
4902225d46eSJiawei Lin  }
4912225d46eSJiawei Lin
4922225d46eSJiawei Lin  object SelImm {
493ee8ff153Szfw    def IMM_X  = "b0111".U
494ee8ff153Szfw    def IMM_S  = "b0000".U
495ee8ff153Szfw    def IMM_SB = "b0001".U
496ee8ff153Szfw    def IMM_U  = "b0010".U
497ee8ff153Szfw    def IMM_UJ = "b0011".U
498ee8ff153Szfw    def IMM_I  = "b0100".U
499ee8ff153Szfw    def IMM_Z  = "b0101".U
500ee8ff153Szfw    def INVALID_INSTR = "b0110".U
501ee8ff153Szfw    def IMM_B6 = "b1000".U
5022225d46eSJiawei Lin
503ee8ff153Szfw    def apply() = UInt(4.W)
5042225d46eSJiawei Lin  }
5052225d46eSJiawei Lin
5066ab6918fSYinan Xu  object ExceptionNO {
5076ab6918fSYinan Xu    def instrAddrMisaligned = 0
5086ab6918fSYinan Xu    def instrAccessFault    = 1
5096ab6918fSYinan Xu    def illegalInstr        = 2
5106ab6918fSYinan Xu    def breakPoint          = 3
5116ab6918fSYinan Xu    def loadAddrMisaligned  = 4
5126ab6918fSYinan Xu    def loadAccessFault     = 5
5136ab6918fSYinan Xu    def storeAddrMisaligned = 6
5146ab6918fSYinan Xu    def storeAccessFault    = 7
5156ab6918fSYinan Xu    def ecallU              = 8
5166ab6918fSYinan Xu    def ecallS              = 9
5176ab6918fSYinan Xu    def ecallM              = 11
5186ab6918fSYinan Xu    def instrPageFault      = 12
5196ab6918fSYinan Xu    def loadPageFault       = 13
5206ab6918fSYinan Xu    // def singleStep          = 14
5216ab6918fSYinan Xu    def storePageFault      = 15
5226ab6918fSYinan Xu    def priorities = Seq(
5236ab6918fSYinan Xu      breakPoint, // TODO: different BP has different priority
5246ab6918fSYinan Xu      instrPageFault,
5256ab6918fSYinan Xu      instrAccessFault,
5266ab6918fSYinan Xu      illegalInstr,
5276ab6918fSYinan Xu      instrAddrMisaligned,
5286ab6918fSYinan Xu      ecallM, ecallS, ecallU,
5296ab6918fSYinan Xu      storePageFault,
5306ab6918fSYinan Xu      loadPageFault,
5316ab6918fSYinan Xu      storeAccessFault,
5326ab6918fSYinan Xu      loadAccessFault,
5336ab6918fSYinan Xu      storeAddrMisaligned,
5346ab6918fSYinan Xu      loadAddrMisaligned
5356ab6918fSYinan Xu    )
5366ab6918fSYinan Xu    def all = priorities.distinct.sorted
5376ab6918fSYinan Xu    def frontendSet = Seq(
5386ab6918fSYinan Xu      instrAddrMisaligned,
5396ab6918fSYinan Xu      instrAccessFault,
5406ab6918fSYinan Xu      illegalInstr,
5416ab6918fSYinan Xu      instrPageFault
5426ab6918fSYinan Xu    )
5436ab6918fSYinan Xu    def partialSelect(vec: Vec[Bool], select: Seq[Int]): Vec[Bool] = {
5446ab6918fSYinan Xu      val new_vec = Wire(ExceptionVec())
5456ab6918fSYinan Xu      new_vec.foreach(_ := false.B)
5466ab6918fSYinan Xu      select.foreach(i => new_vec(i) := vec(i))
5476ab6918fSYinan Xu      new_vec
5486ab6918fSYinan Xu    }
5496ab6918fSYinan Xu    def selectFrontend(vec: Vec[Bool]): Vec[Bool] = partialSelect(vec, frontendSet)
5506ab6918fSYinan Xu    def selectAll(vec: Vec[Bool]): Vec[Bool] = partialSelect(vec, ExceptionNO.all)
5516ab6918fSYinan Xu    def selectByFu(vec:Vec[Bool], fuConfig: FuConfig): Vec[Bool] =
5526ab6918fSYinan Xu      partialSelect(vec, fuConfig.exceptionOut)
5536ab6918fSYinan Xu    def selectByExu(vec:Vec[Bool], exuConfig: ExuConfig): Vec[Bool] =
5546ab6918fSYinan Xu      partialSelect(vec, exuConfig.exceptionOut)
5556ab6918fSYinan Xu    def selectByExu(vec:Vec[Bool], exuConfigs: Seq[ExuConfig]): Vec[Bool] =
5566ab6918fSYinan Xu      partialSelect(vec, exuConfigs.map(_.exceptionOut).reduce(_ ++ _).distinct.sorted)
5576ab6918fSYinan Xu  }
5586ab6918fSYinan Xu
559a58e3351SLi Qianruo  def dividerGen(p: Parameters) = new SRT16Divider(p(XLen))(p)
560c3d7991bSJiawei Lin  def multiplierGen(p: Parameters) = new ArrayMultiplier(p(XLen) + 1)(p)
5612225d46eSJiawei Lin  def aluGen(p: Parameters) = new Alu()(p)
5623feeca58Szfw  def bkuGen(p: Parameters) = new Bku()(p)
5632225d46eSJiawei Lin  def jmpGen(p: Parameters) = new Jump()(p)
5642225d46eSJiawei Lin  def fenceGen(p: Parameters) = new Fence()(p)
5652225d46eSJiawei Lin  def csrGen(p: Parameters) = new CSR()(p)
5662225d46eSJiawei Lin  def i2fGen(p: Parameters) = new IntToFP()(p)
5672225d46eSJiawei Lin  def fmacGen(p: Parameters) = new FMA()(p)
5682225d46eSJiawei Lin  def f2iGen(p: Parameters) = new FPToInt()(p)
5692225d46eSJiawei Lin  def f2fGen(p: Parameters) = new FPToFP()(p)
5702225d46eSJiawei Lin  def fdivSqrtGen(p: Parameters) = new FDivSqrt()(p)
57185b4cd54SYinan Xu  def stdGen(p: Parameters) = new Std()(p)
5726ab6918fSYinan Xu  def mouDataGen(p: Parameters) = new Std()(p)
5732225d46eSJiawei Lin
5746cdd85d9SYinan Xu  def f2iSel(uop: MicroOp): Bool = {
5756cdd85d9SYinan Xu    uop.ctrl.rfWen
5762225d46eSJiawei Lin  }
5772225d46eSJiawei Lin
5786cdd85d9SYinan Xu  def i2fSel(uop: MicroOp): Bool = {
5796cdd85d9SYinan Xu    uop.ctrl.fpu.fromInt
5802225d46eSJiawei Lin  }
5812225d46eSJiawei Lin
5826cdd85d9SYinan Xu  def f2fSel(uop: MicroOp): Bool = {
5836cdd85d9SYinan Xu    val ctrl = uop.ctrl.fpu
5842225d46eSJiawei Lin    ctrl.fpWen && !ctrl.div && !ctrl.sqrt
5852225d46eSJiawei Lin  }
5862225d46eSJiawei Lin
5876cdd85d9SYinan Xu  def fdivSqrtSel(uop: MicroOp): Bool = {
5886cdd85d9SYinan Xu    val ctrl = uop.ctrl.fpu
5892225d46eSJiawei Lin    ctrl.div || ctrl.sqrt
5902225d46eSJiawei Lin  }
5912225d46eSJiawei Lin
5922225d46eSJiawei Lin  val aluCfg = FuConfig(
5931a0f06eeSYinan Xu    name = "alu",
5942225d46eSJiawei Lin    fuGen = aluGen,
5956cdd85d9SYinan Xu    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.alu,
5962225d46eSJiawei Lin    fuType = FuType.alu,
5972225d46eSJiawei Lin    numIntSrc = 2,
5982225d46eSJiawei Lin    numFpSrc = 0,
5992225d46eSJiawei Lin    writeIntRf = true,
6002225d46eSJiawei Lin    writeFpRf = false,
6012225d46eSJiawei Lin    hasRedirect = true,
6022225d46eSJiawei Lin  )
6032225d46eSJiawei Lin
6042225d46eSJiawei Lin  val jmpCfg = FuConfig(
6051a0f06eeSYinan Xu    name = "jmp",
6062225d46eSJiawei Lin    fuGen = jmpGen,
6076cdd85d9SYinan Xu    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.jmp,
6082225d46eSJiawei Lin    fuType = FuType.jmp,
6092225d46eSJiawei Lin    numIntSrc = 1,
6102225d46eSJiawei Lin    numFpSrc = 0,
6112225d46eSJiawei Lin    writeIntRf = true,
6122225d46eSJiawei Lin    writeFpRf = false,
6132225d46eSJiawei Lin    hasRedirect = true,
6142225d46eSJiawei Lin  )
6152225d46eSJiawei Lin
6162225d46eSJiawei Lin  val fenceCfg = FuConfig(
6171a0f06eeSYinan Xu    name = "fence",
6182225d46eSJiawei Lin    fuGen = fenceGen,
6196cdd85d9SYinan Xu    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.fence,
6206ab6918fSYinan Xu    FuType.fence, 2, 0, writeIntRf = false, writeFpRf = false,
6216ab6918fSYinan Xu    latency = UncertainLatency(), exceptionOut = Seq(illegalInstr) // TODO: need rewrite latency structure, not just this value,
6222225d46eSJiawei Lin  )
6232225d46eSJiawei Lin
6242225d46eSJiawei Lin  val csrCfg = FuConfig(
6251a0f06eeSYinan Xu    name = "csr",
6262225d46eSJiawei Lin    fuGen = csrGen,
6276cdd85d9SYinan Xu    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.csr,
6282225d46eSJiawei Lin    fuType = FuType.csr,
6292225d46eSJiawei Lin    numIntSrc = 1,
6302225d46eSJiawei Lin    numFpSrc = 0,
6312225d46eSJiawei Lin    writeIntRf = true,
6322225d46eSJiawei Lin    writeFpRf = false,
6336ab6918fSYinan Xu    exceptionOut = Seq(illegalInstr, breakPoint, ecallU, ecallS, ecallM),
6346ab6918fSYinan Xu    flushPipe = true
6352225d46eSJiawei Lin  )
6362225d46eSJiawei Lin
6372225d46eSJiawei Lin  val i2fCfg = FuConfig(
6381a0f06eeSYinan Xu    name = "i2f",
6392225d46eSJiawei Lin    fuGen = i2fGen,
6402225d46eSJiawei Lin    fuSel = i2fSel,
6412225d46eSJiawei Lin    FuType.i2f,
6422225d46eSJiawei Lin    numIntSrc = 1,
6432225d46eSJiawei Lin    numFpSrc = 0,
6442225d46eSJiawei Lin    writeIntRf = false,
6452225d46eSJiawei Lin    writeFpRf = true,
6466ab6918fSYinan Xu    writeFflags = true,
647e174d629SJiawei Lin    latency = CertainLatency(2),
648e174d629SJiawei Lin    fastUopOut = true, fastImplemented = true
6492225d46eSJiawei Lin  )
6502225d46eSJiawei Lin
6512225d46eSJiawei Lin  val divCfg = FuConfig(
6521a0f06eeSYinan Xu    name = "div",
6532225d46eSJiawei Lin    fuGen = dividerGen,
65407596dc6Szfw    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.div,
6552225d46eSJiawei Lin    FuType.div,
6562225d46eSJiawei Lin    2,
6572225d46eSJiawei Lin    0,
6582225d46eSJiawei Lin    writeIntRf = true,
6592225d46eSJiawei Lin    writeFpRf = false,
660f83b578aSYinan Xu    latency = UncertainLatency(),
661f83b578aSYinan Xu    fastUopOut = true,
66281cc0e81SYinan Xu    fastImplemented = true
6632225d46eSJiawei Lin  )
6642225d46eSJiawei Lin
6652225d46eSJiawei Lin  val mulCfg = FuConfig(
6661a0f06eeSYinan Xu    name = "mul",
6672225d46eSJiawei Lin    fuGen = multiplierGen,
66807596dc6Szfw    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.mul,
6692225d46eSJiawei Lin    FuType.mul,
6702225d46eSJiawei Lin    2,
6712225d46eSJiawei Lin    0,
6722225d46eSJiawei Lin    writeIntRf = true,
6732225d46eSJiawei Lin    writeFpRf = false,
674b2482bc1SYinan Xu    latency = CertainLatency(2),
675f83b578aSYinan Xu    fastUopOut = true,
676b2482bc1SYinan Xu    fastImplemented = true
6772225d46eSJiawei Lin  )
6782225d46eSJiawei Lin
6793feeca58Szfw  val bkuCfg = FuConfig(
6803feeca58Szfw    name = "bku",
6813feeca58Szfw    fuGen = bkuGen,
6823feeca58Szfw    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.bku,
6833feeca58Szfw    fuType = FuType.bku,
684ee8ff153Szfw    numIntSrc = 2,
685ee8ff153Szfw    numFpSrc = 0,
686ee8ff153Szfw    writeIntRf = true,
687ee8ff153Szfw    writeFpRf = false,
688f83b578aSYinan Xu    latency = CertainLatency(1),
689f83b578aSYinan Xu    fastUopOut = true,
69007596dc6Szfw    fastImplemented = true
691ee8ff153Szfw )
692ee8ff153Szfw
6932225d46eSJiawei Lin  val fmacCfg = FuConfig(
6941a0f06eeSYinan Xu    name = "fmac",
6952225d46eSJiawei Lin    fuGen = fmacGen,
6962225d46eSJiawei Lin    fuSel = _ => true.B,
6976ab6918fSYinan Xu    FuType.fmac, 0, 3, writeIntRf = false, writeFpRf = true, writeFflags = true,
6984b65fc7eSJiawei Lin    latency = UncertainLatency(), fastUopOut = true, fastImplemented = true
6992225d46eSJiawei Lin  )
7002225d46eSJiawei Lin
7012225d46eSJiawei Lin  val f2iCfg = FuConfig(
7021a0f06eeSYinan Xu    name = "f2i",
7032225d46eSJiawei Lin    fuGen = f2iGen,
7042225d46eSJiawei Lin    fuSel = f2iSel,
7056ab6918fSYinan Xu    FuType.fmisc, 0, 1, writeIntRf = true, writeFpRf = false, writeFflags = true, latency = CertainLatency(2),
706b2482bc1SYinan Xu    fastUopOut = true, fastImplemented = true
7072225d46eSJiawei Lin  )
7082225d46eSJiawei Lin
7092225d46eSJiawei Lin  val f2fCfg = FuConfig(
7101a0f06eeSYinan Xu    name = "f2f",
7112225d46eSJiawei Lin    fuGen = f2fGen,
7122225d46eSJiawei Lin    fuSel = f2fSel,
7136ab6918fSYinan Xu    FuType.fmisc, 0, 1, writeIntRf = false, writeFpRf = true, writeFflags = true, latency = CertainLatency(2),
714b2482bc1SYinan Xu    fastUopOut = true, fastImplemented = true
7152225d46eSJiawei Lin  )
7162225d46eSJiawei Lin
7172225d46eSJiawei Lin  val fdivSqrtCfg = FuConfig(
7181a0f06eeSYinan Xu    name = "fdivSqrt",
7192225d46eSJiawei Lin    fuGen = fdivSqrtGen,
7202225d46eSJiawei Lin    fuSel = fdivSqrtSel,
7216ab6918fSYinan Xu    FuType.fDivSqrt, 0, 2, writeIntRf = false, writeFpRf = true, writeFflags = true, latency = UncertainLatency(),
722dcbc69cbSYinan Xu    fastUopOut = true, fastImplemented = true, hasInputBuffer = true
7232225d46eSJiawei Lin  )
7242225d46eSJiawei Lin
7252225d46eSJiawei Lin  val lduCfg = FuConfig(
7261a0f06eeSYinan Xu    "ldu",
7272225d46eSJiawei Lin    null, // DontCare
7282b4e8253SYinan Xu    (uop: MicroOp) => FuType.loadCanAccept(uop.ctrl.fuType),
7296ab6918fSYinan Xu    FuType.ldu, 1, 0, writeIntRf = true, writeFpRf = true,
7306ab6918fSYinan Xu    latency = UncertainLatency(),
7316ab6918fSYinan Xu    exceptionOut = Seq(loadAddrMisaligned, loadAccessFault, loadPageFault),
7326ab6918fSYinan Xu    flushPipe = true,
733*6786cfb7SWilliam Wang    replayInst = true,
734*6786cfb7SWilliam Wang    hasLoadError = true
7352225d46eSJiawei Lin  )
7362225d46eSJiawei Lin
73785b4cd54SYinan Xu  val staCfg = FuConfig(
7381a0f06eeSYinan Xu    "sta",
7392225d46eSJiawei Lin    null,
7402b4e8253SYinan Xu    (uop: MicroOp) => FuType.storeCanAccept(uop.ctrl.fuType),
7416ab6918fSYinan Xu    FuType.stu, 1, 0, writeIntRf = false, writeFpRf = false,
7426ab6918fSYinan Xu    latency = UncertainLatency(),
7436ab6918fSYinan Xu    exceptionOut = Seq(storeAddrMisaligned, storeAccessFault, storePageFault)
7442225d46eSJiawei Lin  )
7452225d46eSJiawei Lin
74685b4cd54SYinan Xu  val stdCfg = FuConfig(
7471a0f06eeSYinan Xu    "std",
7482b4e8253SYinan Xu    fuGen = stdGen, fuSel = (uop: MicroOp) => FuType.storeCanAccept(uop.ctrl.fuType), FuType.stu, 1, 1,
7496ab6918fSYinan Xu    writeIntRf = false, writeFpRf = false, latency = CertainLatency(1)
75085b4cd54SYinan Xu  )
75185b4cd54SYinan Xu
7522225d46eSJiawei Lin  val mouCfg = FuConfig(
7531a0f06eeSYinan Xu    "mou",
7542225d46eSJiawei Lin    null,
7552b4e8253SYinan Xu    (uop: MicroOp) => FuType.storeCanAccept(uop.ctrl.fuType),
7566ab6918fSYinan Xu    FuType.mou, 1, 0, writeIntRf = false, writeFpRf = false,
7576ab6918fSYinan Xu    latency = UncertainLatency(), exceptionOut = lduCfg.exceptionOut ++ staCfg.exceptionOut
7582b4e8253SYinan Xu  )
7592b4e8253SYinan Xu
7602b4e8253SYinan Xu  val mouDataCfg = FuConfig(
7612b4e8253SYinan Xu    "mou",
7622b4e8253SYinan Xu    mouDataGen,
7632b4e8253SYinan Xu    (uop: MicroOp) => FuType.storeCanAccept(uop.ctrl.fuType),
7646ab6918fSYinan Xu    FuType.mou, 1, 0, writeIntRf = false, writeFpRf = false,
7656ab6918fSYinan Xu    latency = UncertainLatency()
7662225d46eSJiawei Lin  )
7672225d46eSJiawei Lin
768adb5df20SYinan Xu  val JumpExeUnitCfg = ExuConfig("JmpExeUnit", "Int", Seq(jmpCfg, i2fCfg), 2, Int.MaxValue)
769b6220f0dSLemover  val AluExeUnitCfg = ExuConfig("AluExeUnit", "Int", Seq(aluCfg), 0, Int.MaxValue)
770adb5df20SYinan Xu  val JumpCSRExeUnitCfg = ExuConfig("JmpCSRExeUnit", "Int", Seq(jmpCfg, csrCfg, fenceCfg, i2fCfg), 2, Int.MaxValue)
7713feeca58Szfw  val MulDivExeUnitCfg = ExuConfig("MulDivExeUnit", "Int", Seq(mulCfg, divCfg, bkuCfg), 1, Int.MaxValue)
772b6220f0dSLemover  val FmacExeUnitCfg = ExuConfig("FmacExeUnit", "Fp", Seq(fmacCfg), Int.MaxValue, 0)
7732225d46eSJiawei Lin  val FmiscExeUnitCfg = ExuConfig(
7742225d46eSJiawei Lin    "FmiscExeUnit",
775b6220f0dSLemover    "Fp",
7762225d46eSJiawei Lin    Seq(f2iCfg, f2fCfg, fdivSqrtCfg),
7772225d46eSJiawei Lin    Int.MaxValue, 1
7782225d46eSJiawei Lin  )
7792b4e8253SYinan Xu  val LdExeUnitCfg = ExuConfig("LoadExu", "Mem", Seq(lduCfg), wbIntPriority = 0, wbFpPriority = 0, extendsExu = false)
7802b4e8253SYinan Xu  val StaExeUnitCfg = ExuConfig("StaExu", "Mem", Seq(staCfg, mouCfg), wbIntPriority = Int.MaxValue, wbFpPriority = Int.MaxValue, extendsExu = false)
7812b4e8253SYinan Xu  val StdExeUnitCfg = ExuConfig("StdExu", "Mem", Seq(stdCfg, mouDataCfg), wbIntPriority = Int.MaxValue, wbFpPriority = Int.MaxValue, extendsExu = false)
7829a2e6b8aSLinJiawei}
783