xref: /XiangShan/src/main/scala/xiangshan/package.scala (revision 66ce8f527a99b58c4bf6c73f604f777b8c9d1559)
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._
256827759bSZhangZifeiimport xiangshan.backend.fu.vector._
262225d46eSJiawei Linimport xiangshan.backend.exu._
2754034ccdSZhangZifeiimport xiangshan.backend.{Std, ScheLaneConfig}
282225d46eSJiawei Lin
299a2e6b8aSLinJiaweipackage object xiangshan {
309ee9f926SYikeZhou  object SrcType {
311285b047SXuan Hu    def imm = "b000".U
321285b047SXuan Hu    def pc  = "b000".U
331285b047SXuan Hu    def xp  = "b001".U
341285b047SXuan Hu    def fp  = "b010".U
351285b047SXuan Hu    def vp  = "b100".U
3604b56283SZhangZifei
371285b047SXuan Hu    // alias
381285b047SXuan Hu    def reg = this.xp
391a3df1feSYikeZhou    def DC  = imm // Don't Care
4057a10886SXuan Hu    def X   = BitPat("b000")
414d24c305SYikeZhou
4204b56283SZhangZifei    def isPc(srcType: UInt) = srcType===pc
4304b56283SZhangZifei    def isImm(srcType: UInt) = srcType===imm
441285b047SXuan Hu    def isReg(srcType: UInt) = srcType(0)
452b4e8253SYinan Xu    def isFp(srcType: UInt) = srcType(1)
461285b047SXuan Hu    def isVp(srcType: UInt) = srcType(2)
471285b047SXuan Hu    def isPcOrImm(srcType: UInt) = isPc(srcType) || isImm(srcType)
4804b56283SZhangZifei
491285b047SXuan Hu    def apply() = UInt(3.W)
509a2e6b8aSLinJiawei  }
519a2e6b8aSLinJiawei
529a2e6b8aSLinJiawei  object SrcState {
53100aa93cSYinan Xu    def busy    = "b0".U
54100aa93cSYinan Xu    def rdy     = "b1".U
55100aa93cSYinan Xu    // def specRdy = "b10".U // speculative ready, for future use
56100aa93cSYinan Xu    def apply() = UInt(1.W)
579a2e6b8aSLinJiawei  }
589a2e6b8aSLinJiawei
597f2b7720SXuan Hu  // Todo: Use OH instead
602225d46eSJiawei Lin  object FuType {
6157a10886SXuan Hu    def jmp          = "b00000".U
6257a10886SXuan Hu    def i2f          = "b00001".U
6357a10886SXuan Hu    def csr          = "b00010".U
6457a10886SXuan Hu    def alu          = "b00110".U
6557a10886SXuan Hu    def mul          = "b00100".U
6657a10886SXuan Hu    def div          = "b00101".U
6757a10886SXuan Hu    def fence        = "b00011".U
6857a10886SXuan Hu    def bku          = "b00111".U
69cafb3558SLinJiawei
7057a10886SXuan Hu    def fmac         = "b01000".U
7157a10886SXuan Hu    def fmisc        = "b01011".U
7257a10886SXuan Hu    def fDivSqrt     = "b01010".U
73cafb3558SLinJiawei
7457a10886SXuan Hu    def ldu          = "b01100".U
7557a10886SXuan Hu    def stu          = "b01101".U
7657a10886SXuan Hu    def mou          = "b01111".U // for amo, lr, sc, fence
7757a10886SXuan Hu    def vipu         = "b10000".U
7857a10886SXuan Hu    def vfpu         = "b11000".U
797f2b7720SXuan Hu    def vldu         = "b11100".U
807f2b7720SXuan Hu    def vstu         = "b11101".U
8157a10886SXuan Hu    def X            = BitPat("b00000")
826e7c9679Shuxuan0307
837f2b7720SXuan Hu    def num = 18
842225d46eSJiawei Lin
859a2e6b8aSLinJiawei    def apply() = UInt(log2Up(num).W)
869a2e6b8aSLinJiawei
870f038924SZhangZifei    // TODO: Optimize FuTpye and its method
880f038924SZhangZifei    // FIXME: Vector FuType coding is not ready
890f038924SZhangZifei    def isVecExu(fuType: UInt) = fuType(4)
900f038924SZhangZifei    def isIntExu(fuType: UInt) = !isVecExu(fuType) && !fuType(3)
916ac289b3SLinJiawei    def isJumpExu(fuType: UInt) = fuType === jmp
920f038924SZhangZifei    def isFpExu(fuType: UInt) = !isVecExu(fuType) && (fuType(3, 2) === "b10".U)
930f038924SZhangZifei    def isMemExu(fuType: UInt) = !isVecExu(fuType) && (fuType(3, 2) === "b11".U)
9492ab24ebSYinan Xu    def isLoadStore(fuType: UInt) = isMemExu(fuType) && !fuType(1)
9592ab24ebSYinan Xu    def isStoreExu(fuType: UInt) = isMemExu(fuType) && fuType(0)
960f9d3717SYinan Xu    def isAMO(fuType: UInt) = fuType(1)
97af2f7849Shappy-lx    def isFence(fuType: UInt) = fuType === fence
98af2f7849Shappy-lx    def isSvinvalBegin(fuType: UInt, func: UInt, flush: Bool) = isFence(fuType) && func === FenceOpType.nofence && !flush
99af2f7849Shappy-lx    def isSvinval(fuType: UInt, func: UInt, flush: Bool) = isFence(fuType) && func === FenceOpType.sfence && !flush
100af2f7849Shappy-lx    def isSvinvalEnd(fuType: UInt, func: UInt, flush: Bool) = isFence(fuType) && func === FenceOpType.nofence && flush
1014aa9ed34Sfdy    def isVpu(fuType: UInt) = fuType(4)
10292ab24ebSYinan Xu
10392ab24ebSYinan Xu    def jmpCanAccept(fuType: UInt) = !fuType(2)
104ee8ff153Szfw    def mduCanAccept(fuType: UInt) = fuType(2) && !fuType(1) || fuType(2) && fuType(1) && fuType(0)
105ee8ff153Szfw    def aluCanAccept(fuType: UInt) = fuType(2) && fuType(1) && !fuType(0)
10692ab24ebSYinan Xu
10792ab24ebSYinan Xu    def fmacCanAccept(fuType: UInt) = !fuType(1)
10892ab24ebSYinan Xu    def fmiscCanAccept(fuType: UInt) = fuType(1)
10992ab24ebSYinan Xu
11092ab24ebSYinan Xu    def loadCanAccept(fuType: UInt) = !fuType(0)
11192ab24ebSYinan Xu    def storeCanAccept(fuType: UInt) = fuType(0)
11292ab24ebSYinan Xu
11392ab24ebSYinan Xu    def storeIsAMO(fuType: UInt) = fuType(1)
114cafb3558SLinJiawei
115cafb3558SLinJiawei    val functionNameMap = Map(
116cafb3558SLinJiawei      jmp.litValue() -> "jmp",
117ebb8ebf8SYinan Xu      i2f.litValue() -> "int_to_float",
118cafb3558SLinJiawei      csr.litValue() -> "csr",
119cafb3558SLinJiawei      alu.litValue() -> "alu",
120cafb3558SLinJiawei      mul.litValue() -> "mul",
121cafb3558SLinJiawei      div.litValue() -> "div",
122b8f08ca0SZhangZifei      fence.litValue() -> "fence",
1233feeca58Szfw      bku.litValue() -> "bku",
124cafb3558SLinJiawei      fmac.litValue() -> "fmac",
125cafb3558SLinJiawei      fmisc.litValue() -> "fmisc",
126d18dc7e6Swakafa      fDivSqrt.litValue() -> "fdiv_fsqrt",
127cafb3558SLinJiawei      ldu.litValue() -> "load",
128ebb8ebf8SYinan Xu      stu.litValue() -> "store",
129ebb8ebf8SYinan Xu      mou.litValue() -> "mou"
130cafb3558SLinJiawei    )
1319a2e6b8aSLinJiawei  }
1329a2e6b8aSLinJiawei
13357a10886SXuan Hu  def FuOpTypeWidth = 8
1342225d46eSJiawei Lin  object FuOpType {
13557a10886SXuan Hu    def apply() = UInt(FuOpTypeWidth.W)
13657a10886SXuan Hu    def X = BitPat("b00000000")
137ebd97ecbSzhanglinjuan  }
138518d8658SYinan Xu
1393a2e64c4SZhangZifei  // move VipuType and VfpuType into YunSuan/package.scala
1403a2e64c4SZhangZifei  // object VipuType {
1413a2e64c4SZhangZifei  //   def dummy = 0.U(7.W)
1423a2e64c4SZhangZifei  // }
1437f2b7720SXuan Hu
1443a2e64c4SZhangZifei  // object VfpuType {
1453a2e64c4SZhangZifei  //   def dummy = 0.U(7.W)
1463a2e64c4SZhangZifei  // }
1477f2b7720SXuan Hu
1487f2b7720SXuan Hu  object VlduType {
14957a10886SXuan Hu    def dummy = 0.U
1507f2b7720SXuan Hu  }
1517f2b7720SXuan Hu
1527f2b7720SXuan Hu  object VstuType {
15357a10886SXuan Hu    def dummy = 0.U
1547f2b7720SXuan Hu  }
1557f2b7720SXuan Hu
156a3edac52SYinan Xu  object CommitType {
157c3abb8b6SYinan Xu    def NORMAL = "b000".U  // int/fp
158c3abb8b6SYinan Xu    def BRANCH = "b001".U  // branch
159c3abb8b6SYinan Xu    def LOAD   = "b010".U  // load
160c3abb8b6SYinan Xu    def STORE  = "b011".U  // store
161518d8658SYinan Xu
162c3abb8b6SYinan Xu    def apply() = UInt(3.W)
163c3abb8b6SYinan Xu    def isFused(commitType: UInt): Bool = commitType(2)
164c3abb8b6SYinan Xu    def isLoadStore(commitType: UInt): Bool = !isFused(commitType) && commitType(1)
165c3abb8b6SYinan Xu    def lsInstIsStore(commitType: UInt): Bool = commitType(0)
166c3abb8b6SYinan Xu    def isStore(commitType: UInt): Bool = isLoadStore(commitType) && lsInstIsStore(commitType)
167c3abb8b6SYinan Xu    def isBranch(commitType: UInt): Bool = commitType(0) && !commitType(1) && !isFused(commitType)
168518d8658SYinan Xu  }
169bfb958a3SYinan Xu
170bfb958a3SYinan Xu  object RedirectLevel {
1712d7c7105SYinan Xu    def flushAfter = "b0".U
1722d7c7105SYinan Xu    def flush      = "b1".U
173bfb958a3SYinan Xu
1742d7c7105SYinan Xu    def apply() = UInt(1.W)
1752d7c7105SYinan Xu    // def isUnconditional(level: UInt) = level(1)
176bfb958a3SYinan Xu    def flushItself(level: UInt) = level(0)
1772d7c7105SYinan Xu    // def isException(level: UInt) = level(1) && level(0)
178bfb958a3SYinan Xu  }
179baf8def6SYinan Xu
180baf8def6SYinan Xu  object ExceptionVec {
181baf8def6SYinan Xu    def apply() = Vec(16, Bool())
182baf8def6SYinan Xu  }
183a8e04b1dSYinan Xu
184c60c1ab4SWilliam Wang  object PMAMode {
1858d9a04fcSWilliam Wang    def R = "b1".U << 0 //readable
1868d9a04fcSWilliam Wang    def W = "b1".U << 1 //writeable
1878d9a04fcSWilliam Wang    def X = "b1".U << 2 //executable
1888d9a04fcSWilliam Wang    def I = "b1".U << 3 //cacheable: icache
1898d9a04fcSWilliam Wang    def D = "b1".U << 4 //cacheable: dcache
1908d9a04fcSWilliam Wang    def S = "b1".U << 5 //enable speculative access
191cff68e26SWilliam Wang    def A = "b1".U << 6 //enable atomic operation, A imply R & W
1928d9a04fcSWilliam Wang    def C = "b1".U << 7 //if it is cacheable is configable
193c60c1ab4SWilliam Wang    def Reserved = "b0".U
194c60c1ab4SWilliam Wang
195c60c1ab4SWilliam Wang    def apply() = UInt(7.W)
196c60c1ab4SWilliam Wang
197c60c1ab4SWilliam Wang    def read(mode: UInt) = mode(0)
198c60c1ab4SWilliam Wang    def write(mode: UInt) = mode(1)
199c60c1ab4SWilliam Wang    def execute(mode: UInt) = mode(2)
200c60c1ab4SWilliam Wang    def icache(mode: UInt) = mode(3)
201c60c1ab4SWilliam Wang    def dcache(mode: UInt) = mode(4)
202c60c1ab4SWilliam Wang    def speculate(mode: UInt) = mode(5)
203c60c1ab4SWilliam Wang    def atomic(mode: UInt) = mode(6)
204c60c1ab4SWilliam Wang    def configable_cache(mode: UInt) = mode(7)
205c60c1ab4SWilliam Wang
206c60c1ab4SWilliam Wang    def strToMode(s: String) = {
207423b9255SWilliam Wang      var result = 0.U(8.W)
208c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("R") >= 0) result = result + R
209c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("W") >= 0) result = result + W
210c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("X") >= 0) result = result + X
211c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("I") >= 0) result = result + I
212c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("D") >= 0) result = result + D
213c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("S") >= 0) result = result + S
214c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("A") >= 0) result = result + A
215c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("C") >= 0) result = result + C
216c60c1ab4SWilliam Wang      result
217c60c1ab4SWilliam Wang    }
218c60c1ab4SWilliam Wang  }
2192225d46eSJiawei Lin
2202225d46eSJiawei Lin
2212225d46eSJiawei Lin  object CSROpType {
2222225d46eSJiawei Lin    def jmp  = "b000".U
2232225d46eSJiawei Lin    def wrt  = "b001".U
2242225d46eSJiawei Lin    def set  = "b010".U
2252225d46eSJiawei Lin    def clr  = "b011".U
226b6900d94SYinan Xu    def wfi  = "b100".U
2272225d46eSJiawei Lin    def wrti = "b101".U
2282225d46eSJiawei Lin    def seti = "b110".U
2292225d46eSJiawei Lin    def clri = "b111".U
2305d669833SYinan Xu    def needAccess(op: UInt): Bool = op(1, 0) =/= 0.U
2312225d46eSJiawei Lin  }
2322225d46eSJiawei Lin
2332225d46eSJiawei Lin  // jump
2342225d46eSJiawei Lin  object JumpOpType {
2352225d46eSJiawei Lin    def jal  = "b00".U
2362225d46eSJiawei Lin    def jalr = "b01".U
2372225d46eSJiawei Lin    def auipc = "b10".U
2382225d46eSJiawei Lin//    def call = "b11_011".U
2392225d46eSJiawei Lin//    def ret  = "b11_100".U
2402225d46eSJiawei Lin    def jumpOpisJalr(op: UInt) = op(0)
2412225d46eSJiawei Lin    def jumpOpisAuipc(op: UInt) = op(1)
2422225d46eSJiawei Lin  }
2432225d46eSJiawei Lin
2442225d46eSJiawei Lin  object FenceOpType {
2452225d46eSJiawei Lin    def fence  = "b10000".U
2462225d46eSJiawei Lin    def sfence = "b10001".U
2472225d46eSJiawei Lin    def fencei = "b10010".U
248af2f7849Shappy-lx    def nofence= "b00000".U
2492225d46eSJiawei Lin  }
2502225d46eSJiawei Lin
2512225d46eSJiawei Lin  object ALUOpType {
252ee8ff153Szfw    // shift optype
253675acc68SYinan Xu    def slliuw     = "b000_0000".U // slliuw: ZEXT(src1[31:0]) << shamt
254675acc68SYinan Xu    def sll        = "b000_0001".U // sll:     src1 << src2
255ee8ff153Szfw
256675acc68SYinan Xu    def bclr       = "b000_0010".U // bclr:    src1 & ~(1 << src2[5:0])
257675acc68SYinan Xu    def bset       = "b000_0011".U // bset:    src1 | (1 << src2[5:0])
258675acc68SYinan Xu    def binv       = "b000_0100".U // binv:    src1 ^ ~(1 << src2[5:0])
259ee8ff153Szfw
260675acc68SYinan Xu    def srl        = "b000_0101".U // srl:     src1 >> src2
261675acc68SYinan Xu    def bext       = "b000_0110".U // bext:    (src1 >> src2)[0]
262675acc68SYinan Xu    def sra        = "b000_0111".U // sra:     src1 >> src2 (arithmetic)
263ee8ff153Szfw
2647b441e5eSYinan Xu    def rol        = "b000_1001".U // rol:     (src1 << src2) | (src1 >> (xlen - src2))
2657b441e5eSYinan Xu    def ror        = "b000_1011".U // ror:     (src1 >> src2) | (src1 << (xlen - src2))
266184a1958Szfw
267ee8ff153Szfw    // RV64 32bit optype
268675acc68SYinan Xu    def addw       = "b001_0000".U // addw:      SEXT((src1 + src2)[31:0])
269675acc68SYinan Xu    def oddaddw    = "b001_0001".U // oddaddw:   SEXT((src1[0] + src2)[31:0])
270675acc68SYinan Xu    def subw       = "b001_0010".U // subw:      SEXT((src1 - src2)[31:0])
271ee8ff153Szfw
272675acc68SYinan Xu    def addwbit    = "b001_0100".U // addwbit:   (src1 + src2)[0]
273675acc68SYinan Xu    def addwbyte   = "b001_0101".U // addwbyte:  (src1 + src2)[7:0]
274675acc68SYinan Xu    def addwzexth  = "b001_0110".U // addwzexth: ZEXT((src1  + src2)[15:0])
275675acc68SYinan Xu    def addwsexth  = "b001_0111".U // addwsexth: SEXT((src1  + src2)[15:0])
276ee8ff153Szfw
277675acc68SYinan Xu    def sllw       = "b001_1000".U // sllw:     SEXT((src1 << src2)[31:0])
278675acc68SYinan Xu    def srlw       = "b001_1001".U // srlw:     SEXT((src1[31:0] >> src2)[31:0])
279675acc68SYinan Xu    def sraw       = "b001_1010".U // sraw:     SEXT((src1[31:0] >> src2)[31:0])
280675acc68SYinan Xu    def rolw       = "b001_1100".U
281675acc68SYinan Xu    def rorw       = "b001_1101".U
282675acc68SYinan Xu
283675acc68SYinan Xu    // ADD-op
284675acc68SYinan Xu    def adduw      = "b010_0000".U // adduw:  src1[31:0]  + src2
285675acc68SYinan Xu    def add        = "b010_0001".U // add:     src1        + src2
286675acc68SYinan Xu    def oddadd     = "b010_0010".U // oddadd:  src1[0]     + src2
287675acc68SYinan Xu
288675acc68SYinan Xu    def sr29add    = "b010_0100".U // sr29add: src1[63:29] + src2
289675acc68SYinan Xu    def sr30add    = "b010_0101".U // sr30add: src1[63:30] + src2
290675acc68SYinan Xu    def sr31add    = "b010_0110".U // sr31add: src1[63:31] + src2
291675acc68SYinan Xu    def sr32add    = "b010_0111".U // sr32add: src1[63:32] + src2
292675acc68SYinan Xu
293675acc68SYinan Xu    def sh1adduw   = "b010_1000".U // sh1adduw: {src1[31:0], 1'b0} + src2
294675acc68SYinan Xu    def sh1add     = "b010_1001".U // sh1add: {src1[62:0], 1'b0} + src2
295675acc68SYinan Xu    def sh2adduw   = "b010_1010".U // sh2add_uw: {src1[31:0], 2'b0} + src2
296675acc68SYinan Xu    def sh2add     = "b010_1011".U // sh2add: {src1[61:0], 2'b0} + src2
297675acc68SYinan Xu    def sh3adduw   = "b010_1100".U // sh3add_uw: {src1[31:0], 3'b0} + src2
298675acc68SYinan Xu    def sh3add     = "b010_1101".U // sh3add: {src1[60:0], 3'b0} + src2
299675acc68SYinan Xu    def sh4add     = "b010_1111".U // sh4add: {src1[59:0], 4'b0} + src2
300675acc68SYinan Xu
301675acc68SYinan Xu    // SUB-op: src1 - src2
302675acc68SYinan Xu    def sub        = "b011_0000".U
303675acc68SYinan Xu    def sltu       = "b011_0001".U
304675acc68SYinan Xu    def slt        = "b011_0010".U
305675acc68SYinan Xu    def maxu       = "b011_0100".U
306675acc68SYinan Xu    def minu       = "b011_0101".U
307675acc68SYinan Xu    def max        = "b011_0110".U
308675acc68SYinan Xu    def min        = "b011_0111".U
309675acc68SYinan Xu
310675acc68SYinan Xu    // branch
311675acc68SYinan Xu    def beq        = "b111_0000".U
312675acc68SYinan Xu    def bne        = "b111_0010".U
313675acc68SYinan Xu    def blt        = "b111_1000".U
314675acc68SYinan Xu    def bge        = "b111_1010".U
315675acc68SYinan Xu    def bltu       = "b111_1100".U
316675acc68SYinan Xu    def bgeu       = "b111_1110".U
317675acc68SYinan Xu
318675acc68SYinan Xu    // misc optype
319675acc68SYinan Xu    def and        = "b100_0000".U
320675acc68SYinan Xu    def andn       = "b100_0001".U
321675acc68SYinan Xu    def or         = "b100_0010".U
322675acc68SYinan Xu    def orn        = "b100_0011".U
323675acc68SYinan Xu    def xor        = "b100_0100".U
324675acc68SYinan Xu    def xnor       = "b100_0101".U
325675acc68SYinan Xu    def orcb       = "b100_0110".U
326675acc68SYinan Xu
327675acc68SYinan Xu    def sextb      = "b100_1000".U
328675acc68SYinan Xu    def packh      = "b100_1001".U
329675acc68SYinan Xu    def sexth      = "b100_1010".U
330675acc68SYinan Xu    def packw      = "b100_1011".U
331675acc68SYinan Xu
332675acc68SYinan Xu    def revb       = "b101_0000".U
333675acc68SYinan Xu    def rev8       = "b101_0001".U
334675acc68SYinan Xu    def pack       = "b101_0010".U
335675acc68SYinan Xu    def orh48      = "b101_0011".U
336675acc68SYinan Xu
337675acc68SYinan Xu    def szewl1     = "b101_1000".U
338675acc68SYinan Xu    def szewl2     = "b101_1001".U
339675acc68SYinan Xu    def szewl3     = "b101_1010".U
340675acc68SYinan Xu    def byte2      = "b101_1011".U
341675acc68SYinan Xu
342675acc68SYinan Xu    def andlsb     = "b110_0000".U
343675acc68SYinan Xu    def andzexth   = "b110_0001".U
344675acc68SYinan Xu    def orlsb      = "b110_0010".U
345675acc68SYinan Xu    def orzexth    = "b110_0011".U
346675acc68SYinan Xu    def xorlsb     = "b110_0100".U
347675acc68SYinan Xu    def xorzexth   = "b110_0101".U
348675acc68SYinan Xu    def orcblsb    = "b110_0110".U
349675acc68SYinan Xu    def orcbzexth  = "b110_0111".U
3504aa9ed34Sfdy    def vsetvli1    = "b1000_0000".U
3514aa9ed34Sfdy    def vsetvli2    = "b1000_0100".U
3524aa9ed34Sfdy    def vsetvl1     = "b1000_0001".U
3534aa9ed34Sfdy    def vsetvl2     = "b1000_0101".U
3544aa9ed34Sfdy    def vsetivli1   = "b1000_0010".U
3554aa9ed34Sfdy    def vsetivli2   = "b1000_0110".U
356675acc68SYinan Xu
357675acc68SYinan Xu    def isAddw(func: UInt) = func(6, 4) === "b001".U && !func(3) && !func(1)
358675acc68SYinan Xu    def isSimpleLogic(func: UInt) = func(6, 4) === "b100".U && !func(0)
359675acc68SYinan Xu    def logicToLsb(func: UInt) = Cat("b110".U(3.W), func(3, 1), 0.U(1.W))
360675acc68SYinan Xu    def logicToZexth(func: UInt) = Cat("b110".U(3.W), func(3, 1), 1.U(1.W))
361675acc68SYinan Xu    def isBranch(func: UInt) = func(6, 4) === "b111".U
362675acc68SYinan Xu    def getBranchType(func: UInt) = func(3, 2)
363675acc68SYinan Xu    def isBranchInvert(func: UInt) = func(1)
3644aa9ed34Sfdy    def isVset(func: UInt) = func(7, 3) === "b1000_0".U
3654aa9ed34Sfdy    def isVsetvl(func: UInt) = isVset(func) && func(0)
3664aa9ed34Sfdy    def isVsetvli(func: UInt) = isVset(func) && !func(1, 0).orR
3674aa9ed34Sfdy    def vsetExchange(func: UInt) = Cat(func(7, 3), "b1".U, func(1, 0))
368675acc68SYinan Xu
36957a10886SXuan Hu    def apply() = UInt(FuOpTypeWidth.W)
3702225d46eSJiawei Lin  }
3712225d46eSJiawei Lin
3722225d46eSJiawei Lin  object MDUOpType {
3732225d46eSJiawei Lin    // mul
3742225d46eSJiawei Lin    // bit encoding: | type (2bit) | isWord(1bit) | opcode(2bit) |
3752225d46eSJiawei Lin    def mul    = "b00000".U
3762225d46eSJiawei Lin    def mulh   = "b00001".U
3772225d46eSJiawei Lin    def mulhsu = "b00010".U
3782225d46eSJiawei Lin    def mulhu  = "b00011".U
3792225d46eSJiawei Lin    def mulw   = "b00100".U
3802225d46eSJiawei Lin
38188825c5cSYinan Xu    def mulw7  = "b01100".U
38288825c5cSYinan Xu
3832225d46eSJiawei Lin    // div
3842225d46eSJiawei Lin    // bit encoding: | type (2bit) | isWord(1bit) | isSign(1bit) | opcode(1bit) |
38588825c5cSYinan Xu    def div    = "b10000".U
38688825c5cSYinan Xu    def divu   = "b10010".U
38788825c5cSYinan Xu    def rem    = "b10001".U
38888825c5cSYinan Xu    def remu   = "b10011".U
3892225d46eSJiawei Lin
39088825c5cSYinan Xu    def divw   = "b10100".U
39188825c5cSYinan Xu    def divuw  = "b10110".U
39288825c5cSYinan Xu    def remw   = "b10101".U
39388825c5cSYinan Xu    def remuw  = "b10111".U
3942225d46eSJiawei Lin
39588825c5cSYinan Xu    def isMul(op: UInt) = !op(4)
39688825c5cSYinan Xu    def isDiv(op: UInt) = op(4)
3972225d46eSJiawei Lin
3982225d46eSJiawei Lin    def isDivSign(op: UInt) = isDiv(op) && !op(1)
3992225d46eSJiawei Lin    def isW(op: UInt) = op(2)
4002225d46eSJiawei Lin    def isH(op: UInt) = (isDiv(op) && op(0)) || (isMul(op) && op(1, 0) =/= 0.U)
4012225d46eSJiawei Lin    def getMulOp(op: UInt) = op(1, 0)
4022225d46eSJiawei Lin  }
4032225d46eSJiawei Lin
4042225d46eSJiawei Lin  object LSUOpType {
405d200f594SWilliam Wang    // load pipeline
4062225d46eSJiawei Lin
407d200f594SWilliam Wang    // normal load
408d200f594SWilliam Wang    // Note: bit(1, 0) are size, DO NOT CHANGE
409d200f594SWilliam Wang    // bit encoding: | load 0 | is unsigned(1bit) | size(2bit) |
410d200f594SWilliam Wang    def lb       = "b0000".U
411d200f594SWilliam Wang    def lh       = "b0001".U
412d200f594SWilliam Wang    def lw       = "b0010".U
413d200f594SWilliam Wang    def ld       = "b0011".U
414d200f594SWilliam Wang    def lbu      = "b0100".U
415d200f594SWilliam Wang    def lhu      = "b0101".U
416d200f594SWilliam Wang    def lwu      = "b0110".U
417ca18a0b4SWilliam Wang
418d200f594SWilliam Wang    // Zicbop software prefetch
419d200f594SWilliam Wang    // bit encoding: | prefetch 1 | 0 | prefetch type (2bit) |
420d200f594SWilliam Wang    def prefetch_i = "b1000".U // TODO
421d200f594SWilliam Wang    def prefetch_r = "b1001".U
422d200f594SWilliam Wang    def prefetch_w = "b1010".U
423ca18a0b4SWilliam Wang
424d200f594SWilliam Wang    def isPrefetch(op: UInt): Bool = op(3)
425d200f594SWilliam Wang
426d200f594SWilliam Wang    // store pipeline
427d200f594SWilliam Wang    // normal store
428d200f594SWilliam Wang    // bit encoding: | store 00 | size(2bit) |
429d200f594SWilliam Wang    def sb       = "b0000".U
430d200f594SWilliam Wang    def sh       = "b0001".U
431d200f594SWilliam Wang    def sw       = "b0010".U
432d200f594SWilliam Wang    def sd       = "b0011".U
433d200f594SWilliam Wang
434d200f594SWilliam Wang    // l1 cache op
435d200f594SWilliam Wang    // bit encoding: | cbo_zero 01 | size(2bit) 11 |
436d200f594SWilliam Wang    def cbo_zero  = "b0111".U
437d200f594SWilliam Wang
438d200f594SWilliam Wang    // llc op
439d200f594SWilliam Wang    // bit encoding: | prefetch 11 | suboptype(2bit) |
440d200f594SWilliam Wang    def cbo_clean = "b1100".U
441d200f594SWilliam Wang    def cbo_flush = "b1101".U
442d200f594SWilliam Wang    def cbo_inval = "b1110".U
443d200f594SWilliam Wang
444d200f594SWilliam Wang    def isCbo(op: UInt): Bool = op(3, 2) === "b11".U
4452225d46eSJiawei Lin
4462225d46eSJiawei Lin    // atomics
4472225d46eSJiawei Lin    // bit(1, 0) are size
4482225d46eSJiawei Lin    // since atomics use a different fu type
4492225d46eSJiawei Lin    // so we can safely reuse other load/store's encodings
450d200f594SWilliam Wang    // bit encoding: | optype(4bit) | size (2bit) |
4512225d46eSJiawei Lin    def lr_w      = "b000010".U
4522225d46eSJiawei Lin    def sc_w      = "b000110".U
4532225d46eSJiawei Lin    def amoswap_w = "b001010".U
4542225d46eSJiawei Lin    def amoadd_w  = "b001110".U
4552225d46eSJiawei Lin    def amoxor_w  = "b010010".U
4562225d46eSJiawei Lin    def amoand_w  = "b010110".U
4572225d46eSJiawei Lin    def amoor_w   = "b011010".U
4582225d46eSJiawei Lin    def amomin_w  = "b011110".U
4592225d46eSJiawei Lin    def amomax_w  = "b100010".U
4602225d46eSJiawei Lin    def amominu_w = "b100110".U
4612225d46eSJiawei Lin    def amomaxu_w = "b101010".U
4622225d46eSJiawei Lin
4632225d46eSJiawei Lin    def lr_d      = "b000011".U
4642225d46eSJiawei Lin    def sc_d      = "b000111".U
4652225d46eSJiawei Lin    def amoswap_d = "b001011".U
4662225d46eSJiawei Lin    def amoadd_d  = "b001111".U
4672225d46eSJiawei Lin    def amoxor_d  = "b010011".U
4682225d46eSJiawei Lin    def amoand_d  = "b010111".U
4692225d46eSJiawei Lin    def amoor_d   = "b011011".U
4702225d46eSJiawei Lin    def amomin_d  = "b011111".U
4712225d46eSJiawei Lin    def amomax_d  = "b100011".U
4722225d46eSJiawei Lin    def amominu_d = "b100111".U
4732225d46eSJiawei Lin    def amomaxu_d = "b101011".U
474b6982e83SLemover
475b6982e83SLemover    def size(op: UInt) = op(1,0)
4762225d46eSJiawei Lin  }
4772225d46eSJiawei Lin
4783feeca58Szfw  object BKUOpType {
479ee8ff153Szfw
4803feeca58Szfw    def clmul       = "b000000".U
4813feeca58Szfw    def clmulh      = "b000001".U
4823feeca58Szfw    def clmulr      = "b000010".U
4833feeca58Szfw    def xpermn      = "b000100".U
4843feeca58Szfw    def xpermb      = "b000101".U
485ee8ff153Szfw
4863feeca58Szfw    def clz         = "b001000".U
4873feeca58Szfw    def clzw        = "b001001".U
4883feeca58Szfw    def ctz         = "b001010".U
4893feeca58Szfw    def ctzw        = "b001011".U
4903feeca58Szfw    def cpop        = "b001100".U
4913feeca58Szfw    def cpopw       = "b001101".U
49207596dc6Szfw
4933feeca58Szfw    // 01xxxx is reserve
4943feeca58Szfw    def aes64es     = "b100000".U
4953feeca58Szfw    def aes64esm    = "b100001".U
4963feeca58Szfw    def aes64ds     = "b100010".U
4973feeca58Szfw    def aes64dsm    = "b100011".U
4983feeca58Szfw    def aes64im     = "b100100".U
4993feeca58Szfw    def aes64ks1i   = "b100101".U
5003feeca58Szfw    def aes64ks2    = "b100110".U
5013feeca58Szfw
5023feeca58Szfw    // merge to two instruction sm4ks & sm4ed
50319bcce38SFawang Zhang    def sm4ed0      = "b101000".U
50419bcce38SFawang Zhang    def sm4ed1      = "b101001".U
50519bcce38SFawang Zhang    def sm4ed2      = "b101010".U
50619bcce38SFawang Zhang    def sm4ed3      = "b101011".U
50719bcce38SFawang Zhang    def sm4ks0      = "b101100".U
50819bcce38SFawang Zhang    def sm4ks1      = "b101101".U
50919bcce38SFawang Zhang    def sm4ks2      = "b101110".U
51019bcce38SFawang Zhang    def sm4ks3      = "b101111".U
5113feeca58Szfw
5123feeca58Szfw    def sha256sum0  = "b110000".U
5133feeca58Szfw    def sha256sum1  = "b110001".U
5143feeca58Szfw    def sha256sig0  = "b110010".U
5153feeca58Szfw    def sha256sig1  = "b110011".U
5163feeca58Szfw    def sha512sum0  = "b110100".U
5173feeca58Szfw    def sha512sum1  = "b110101".U
5183feeca58Szfw    def sha512sig0  = "b110110".U
5193feeca58Szfw    def sha512sig1  = "b110111".U
5203feeca58Szfw
5213feeca58Szfw    def sm3p0       = "b111000".U
5223feeca58Szfw    def sm3p1       = "b111001".U
523ee8ff153Szfw  }
524ee8ff153Szfw
5252225d46eSJiawei Lin  object BTBtype {
5262225d46eSJiawei Lin    def B = "b00".U  // branch
5272225d46eSJiawei Lin    def J = "b01".U  // jump
5282225d46eSJiawei Lin    def I = "b10".U  // indirect
5292225d46eSJiawei Lin    def R = "b11".U  // return
5302225d46eSJiawei Lin
5312225d46eSJiawei Lin    def apply() = UInt(2.W)
5322225d46eSJiawei Lin  }
5332225d46eSJiawei Lin
5342225d46eSJiawei Lin  object SelImm {
535ee8ff153Szfw    def IMM_X  = "b0111".U
536*66ce8f52Sczw    def IMM_S  = "b1110".U
537ee8ff153Szfw    def IMM_SB = "b0001".U
538ee8ff153Szfw    def IMM_U  = "b0010".U
539ee8ff153Szfw    def IMM_UJ = "b0011".U
540ee8ff153Szfw    def IMM_I  = "b0100".U
541ee8ff153Szfw    def IMM_Z  = "b0101".U
542ee8ff153Szfw    def INVALID_INSTR = "b0110".U
543ee8ff153Szfw    def IMM_B6 = "b1000".U
5442225d46eSJiawei Lin
54558c35d23Shuxuan0307    def IMM_OPIVIS = "b1001".U
54658c35d23Shuxuan0307    def IMM_OPIVIU = "b1010".U
547912e2179SXuan Hu    def IMM_VSETVLI   = "b1100".U
548912e2179SXuan Hu    def IMM_VSETIVLI  = "b1101".U
54958c35d23Shuxuan0307
55057a10886SXuan Hu    def X      = BitPat("b0000")
5516e7c9679Shuxuan0307
552ee8ff153Szfw    def apply() = UInt(4.W)
5532225d46eSJiawei Lin  }
5542225d46eSJiawei Lin
5556ab6918fSYinan Xu  object ExceptionNO {
5566ab6918fSYinan Xu    def instrAddrMisaligned = 0
5576ab6918fSYinan Xu    def instrAccessFault    = 1
5586ab6918fSYinan Xu    def illegalInstr        = 2
5596ab6918fSYinan Xu    def breakPoint          = 3
5606ab6918fSYinan Xu    def loadAddrMisaligned  = 4
5616ab6918fSYinan Xu    def loadAccessFault     = 5
5626ab6918fSYinan Xu    def storeAddrMisaligned = 6
5636ab6918fSYinan Xu    def storeAccessFault    = 7
5646ab6918fSYinan Xu    def ecallU              = 8
5656ab6918fSYinan Xu    def ecallS              = 9
5666ab6918fSYinan Xu    def ecallM              = 11
5676ab6918fSYinan Xu    def instrPageFault      = 12
5686ab6918fSYinan Xu    def loadPageFault       = 13
5696ab6918fSYinan Xu    // def singleStep          = 14
5706ab6918fSYinan Xu    def storePageFault      = 15
5716ab6918fSYinan Xu    def priorities = Seq(
5726ab6918fSYinan Xu      breakPoint, // TODO: different BP has different priority
5736ab6918fSYinan Xu      instrPageFault,
5746ab6918fSYinan Xu      instrAccessFault,
5756ab6918fSYinan Xu      illegalInstr,
5766ab6918fSYinan Xu      instrAddrMisaligned,
5776ab6918fSYinan Xu      ecallM, ecallS, ecallU,
578d880177dSYinan Xu      storeAddrMisaligned,
579d880177dSYinan Xu      loadAddrMisaligned,
5806ab6918fSYinan Xu      storePageFault,
5816ab6918fSYinan Xu      loadPageFault,
5826ab6918fSYinan Xu      storeAccessFault,
583d880177dSYinan Xu      loadAccessFault
5846ab6918fSYinan Xu    )
5856ab6918fSYinan Xu    def all = priorities.distinct.sorted
5866ab6918fSYinan Xu    def frontendSet = Seq(
5876ab6918fSYinan Xu      instrAddrMisaligned,
5886ab6918fSYinan Xu      instrAccessFault,
5896ab6918fSYinan Xu      illegalInstr,
5906ab6918fSYinan Xu      instrPageFault
5916ab6918fSYinan Xu    )
5926ab6918fSYinan Xu    def partialSelect(vec: Vec[Bool], select: Seq[Int]): Vec[Bool] = {
5936ab6918fSYinan Xu      val new_vec = Wire(ExceptionVec())
5946ab6918fSYinan Xu      new_vec.foreach(_ := false.B)
5956ab6918fSYinan Xu      select.foreach(i => new_vec(i) := vec(i))
5966ab6918fSYinan Xu      new_vec
5976ab6918fSYinan Xu    }
5986ab6918fSYinan Xu    def selectFrontend(vec: Vec[Bool]): Vec[Bool] = partialSelect(vec, frontendSet)
5996ab6918fSYinan Xu    def selectAll(vec: Vec[Bool]): Vec[Bool] = partialSelect(vec, ExceptionNO.all)
6006ab6918fSYinan Xu    def selectByFu(vec:Vec[Bool], fuConfig: FuConfig): Vec[Bool] =
6016ab6918fSYinan Xu      partialSelect(vec, fuConfig.exceptionOut)
6026ab6918fSYinan Xu    def selectByExu(vec:Vec[Bool], exuConfig: ExuConfig): Vec[Bool] =
6036ab6918fSYinan Xu      partialSelect(vec, exuConfig.exceptionOut)
6046ab6918fSYinan Xu    def selectByExu(vec:Vec[Bool], exuConfigs: Seq[ExuConfig]): Vec[Bool] =
6056ab6918fSYinan Xu      partialSelect(vec, exuConfigs.map(_.exceptionOut).reduce(_ ++ _).distinct.sorted)
6066ab6918fSYinan Xu  }
6076ab6918fSYinan Xu
6081c62c387SYinan Xu  def dividerGen(p: Parameters) = new DividerWrapper(p(XLen))(p)
609c3d7991bSJiawei Lin  def multiplierGen(p: Parameters) = new ArrayMultiplier(p(XLen) + 1)(p)
6102225d46eSJiawei Lin  def aluGen(p: Parameters) = new Alu()(p)
6113feeca58Szfw  def bkuGen(p: Parameters) = new Bku()(p)
6122225d46eSJiawei Lin  def jmpGen(p: Parameters) = new Jump()(p)
6132225d46eSJiawei Lin  def fenceGen(p: Parameters) = new Fence()(p)
6142225d46eSJiawei Lin  def csrGen(p: Parameters) = new CSR()(p)
6152225d46eSJiawei Lin  def i2fGen(p: Parameters) = new IntToFP()(p)
6162225d46eSJiawei Lin  def fmacGen(p: Parameters) = new FMA()(p)
6172225d46eSJiawei Lin  def f2iGen(p: Parameters) = new FPToInt()(p)
6182225d46eSJiawei Lin  def f2fGen(p: Parameters) = new FPToFP()(p)
6192225d46eSJiawei Lin  def fdivSqrtGen(p: Parameters) = new FDivSqrt()(p)
62085b4cd54SYinan Xu  def stdGen(p: Parameters) = new Std()(p)
6216ab6918fSYinan Xu  def mouDataGen(p: Parameters) = new Std()(p)
6226827759bSZhangZifei  def vipuGen(p: Parameters) = new VIPU()(p)
6232225d46eSJiawei Lin
6246cdd85d9SYinan Xu  def f2iSel(uop: MicroOp): Bool = {
6256cdd85d9SYinan Xu    uop.ctrl.rfWen
6262225d46eSJiawei Lin  }
6272225d46eSJiawei Lin
6286cdd85d9SYinan Xu  def i2fSel(uop: MicroOp): Bool = {
6296cdd85d9SYinan Xu    uop.ctrl.fpu.fromInt
6302225d46eSJiawei Lin  }
6312225d46eSJiawei Lin
6326cdd85d9SYinan Xu  def f2fSel(uop: MicroOp): Bool = {
6336cdd85d9SYinan Xu    val ctrl = uop.ctrl.fpu
6342225d46eSJiawei Lin    ctrl.fpWen && !ctrl.div && !ctrl.sqrt
6352225d46eSJiawei Lin  }
6362225d46eSJiawei Lin
6376cdd85d9SYinan Xu  def fdivSqrtSel(uop: MicroOp): Bool = {
6386cdd85d9SYinan Xu    val ctrl = uop.ctrl.fpu
6392225d46eSJiawei Lin    ctrl.div || ctrl.sqrt
6402225d46eSJiawei Lin  }
6412225d46eSJiawei Lin
6422225d46eSJiawei Lin  val aluCfg = FuConfig(
6431a0f06eeSYinan Xu    name = "alu",
6442225d46eSJiawei Lin    fuGen = aluGen,
6456cdd85d9SYinan Xu    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.alu,
6462225d46eSJiawei Lin    fuType = FuType.alu,
6472225d46eSJiawei Lin    numIntSrc = 2,
6482225d46eSJiawei Lin    numFpSrc = 0,
6492225d46eSJiawei Lin    writeIntRf = true,
6502225d46eSJiawei Lin    writeFpRf = false,
6512225d46eSJiawei Lin    hasRedirect = true,
6522225d46eSJiawei Lin  )
6532225d46eSJiawei Lin
6542225d46eSJiawei Lin  val jmpCfg = FuConfig(
6551a0f06eeSYinan Xu    name = "jmp",
6562225d46eSJiawei Lin    fuGen = jmpGen,
6576cdd85d9SYinan Xu    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.jmp,
6582225d46eSJiawei Lin    fuType = FuType.jmp,
6592225d46eSJiawei Lin    numIntSrc = 1,
6602225d46eSJiawei Lin    numFpSrc = 0,
6612225d46eSJiawei Lin    writeIntRf = true,
6622225d46eSJiawei Lin    writeFpRf = false,
6632225d46eSJiawei Lin    hasRedirect = true,
6642225d46eSJiawei Lin  )
6652225d46eSJiawei Lin
6662225d46eSJiawei Lin  val fenceCfg = FuConfig(
6671a0f06eeSYinan Xu    name = "fence",
6682225d46eSJiawei Lin    fuGen = fenceGen,
6696cdd85d9SYinan Xu    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.fence,
6706ab6918fSYinan Xu    FuType.fence, 2, 0, writeIntRf = false, writeFpRf = false,
671f1fe8698SLemover    latency = UncertainLatency(), exceptionOut = Seq(illegalInstr), // TODO: need rewrite latency structure, not just this value,
672f1fe8698SLemover    flushPipe = true
6732225d46eSJiawei Lin  )
6742225d46eSJiawei Lin
6752225d46eSJiawei Lin  val csrCfg = FuConfig(
6761a0f06eeSYinan Xu    name = "csr",
6772225d46eSJiawei Lin    fuGen = csrGen,
6786cdd85d9SYinan Xu    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.csr,
6792225d46eSJiawei Lin    fuType = FuType.csr,
6802225d46eSJiawei Lin    numIntSrc = 1,
6812225d46eSJiawei Lin    numFpSrc = 0,
6822225d46eSJiawei Lin    writeIntRf = true,
6832225d46eSJiawei Lin    writeFpRf = false,
6846ab6918fSYinan Xu    exceptionOut = Seq(illegalInstr, breakPoint, ecallU, ecallS, ecallM),
6856ab6918fSYinan Xu    flushPipe = true
6862225d46eSJiawei Lin  )
6872225d46eSJiawei Lin
6882225d46eSJiawei Lin  val i2fCfg = FuConfig(
6891a0f06eeSYinan Xu    name = "i2f",
6902225d46eSJiawei Lin    fuGen = i2fGen,
6912225d46eSJiawei Lin    fuSel = i2fSel,
6922225d46eSJiawei Lin    FuType.i2f,
6932225d46eSJiawei Lin    numIntSrc = 1,
6942225d46eSJiawei Lin    numFpSrc = 0,
6952225d46eSJiawei Lin    writeIntRf = false,
6962225d46eSJiawei Lin    writeFpRf = true,
6976ab6918fSYinan Xu    writeFflags = true,
698e174d629SJiawei Lin    latency = CertainLatency(2),
699e174d629SJiawei Lin    fastUopOut = true, fastImplemented = true
7002225d46eSJiawei Lin  )
7012225d46eSJiawei Lin
7022225d46eSJiawei Lin  val divCfg = FuConfig(
7031a0f06eeSYinan Xu    name = "div",
7042225d46eSJiawei Lin    fuGen = dividerGen,
70507596dc6Szfw    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.div,
7062225d46eSJiawei Lin    FuType.div,
7072225d46eSJiawei Lin    2,
7082225d46eSJiawei Lin    0,
7092225d46eSJiawei Lin    writeIntRf = true,
7102225d46eSJiawei Lin    writeFpRf = false,
711f83b578aSYinan Xu    latency = UncertainLatency(),
712f83b578aSYinan Xu    fastUopOut = true,
7131c62c387SYinan Xu    fastImplemented = true,
7145ee7cabeSYinan Xu    hasInputBuffer = (true, 4, true)
7152225d46eSJiawei Lin  )
7162225d46eSJiawei Lin
7172225d46eSJiawei Lin  val mulCfg = FuConfig(
7181a0f06eeSYinan Xu    name = "mul",
7192225d46eSJiawei Lin    fuGen = multiplierGen,
72007596dc6Szfw    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.mul,
7212225d46eSJiawei Lin    FuType.mul,
7222225d46eSJiawei Lin    2,
7232225d46eSJiawei Lin    0,
7242225d46eSJiawei Lin    writeIntRf = true,
7252225d46eSJiawei Lin    writeFpRf = false,
726b2482bc1SYinan Xu    latency = CertainLatency(2),
727f83b578aSYinan Xu    fastUopOut = true,
728b2482bc1SYinan Xu    fastImplemented = true
7292225d46eSJiawei Lin  )
7302225d46eSJiawei Lin
7313feeca58Szfw  val bkuCfg = FuConfig(
7323feeca58Szfw    name = "bku",
7333feeca58Szfw    fuGen = bkuGen,
7343feeca58Szfw    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.bku,
7353feeca58Szfw    fuType = FuType.bku,
736ee8ff153Szfw    numIntSrc = 2,
737ee8ff153Szfw    numFpSrc = 0,
738ee8ff153Szfw    writeIntRf = true,
739ee8ff153Szfw    writeFpRf = false,
740f83b578aSYinan Xu    latency = CertainLatency(1),
741f83b578aSYinan Xu    fastUopOut = true,
74207596dc6Szfw    fastImplemented = true
743ee8ff153Szfw )
744ee8ff153Szfw
7452225d46eSJiawei Lin  val fmacCfg = FuConfig(
7461a0f06eeSYinan Xu    name = "fmac",
7472225d46eSJiawei Lin    fuGen = fmacGen,
7480f038924SZhangZifei    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.fmac,
7496ab6918fSYinan Xu    FuType.fmac, 0, 3, writeIntRf = false, writeFpRf = true, writeFflags = true,
7504b65fc7eSJiawei Lin    latency = UncertainLatency(), fastUopOut = true, fastImplemented = true
7512225d46eSJiawei Lin  )
7522225d46eSJiawei Lin
7532225d46eSJiawei Lin  val f2iCfg = FuConfig(
7541a0f06eeSYinan Xu    name = "f2i",
7552225d46eSJiawei Lin    fuGen = f2iGen,
7562225d46eSJiawei Lin    fuSel = f2iSel,
7576ab6918fSYinan Xu    FuType.fmisc, 0, 1, writeIntRf = true, writeFpRf = false, writeFflags = true, latency = CertainLatency(2),
758b2482bc1SYinan Xu    fastUopOut = true, fastImplemented = true
7592225d46eSJiawei Lin  )
7602225d46eSJiawei Lin
7612225d46eSJiawei Lin  val f2fCfg = FuConfig(
7621a0f06eeSYinan Xu    name = "f2f",
7632225d46eSJiawei Lin    fuGen = f2fGen,
7642225d46eSJiawei Lin    fuSel = f2fSel,
7656ab6918fSYinan Xu    FuType.fmisc, 0, 1, writeIntRf = false, writeFpRf = true, writeFflags = true, latency = CertainLatency(2),
766b2482bc1SYinan Xu    fastUopOut = true, fastImplemented = true
7672225d46eSJiawei Lin  )
7682225d46eSJiawei Lin
7692225d46eSJiawei Lin  val fdivSqrtCfg = FuConfig(
7701a0f06eeSYinan Xu    name = "fdivSqrt",
7712225d46eSJiawei Lin    fuGen = fdivSqrtGen,
7722225d46eSJiawei Lin    fuSel = fdivSqrtSel,
7736ab6918fSYinan Xu    FuType.fDivSqrt, 0, 2, writeIntRf = false, writeFpRf = true, writeFflags = true, latency = UncertainLatency(),
774140aff85SYinan Xu    fastUopOut = true, fastImplemented = true, hasInputBuffer = (true, 8, true)
7752225d46eSJiawei Lin  )
7762225d46eSJiawei Lin
7772225d46eSJiawei Lin  val lduCfg = FuConfig(
7781a0f06eeSYinan Xu    "ldu",
7792225d46eSJiawei Lin    null, // DontCare
7802b4e8253SYinan Xu    (uop: MicroOp) => FuType.loadCanAccept(uop.ctrl.fuType),
7816ab6918fSYinan Xu    FuType.ldu, 1, 0, writeIntRf = true, writeFpRf = true,
7826ab6918fSYinan Xu    latency = UncertainLatency(),
7836ab6918fSYinan Xu    exceptionOut = Seq(loadAddrMisaligned, loadAccessFault, loadPageFault),
7846ab6918fSYinan Xu    flushPipe = true,
7856786cfb7SWilliam Wang    replayInst = true,
7866786cfb7SWilliam Wang    hasLoadError = true
7872225d46eSJiawei Lin  )
7882225d46eSJiawei Lin
78985b4cd54SYinan Xu  val staCfg = FuConfig(
7901a0f06eeSYinan Xu    "sta",
7912225d46eSJiawei Lin    null,
7922b4e8253SYinan Xu    (uop: MicroOp) => FuType.storeCanAccept(uop.ctrl.fuType),
7936ab6918fSYinan Xu    FuType.stu, 1, 0, writeIntRf = false, writeFpRf = false,
7946ab6918fSYinan Xu    latency = UncertainLatency(),
7956ab6918fSYinan Xu    exceptionOut = Seq(storeAddrMisaligned, storeAccessFault, storePageFault)
7962225d46eSJiawei Lin  )
7972225d46eSJiawei Lin
79885b4cd54SYinan Xu  val stdCfg = FuConfig(
7991a0f06eeSYinan Xu    "std",
8002b4e8253SYinan Xu    fuGen = stdGen, fuSel = (uop: MicroOp) => FuType.storeCanAccept(uop.ctrl.fuType), FuType.stu, 1, 1,
8016ab6918fSYinan Xu    writeIntRf = false, writeFpRf = false, latency = CertainLatency(1)
80285b4cd54SYinan Xu  )
80385b4cd54SYinan Xu
8042225d46eSJiawei Lin  val mouCfg = FuConfig(
8051a0f06eeSYinan Xu    "mou",
8062225d46eSJiawei Lin    null,
8072b4e8253SYinan Xu    (uop: MicroOp) => FuType.storeCanAccept(uop.ctrl.fuType),
8086ab6918fSYinan Xu    FuType.mou, 1, 0, writeIntRf = false, writeFpRf = false,
8096ab6918fSYinan Xu    latency = UncertainLatency(), exceptionOut = lduCfg.exceptionOut ++ staCfg.exceptionOut
8102b4e8253SYinan Xu  )
8112b4e8253SYinan Xu
8122b4e8253SYinan Xu  val mouDataCfg = FuConfig(
8132b4e8253SYinan Xu    "mou",
8142b4e8253SYinan Xu    mouDataGen,
8152b4e8253SYinan Xu    (uop: MicroOp) => FuType.storeCanAccept(uop.ctrl.fuType),
8166ab6918fSYinan Xu    FuType.mou, 1, 0, writeIntRf = false, writeFpRf = false,
8176ab6918fSYinan Xu    latency = UncertainLatency()
8182225d46eSJiawei Lin  )
8192225d46eSJiawei Lin
8206827759bSZhangZifei  val vipuCfg = FuConfig(
8216827759bSZhangZifei    name = "vipu",
8226827759bSZhangZifei    fuGen = vipuGen,
8236827759bSZhangZifei    fuSel = (uop: MicroOp) => FuType.vipu === uop.ctrl.fuType,
8246827759bSZhangZifei    fuType = FuType.vipu,
8256827759bSZhangZifei    numIntSrc = 0, numFpSrc = 0, writeIntRf = false, writeFpRf = false, writeFflags = false,
8266827759bSZhangZifei    numVecSrc = 2, writeVecRf = true,
8270f038924SZhangZifei    fastUopOut = false, // TODO: check
8286827759bSZhangZifei    fastImplemented = true, //TODO: check
8296827759bSZhangZifei  )
8306827759bSZhangZifei
831adb5df20SYinan Xu  val JumpExeUnitCfg = ExuConfig("JmpExeUnit", "Int", Seq(jmpCfg, i2fCfg), 2, Int.MaxValue)
832b6220f0dSLemover  val AluExeUnitCfg = ExuConfig("AluExeUnit", "Int", Seq(aluCfg), 0, Int.MaxValue)
833adb5df20SYinan Xu  val JumpCSRExeUnitCfg = ExuConfig("JmpCSRExeUnit", "Int", Seq(jmpCfg, csrCfg, fenceCfg, i2fCfg), 2, Int.MaxValue)
8343feeca58Szfw  val MulDivExeUnitCfg = ExuConfig("MulDivExeUnit", "Int", Seq(mulCfg, divCfg, bkuCfg), 1, Int.MaxValue)
8356827759bSZhangZifei  val FmacExeUnitCfg = ExuConfig("FmacExeUnit", "Fp", Seq(fmacCfg, vipuCfg), Int.MaxValue, 0)
8362225d46eSJiawei Lin  val FmiscExeUnitCfg = ExuConfig(
8372225d46eSJiawei Lin    "FmiscExeUnit",
838b6220f0dSLemover    "Fp",
8392225d46eSJiawei Lin    Seq(f2iCfg, f2fCfg, fdivSqrtCfg),
8402225d46eSJiawei Lin    Int.MaxValue, 1
8412225d46eSJiawei Lin  )
8422b4e8253SYinan Xu  val LdExeUnitCfg = ExuConfig("LoadExu", "Mem", Seq(lduCfg), wbIntPriority = 0, wbFpPriority = 0, extendsExu = false)
8432b4e8253SYinan Xu  val StaExeUnitCfg = ExuConfig("StaExu", "Mem", Seq(staCfg, mouCfg), wbIntPriority = Int.MaxValue, wbFpPriority = Int.MaxValue, extendsExu = false)
8442b4e8253SYinan Xu  val StdExeUnitCfg = ExuConfig("StdExu", "Mem", Seq(stdCfg, mouDataCfg), wbIntPriority = Int.MaxValue, wbFpPriority = Int.MaxValue, extendsExu = false)
84554034ccdSZhangZifei
846d16f4ea4SZhangZifei  // def jumpRSWrapperGen(p: Parameters) = new JumpRSWrapper()(p)
847d16f4ea4SZhangZifei  // def mulRSWrapperGen(p: Parameters) = new MulRSWrapper()(p)
848d16f4ea4SZhangZifei  // def loadRSWrapperGen(p: Parameters) = new LoadRSWrapper()(p)
849d16f4ea4SZhangZifei  // def stdRSWrapperGen(p: Parameters) = new StdRSWrapper()(p)
850d16f4ea4SZhangZifei  // def staRSWrapperGen(p: Parameters) = new StaRSWrapper()(p)
851d16f4ea4SZhangZifei  // def fmaRSWrapperGen(p: Parameters) = new FMARSWrapper()(p)
852d16f4ea4SZhangZifei  // def fmiscRSWrapperGen(p: Parameters) = new FMiscRSWrapper()(p)
85354034ccdSZhangZifei
854d16f4ea4SZhangZifei  val aluRSMod = new RSMod(
855d16f4ea4SZhangZifei    rsWrapperGen = (modGen: RSMod, p: Parameters) => new ALURSWrapper(modGen)(p),
856d16f4ea4SZhangZifei    rsGen = (a: RSParams, b: Parameters) => new ALURS(a)(b),
857d16f4ea4SZhangZifei    immExtractorGen = (src: Int, width: Int, p: Parameters) => new AluImmExtractor()(p)
858d16f4ea4SZhangZifei  )
859d16f4ea4SZhangZifei  val fmaRSMod = new RSMod(
860d16f4ea4SZhangZifei    rsWrapperGen = (modGen: RSMod, p: Parameters) => new FMARSWrapper(modGen)(p),
861d16f4ea4SZhangZifei    rsGen = (a: RSParams, b: Parameters) => new FMARS(a)(b),
862d16f4ea4SZhangZifei  )
863d16f4ea4SZhangZifei  val fmiscRSMod = new RSMod(
864d16f4ea4SZhangZifei    rsWrapperGen = (modGen: RSMod, p: Parameters) => new FMiscRSWrapper(modGen)(p),
865d16f4ea4SZhangZifei    rsGen = (a: RSParams, b: Parameters) => new FMiscRS(a)(b),
866d16f4ea4SZhangZifei  )
867d16f4ea4SZhangZifei  val jumpRSMod = new RSMod(
868d16f4ea4SZhangZifei    rsWrapperGen = (modGen: RSMod, p: Parameters) => new JumpRSWrapper(modGen)(p),
869d16f4ea4SZhangZifei    rsGen = (a: RSParams, b: Parameters) => new JumpRS(a)(b),
870d16f4ea4SZhangZifei    immExtractorGen = (src: Int, width: Int, p: Parameters) => new JumpImmExtractor()(p)
871d16f4ea4SZhangZifei  )
872d16f4ea4SZhangZifei  val loadRSMod = new RSMod(
873d16f4ea4SZhangZifei    rsWrapperGen = (modGen: RSMod, p: Parameters) => new LoadRSWrapper(modGen)(p),
874d16f4ea4SZhangZifei    rsGen = (a: RSParams, b: Parameters) => new LoadRS(a)(b),
875d16f4ea4SZhangZifei    immExtractorGen = (src: Int, width: Int, p: Parameters) => new LoadImmExtractor()(p)
876d16f4ea4SZhangZifei  )
877d16f4ea4SZhangZifei  val mulRSMod = new RSMod(
878d16f4ea4SZhangZifei    rsWrapperGen = (modGen: RSMod, p: Parameters) => new MulRSWrapper(modGen)(p),
879d16f4ea4SZhangZifei    rsGen = (a: RSParams, b: Parameters) => new MulRS(a)(b),
880d16f4ea4SZhangZifei    immExtractorGen = (src: Int, width: Int, p: Parameters) => new MduImmExtractor()(p)
881d16f4ea4SZhangZifei  )
882d16f4ea4SZhangZifei  val staRSMod = new RSMod(
883d16f4ea4SZhangZifei    rsWrapperGen = (modGen: RSMod, p: Parameters) => new StaRSWrapper(modGen)(p),
884d16f4ea4SZhangZifei    rsGen = (a: RSParams, b: Parameters) => new StaRS(a)(b),
885d16f4ea4SZhangZifei  )
886d16f4ea4SZhangZifei  val stdRSMod = new RSMod(
887d16f4ea4SZhangZifei    rsWrapperGen = (modGen: RSMod, p: Parameters) => new StdRSWrapper(modGen)(p),
888d16f4ea4SZhangZifei    rsGen = (a: RSParams, b: Parameters) => new StdRS(a)(b),
889d16f4ea4SZhangZifei  )
8909a2e6b8aSLinJiawei}
891