xref: /XiangShan/src/main/scala/xiangshan/package.scala (revision adf68ff35dc385804f293aa9189a95e612170c74)
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
49f062e05dSZhangZifei    def isNull(srcType: UInt) = !(isPcOrImm(srcType) || isReg(srcType) ||
50f062e05dSZhangZifei      isFp(srcType) || isVp(srcType))
51f062e05dSZhangZifei
521285b047SXuan Hu    def apply() = UInt(3.W)
539a2e6b8aSLinJiawei  }
549a2e6b8aSLinJiawei
559a2e6b8aSLinJiawei  object SrcState {
56100aa93cSYinan Xu    def busy    = "b0".U
57100aa93cSYinan Xu    def rdy     = "b1".U
58100aa93cSYinan Xu    // def specRdy = "b10".U // speculative ready, for future use
59100aa93cSYinan Xu    def apply() = UInt(1.W)
609a2e6b8aSLinJiawei  }
619a2e6b8aSLinJiawei
627f2b7720SXuan Hu  // Todo: Use OH instead
632225d46eSJiawei Lin  object FuType {
6457a10886SXuan Hu    def jmp          = "b00000".U
6557a10886SXuan Hu    def i2f          = "b00001".U
6657a10886SXuan Hu    def csr          = "b00010".U
6757a10886SXuan Hu    def alu          = "b00110".U
6857a10886SXuan Hu    def mul          = "b00100".U
6957a10886SXuan Hu    def div          = "b00101".U
7057a10886SXuan Hu    def fence        = "b00011".U
7157a10886SXuan Hu    def bku          = "b00111".U
72cafb3558SLinJiawei
7357a10886SXuan Hu    def fmac         = "b01000".U
7457a10886SXuan Hu    def fmisc        = "b01011".U
7557a10886SXuan Hu    def fDivSqrt     = "b01010".U
76cafb3558SLinJiawei
7757a10886SXuan Hu    def ldu          = "b01100".U
7857a10886SXuan Hu    def stu          = "b01101".U
7957a10886SXuan Hu    def mou          = "b01111".U // for amo, lr, sc, fence
8099e169c5Sczw
8157a10886SXuan Hu    def vipu         = "b10000".U
82*adf68ff3Sczw    def vimac        = "b10010".U // for VIMacU
83876aa65bSczw    def vialuF       = "b10001".U // for VIALU Fixed-Point instructions
8457a10886SXuan Hu    def vfpu         = "b11000".U
857f2b7720SXuan Hu    def vldu         = "b11100".U
867f2b7720SXuan Hu    def vstu         = "b11101".U
8799e169c5Sczw    def vppu         = "b11001".U // for Permutation Unit
8899e169c5Sczw    def X            = BitPat("b00000") // TODO: It may be a potential bug
896e7c9679Shuxuan0307
9099e169c5Sczw    def num = 19
912225d46eSJiawei Lin
929a2e6b8aSLinJiawei    def apply() = UInt(log2Up(num).W)
939a2e6b8aSLinJiawei
940f038924SZhangZifei    // TODO: Optimize FuTpye and its method
950f038924SZhangZifei    // FIXME: Vector FuType coding is not ready
960f038924SZhangZifei    def isVecExu(fuType: UInt) = fuType(4)
970f038924SZhangZifei    def isIntExu(fuType: UInt) = !isVecExu(fuType) && !fuType(3)
986ac289b3SLinJiawei    def isJumpExu(fuType: UInt) = fuType === jmp
990f038924SZhangZifei    def isFpExu(fuType: UInt) = !isVecExu(fuType) && (fuType(3, 2) === "b10".U)
1000f038924SZhangZifei    def isMemExu(fuType: UInt) = !isVecExu(fuType) && (fuType(3, 2) === "b11".U)
10192ab24ebSYinan Xu    def isLoadStore(fuType: UInt) = isMemExu(fuType) && !fuType(1)
10292ab24ebSYinan Xu    def isStoreExu(fuType: UInt) = isMemExu(fuType) && fuType(0)
1030f9d3717SYinan Xu    def isAMO(fuType: UInt) = fuType(1)
104af2f7849Shappy-lx    def isFence(fuType: UInt) = fuType === fence
105af2f7849Shappy-lx    def isSvinvalBegin(fuType: UInt, func: UInt, flush: Bool) = isFence(fuType) && func === FenceOpType.nofence && !flush
106af2f7849Shappy-lx    def isSvinval(fuType: UInt, func: UInt, flush: Bool) = isFence(fuType) && func === FenceOpType.sfence && !flush
107af2f7849Shappy-lx    def isSvinvalEnd(fuType: UInt, func: UInt, flush: Bool) = isFence(fuType) && func === FenceOpType.nofence && flush
10892ab24ebSYinan Xu
10992ab24ebSYinan Xu    def jmpCanAccept(fuType: UInt) = !fuType(2)
110ee8ff153Szfw    def mduCanAccept(fuType: UInt) = fuType(2) && !fuType(1) || fuType(2) && fuType(1) && fuType(0)
111ee8ff153Szfw    def aluCanAccept(fuType: UInt) = fuType(2) && fuType(1) && !fuType(0)
11292ab24ebSYinan Xu
11392ab24ebSYinan Xu    def fmacCanAccept(fuType: UInt) = !fuType(1)
11492ab24ebSYinan Xu    def fmiscCanAccept(fuType: UInt) = fuType(1)
11592ab24ebSYinan Xu
11692ab24ebSYinan Xu    def loadCanAccept(fuType: UInt) = !fuType(0)
11792ab24ebSYinan Xu    def storeCanAccept(fuType: UInt) = fuType(0)
11892ab24ebSYinan Xu
11992ab24ebSYinan Xu    def storeIsAMO(fuType: UInt) = fuType(1)
120cafb3558SLinJiawei
121cafb3558SLinJiawei    val functionNameMap = Map(
122cafb3558SLinJiawei      jmp.litValue() -> "jmp",
123ebb8ebf8SYinan Xu      i2f.litValue() -> "int_to_float",
124cafb3558SLinJiawei      csr.litValue() -> "csr",
125cafb3558SLinJiawei      alu.litValue() -> "alu",
126cafb3558SLinJiawei      mul.litValue() -> "mul",
127cafb3558SLinJiawei      div.litValue() -> "div",
128b8f08ca0SZhangZifei      fence.litValue() -> "fence",
1293feeca58Szfw      bku.litValue() -> "bku",
130cafb3558SLinJiawei      fmac.litValue() -> "fmac",
131cafb3558SLinJiawei      fmisc.litValue() -> "fmisc",
132d18dc7e6Swakafa      fDivSqrt.litValue() -> "fdiv_fsqrt",
133cafb3558SLinJiawei      ldu.litValue() -> "load",
134ebb8ebf8SYinan Xu      stu.litValue() -> "store",
135ebb8ebf8SYinan Xu      mou.litValue() -> "mou"
136cafb3558SLinJiawei    )
1379a2e6b8aSLinJiawei  }
1389a2e6b8aSLinJiawei
13957a10886SXuan Hu  def FuOpTypeWidth = 8
1402225d46eSJiawei Lin  object FuOpType {
14157a10886SXuan Hu    def apply() = UInt(FuOpTypeWidth.W)
14257a10886SXuan Hu    def X = BitPat("b00000000")
143ebd97ecbSzhanglinjuan  }
144518d8658SYinan Xu
1453a2e64c4SZhangZifei  // move VipuType and VfpuType into YunSuan/package.scala
1463a2e64c4SZhangZifei  // object VipuType {
1473a2e64c4SZhangZifei  //   def dummy = 0.U(7.W)
1483a2e64c4SZhangZifei  // }
1497f2b7720SXuan Hu
1503a2e64c4SZhangZifei  // object VfpuType {
1513a2e64c4SZhangZifei  //   def dummy = 0.U(7.W)
1523a2e64c4SZhangZifei  // }
1537f2b7720SXuan Hu
1547f2b7720SXuan Hu  object VlduType {
15557a10886SXuan Hu    def dummy = 0.U
1567f2b7720SXuan Hu  }
1577f2b7720SXuan Hu
1587f2b7720SXuan Hu  object VstuType {
15957a10886SXuan Hu    def dummy = 0.U
1607f2b7720SXuan Hu  }
1617f2b7720SXuan Hu
162a3edac52SYinan Xu  object CommitType {
163c3abb8b6SYinan Xu    def NORMAL = "b000".U  // int/fp
164c3abb8b6SYinan Xu    def BRANCH = "b001".U  // branch
165c3abb8b6SYinan Xu    def LOAD   = "b010".U  // load
166c3abb8b6SYinan Xu    def STORE  = "b011".U  // store
167518d8658SYinan Xu
168c3abb8b6SYinan Xu    def apply() = UInt(3.W)
169c3abb8b6SYinan Xu    def isFused(commitType: UInt): Bool = commitType(2)
170c3abb8b6SYinan Xu    def isLoadStore(commitType: UInt): Bool = !isFused(commitType) && commitType(1)
171c3abb8b6SYinan Xu    def lsInstIsStore(commitType: UInt): Bool = commitType(0)
172c3abb8b6SYinan Xu    def isStore(commitType: UInt): Bool = isLoadStore(commitType) && lsInstIsStore(commitType)
173c3abb8b6SYinan Xu    def isBranch(commitType: UInt): Bool = commitType(0) && !commitType(1) && !isFused(commitType)
174518d8658SYinan Xu  }
175bfb958a3SYinan Xu
176bfb958a3SYinan Xu  object RedirectLevel {
1772d7c7105SYinan Xu    def flushAfter = "b0".U
1782d7c7105SYinan Xu    def flush      = "b1".U
179bfb958a3SYinan Xu
1802d7c7105SYinan Xu    def apply() = UInt(1.W)
1812d7c7105SYinan Xu    // def isUnconditional(level: UInt) = level(1)
182bfb958a3SYinan Xu    def flushItself(level: UInt) = level(0)
1832d7c7105SYinan Xu    // def isException(level: UInt) = level(1) && level(0)
184bfb958a3SYinan Xu  }
185baf8def6SYinan Xu
186baf8def6SYinan Xu  object ExceptionVec {
187baf8def6SYinan Xu    def apply() = Vec(16, Bool())
188baf8def6SYinan Xu  }
189a8e04b1dSYinan Xu
190c60c1ab4SWilliam Wang  object PMAMode {
1918d9a04fcSWilliam Wang    def R = "b1".U << 0 //readable
1928d9a04fcSWilliam Wang    def W = "b1".U << 1 //writeable
1938d9a04fcSWilliam Wang    def X = "b1".U << 2 //executable
1948d9a04fcSWilliam Wang    def I = "b1".U << 3 //cacheable: icache
1958d9a04fcSWilliam Wang    def D = "b1".U << 4 //cacheable: dcache
1968d9a04fcSWilliam Wang    def S = "b1".U << 5 //enable speculative access
197cff68e26SWilliam Wang    def A = "b1".U << 6 //enable atomic operation, A imply R & W
1988d9a04fcSWilliam Wang    def C = "b1".U << 7 //if it is cacheable is configable
199c60c1ab4SWilliam Wang    def Reserved = "b0".U
200c60c1ab4SWilliam Wang
201c60c1ab4SWilliam Wang    def apply() = UInt(7.W)
202c60c1ab4SWilliam Wang
203c60c1ab4SWilliam Wang    def read(mode: UInt) = mode(0)
204c60c1ab4SWilliam Wang    def write(mode: UInt) = mode(1)
205c60c1ab4SWilliam Wang    def execute(mode: UInt) = mode(2)
206c60c1ab4SWilliam Wang    def icache(mode: UInt) = mode(3)
207c60c1ab4SWilliam Wang    def dcache(mode: UInt) = mode(4)
208c60c1ab4SWilliam Wang    def speculate(mode: UInt) = mode(5)
209c60c1ab4SWilliam Wang    def atomic(mode: UInt) = mode(6)
210c60c1ab4SWilliam Wang    def configable_cache(mode: UInt) = mode(7)
211c60c1ab4SWilliam Wang
212c60c1ab4SWilliam Wang    def strToMode(s: String) = {
213423b9255SWilliam Wang      var result = 0.U(8.W)
214c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("R") >= 0) result = result + R
215c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("W") >= 0) result = result + W
216c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("X") >= 0) result = result + X
217c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("I") >= 0) result = result + I
218c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("D") >= 0) result = result + D
219c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("S") >= 0) result = result + S
220c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("A") >= 0) result = result + A
221c60c1ab4SWilliam Wang      if (s.toUpperCase.indexOf("C") >= 0) result = result + C
222c60c1ab4SWilliam Wang      result
223c60c1ab4SWilliam Wang    }
224c60c1ab4SWilliam Wang  }
2252225d46eSJiawei Lin
2262225d46eSJiawei Lin
2272225d46eSJiawei Lin  object CSROpType {
2282225d46eSJiawei Lin    def jmp  = "b000".U
2292225d46eSJiawei Lin    def wrt  = "b001".U
2302225d46eSJiawei Lin    def set  = "b010".U
2312225d46eSJiawei Lin    def clr  = "b011".U
232b6900d94SYinan Xu    def wfi  = "b100".U
2332225d46eSJiawei Lin    def wrti = "b101".U
2342225d46eSJiawei Lin    def seti = "b110".U
2352225d46eSJiawei Lin    def clri = "b111".U
2365d669833SYinan Xu    def needAccess(op: UInt): Bool = op(1, 0) =/= 0.U
2372225d46eSJiawei Lin  }
2382225d46eSJiawei Lin
2392225d46eSJiawei Lin  // jump
2402225d46eSJiawei Lin  object JumpOpType {
2412225d46eSJiawei Lin    def jal  = "b00".U
2422225d46eSJiawei Lin    def jalr = "b01".U
2432225d46eSJiawei Lin    def auipc = "b10".U
2442225d46eSJiawei Lin//    def call = "b11_011".U
2452225d46eSJiawei Lin//    def ret  = "b11_100".U
2462225d46eSJiawei Lin    def jumpOpisJalr(op: UInt) = op(0)
2472225d46eSJiawei Lin    def jumpOpisAuipc(op: UInt) = op(1)
2482225d46eSJiawei Lin  }
2492225d46eSJiawei Lin
2502225d46eSJiawei Lin  object FenceOpType {
2512225d46eSJiawei Lin    def fence  = "b10000".U
2522225d46eSJiawei Lin    def sfence = "b10001".U
2532225d46eSJiawei Lin    def fencei = "b10010".U
254af2f7849Shappy-lx    def nofence= "b00000".U
2552225d46eSJiawei Lin  }
2562225d46eSJiawei Lin
2572225d46eSJiawei Lin  object ALUOpType {
258ee8ff153Szfw    // shift optype
259675acc68SYinan Xu    def slliuw     = "b000_0000".U // slliuw: ZEXT(src1[31:0]) << shamt
260675acc68SYinan Xu    def sll        = "b000_0001".U // sll:     src1 << src2
261ee8ff153Szfw
262675acc68SYinan Xu    def bclr       = "b000_0010".U // bclr:    src1 & ~(1 << src2[5:0])
263675acc68SYinan Xu    def bset       = "b000_0011".U // bset:    src1 | (1 << src2[5:0])
264675acc68SYinan Xu    def binv       = "b000_0100".U // binv:    src1 ^ ~(1 << src2[5:0])
265ee8ff153Szfw
266675acc68SYinan Xu    def srl        = "b000_0101".U // srl:     src1 >> src2
267675acc68SYinan Xu    def bext       = "b000_0110".U // bext:    (src1 >> src2)[0]
268675acc68SYinan Xu    def sra        = "b000_0111".U // sra:     src1 >> src2 (arithmetic)
269ee8ff153Szfw
2707b441e5eSYinan Xu    def rol        = "b000_1001".U // rol:     (src1 << src2) | (src1 >> (xlen - src2))
2717b441e5eSYinan Xu    def ror        = "b000_1011".U // ror:     (src1 >> src2) | (src1 << (xlen - src2))
272184a1958Szfw
273ee8ff153Szfw    // RV64 32bit optype
274675acc68SYinan Xu    def addw       = "b001_0000".U // addw:      SEXT((src1 + src2)[31:0])
275675acc68SYinan Xu    def oddaddw    = "b001_0001".U // oddaddw:   SEXT((src1[0] + src2)[31:0])
276675acc68SYinan Xu    def subw       = "b001_0010".U // subw:      SEXT((src1 - src2)[31:0])
277ee8ff153Szfw
278675acc68SYinan Xu    def addwbit    = "b001_0100".U // addwbit:   (src1 + src2)[0]
279675acc68SYinan Xu    def addwbyte   = "b001_0101".U // addwbyte:  (src1 + src2)[7:0]
280675acc68SYinan Xu    def addwzexth  = "b001_0110".U // addwzexth: ZEXT((src1  + src2)[15:0])
281675acc68SYinan Xu    def addwsexth  = "b001_0111".U // addwsexth: SEXT((src1  + src2)[15:0])
282ee8ff153Szfw
283675acc68SYinan Xu    def sllw       = "b001_1000".U // sllw:     SEXT((src1 << src2)[31:0])
284675acc68SYinan Xu    def srlw       = "b001_1001".U // srlw:     SEXT((src1[31:0] >> src2)[31:0])
285675acc68SYinan Xu    def sraw       = "b001_1010".U // sraw:     SEXT((src1[31:0] >> src2)[31:0])
286675acc68SYinan Xu    def rolw       = "b001_1100".U
287675acc68SYinan Xu    def rorw       = "b001_1101".U
288675acc68SYinan Xu
289675acc68SYinan Xu    // ADD-op
290675acc68SYinan Xu    def adduw      = "b010_0000".U // adduw:  src1[31:0]  + src2
291675acc68SYinan Xu    def add        = "b010_0001".U // add:     src1        + src2
292675acc68SYinan Xu    def oddadd     = "b010_0010".U // oddadd:  src1[0]     + src2
293675acc68SYinan Xu
294675acc68SYinan Xu    def sr29add    = "b010_0100".U // sr29add: src1[63:29] + src2
295675acc68SYinan Xu    def sr30add    = "b010_0101".U // sr30add: src1[63:30] + src2
296675acc68SYinan Xu    def sr31add    = "b010_0110".U // sr31add: src1[63:31] + src2
297675acc68SYinan Xu    def sr32add    = "b010_0111".U // sr32add: src1[63:32] + src2
298675acc68SYinan Xu
299675acc68SYinan Xu    def sh1adduw   = "b010_1000".U // sh1adduw: {src1[31:0], 1'b0} + src2
300675acc68SYinan Xu    def sh1add     = "b010_1001".U // sh1add: {src1[62:0], 1'b0} + src2
301675acc68SYinan Xu    def sh2adduw   = "b010_1010".U // sh2add_uw: {src1[31:0], 2'b0} + src2
302675acc68SYinan Xu    def sh2add     = "b010_1011".U // sh2add: {src1[61:0], 2'b0} + src2
303675acc68SYinan Xu    def sh3adduw   = "b010_1100".U // sh3add_uw: {src1[31:0], 3'b0} + src2
304675acc68SYinan Xu    def sh3add     = "b010_1101".U // sh3add: {src1[60:0], 3'b0} + src2
305675acc68SYinan Xu    def sh4add     = "b010_1111".U // sh4add: {src1[59:0], 4'b0} + src2
306675acc68SYinan Xu
307675acc68SYinan Xu    // SUB-op: src1 - src2
308675acc68SYinan Xu    def sub        = "b011_0000".U
309675acc68SYinan Xu    def sltu       = "b011_0001".U
310675acc68SYinan Xu    def slt        = "b011_0010".U
311675acc68SYinan Xu    def maxu       = "b011_0100".U
312675acc68SYinan Xu    def minu       = "b011_0101".U
313675acc68SYinan Xu    def max        = "b011_0110".U
314675acc68SYinan Xu    def min        = "b011_0111".U
315675acc68SYinan Xu
316675acc68SYinan Xu    // branch
317675acc68SYinan Xu    def beq        = "b111_0000".U
318675acc68SYinan Xu    def bne        = "b111_0010".U
319675acc68SYinan Xu    def blt        = "b111_1000".U
320675acc68SYinan Xu    def bge        = "b111_1010".U
321675acc68SYinan Xu    def bltu       = "b111_1100".U
322675acc68SYinan Xu    def bgeu       = "b111_1110".U
323675acc68SYinan Xu
324675acc68SYinan Xu    // misc optype
325675acc68SYinan Xu    def and        = "b100_0000".U
326675acc68SYinan Xu    def andn       = "b100_0001".U
327675acc68SYinan Xu    def or         = "b100_0010".U
328675acc68SYinan Xu    def orn        = "b100_0011".U
329675acc68SYinan Xu    def xor        = "b100_0100".U
330675acc68SYinan Xu    def xnor       = "b100_0101".U
331675acc68SYinan Xu    def orcb       = "b100_0110".U
332675acc68SYinan Xu
333675acc68SYinan Xu    def sextb      = "b100_1000".U
334675acc68SYinan Xu    def packh      = "b100_1001".U
335675acc68SYinan Xu    def sexth      = "b100_1010".U
336675acc68SYinan Xu    def packw      = "b100_1011".U
337675acc68SYinan Xu
338675acc68SYinan Xu    def revb       = "b101_0000".U
339675acc68SYinan Xu    def rev8       = "b101_0001".U
340675acc68SYinan Xu    def pack       = "b101_0010".U
341675acc68SYinan Xu    def orh48      = "b101_0011".U
342675acc68SYinan Xu
343675acc68SYinan Xu    def szewl1     = "b101_1000".U
344675acc68SYinan Xu    def szewl2     = "b101_1001".U
345675acc68SYinan Xu    def szewl3     = "b101_1010".U
346675acc68SYinan Xu    def byte2      = "b101_1011".U
347675acc68SYinan Xu
348675acc68SYinan Xu    def andlsb     = "b110_0000".U
349675acc68SYinan Xu    def andzexth   = "b110_0001".U
350675acc68SYinan Xu    def orlsb      = "b110_0010".U
351675acc68SYinan Xu    def orzexth    = "b110_0011".U
352675acc68SYinan Xu    def xorlsb     = "b110_0100".U
353675acc68SYinan Xu    def xorzexth   = "b110_0101".U
354675acc68SYinan Xu    def orcblsb    = "b110_0110".U
355675acc68SYinan Xu    def orcbzexth  = "b110_0111".U
3564aa9ed34Sfdy    def vsetvli1    = "b1000_0000".U
3574aa9ed34Sfdy    def vsetvli2    = "b1000_0100".U
3584aa9ed34Sfdy    def vsetvl1     = "b1000_0001".U
3594aa9ed34Sfdy    def vsetvl2     = "b1000_0101".U
3604aa9ed34Sfdy    def vsetivli1   = "b1000_0010".U
3614aa9ed34Sfdy    def vsetivli2   = "b1000_0110".U
362675acc68SYinan Xu
363675acc68SYinan Xu    def isAddw(func: UInt) = func(6, 4) === "b001".U && !func(3) && !func(1)
364675acc68SYinan Xu    def isSimpleLogic(func: UInt) = func(6, 4) === "b100".U && !func(0)
365675acc68SYinan Xu    def logicToLsb(func: UInt) = Cat("b110".U(3.W), func(3, 1), 0.U(1.W))
366675acc68SYinan Xu    def logicToZexth(func: UInt) = Cat("b110".U(3.W), func(3, 1), 1.U(1.W))
367675acc68SYinan Xu    def isBranch(func: UInt) = func(6, 4) === "b111".U
368675acc68SYinan Xu    def getBranchType(func: UInt) = func(3, 2)
369675acc68SYinan Xu    def isBranchInvert(func: UInt) = func(1)
3704aa9ed34Sfdy    def isVset(func: UInt) = func(7, 3) === "b1000_0".U
3714aa9ed34Sfdy    def isVsetvl(func: UInt) = isVset(func) && func(0)
3724aa9ed34Sfdy    def isVsetvli(func: UInt) = isVset(func) && !func(1, 0).orR
3734aa9ed34Sfdy    def vsetExchange(func: UInt) = Cat(func(7, 3), "b1".U, func(1, 0))
374675acc68SYinan Xu
37557a10886SXuan Hu    def apply() = UInt(FuOpTypeWidth.W)
3762225d46eSJiawei Lin  }
3772225d46eSJiawei Lin
3782225d46eSJiawei Lin  object MDUOpType {
3792225d46eSJiawei Lin    // mul
3802225d46eSJiawei Lin    // bit encoding: | type (2bit) | isWord(1bit) | opcode(2bit) |
3812225d46eSJiawei Lin    def mul    = "b00000".U
3822225d46eSJiawei Lin    def mulh   = "b00001".U
3832225d46eSJiawei Lin    def mulhsu = "b00010".U
3842225d46eSJiawei Lin    def mulhu  = "b00011".U
3852225d46eSJiawei Lin    def mulw   = "b00100".U
3862225d46eSJiawei Lin
38788825c5cSYinan Xu    def mulw7  = "b01100".U
38888825c5cSYinan Xu
3892225d46eSJiawei Lin    // div
3902225d46eSJiawei Lin    // bit encoding: | type (2bit) | isWord(1bit) | isSign(1bit) | opcode(1bit) |
39188825c5cSYinan Xu    def div    = "b10000".U
39288825c5cSYinan Xu    def divu   = "b10010".U
39388825c5cSYinan Xu    def rem    = "b10001".U
39488825c5cSYinan Xu    def remu   = "b10011".U
3952225d46eSJiawei Lin
39688825c5cSYinan Xu    def divw   = "b10100".U
39788825c5cSYinan Xu    def divuw  = "b10110".U
39888825c5cSYinan Xu    def remw   = "b10101".U
39988825c5cSYinan Xu    def remuw  = "b10111".U
4002225d46eSJiawei Lin
40188825c5cSYinan Xu    def isMul(op: UInt) = !op(4)
40288825c5cSYinan Xu    def isDiv(op: UInt) = op(4)
4032225d46eSJiawei Lin
4042225d46eSJiawei Lin    def isDivSign(op: UInt) = isDiv(op) && !op(1)
4052225d46eSJiawei Lin    def isW(op: UInt) = op(2)
4062225d46eSJiawei Lin    def isH(op: UInt) = (isDiv(op) && op(0)) || (isMul(op) && op(1, 0) =/= 0.U)
4072225d46eSJiawei Lin    def getMulOp(op: UInt) = op(1, 0)
4082225d46eSJiawei Lin  }
4092225d46eSJiawei Lin
4102225d46eSJiawei Lin  object LSUOpType {
411d200f594SWilliam Wang    // load pipeline
4122225d46eSJiawei Lin
413d200f594SWilliam Wang    // normal load
414d200f594SWilliam Wang    // Note: bit(1, 0) are size, DO NOT CHANGE
415d200f594SWilliam Wang    // bit encoding: | load 0 | is unsigned(1bit) | size(2bit) |
416d200f594SWilliam Wang    def lb       = "b0000".U
417d200f594SWilliam Wang    def lh       = "b0001".U
418d200f594SWilliam Wang    def lw       = "b0010".U
419d200f594SWilliam Wang    def ld       = "b0011".U
420d200f594SWilliam Wang    def lbu      = "b0100".U
421d200f594SWilliam Wang    def lhu      = "b0101".U
422d200f594SWilliam Wang    def lwu      = "b0110".U
423ca18a0b4SWilliam Wang
424d200f594SWilliam Wang    // Zicbop software prefetch
425d200f594SWilliam Wang    // bit encoding: | prefetch 1 | 0 | prefetch type (2bit) |
426d200f594SWilliam Wang    def prefetch_i = "b1000".U // TODO
427d200f594SWilliam Wang    def prefetch_r = "b1001".U
428d200f594SWilliam Wang    def prefetch_w = "b1010".U
429ca18a0b4SWilliam Wang
430d200f594SWilliam Wang    def isPrefetch(op: UInt): Bool = op(3)
431d200f594SWilliam Wang
432d200f594SWilliam Wang    // store pipeline
433d200f594SWilliam Wang    // normal store
434d200f594SWilliam Wang    // bit encoding: | store 00 | size(2bit) |
435d200f594SWilliam Wang    def sb       = "b0000".U
436d200f594SWilliam Wang    def sh       = "b0001".U
437d200f594SWilliam Wang    def sw       = "b0010".U
438d200f594SWilliam Wang    def sd       = "b0011".U
439d200f594SWilliam Wang
440d200f594SWilliam Wang    // l1 cache op
441d200f594SWilliam Wang    // bit encoding: | cbo_zero 01 | size(2bit) 11 |
442d200f594SWilliam Wang    def cbo_zero  = "b0111".U
443d200f594SWilliam Wang
444d200f594SWilliam Wang    // llc op
445d200f594SWilliam Wang    // bit encoding: | prefetch 11 | suboptype(2bit) |
446d200f594SWilliam Wang    def cbo_clean = "b1100".U
447d200f594SWilliam Wang    def cbo_flush = "b1101".U
448d200f594SWilliam Wang    def cbo_inval = "b1110".U
449d200f594SWilliam Wang
450d200f594SWilliam Wang    def isCbo(op: UInt): Bool = op(3, 2) === "b11".U
4512225d46eSJiawei Lin
4522225d46eSJiawei Lin    // atomics
4532225d46eSJiawei Lin    // bit(1, 0) are size
4542225d46eSJiawei Lin    // since atomics use a different fu type
4552225d46eSJiawei Lin    // so we can safely reuse other load/store's encodings
456d200f594SWilliam Wang    // bit encoding: | optype(4bit) | size (2bit) |
4572225d46eSJiawei Lin    def lr_w      = "b000010".U
4582225d46eSJiawei Lin    def sc_w      = "b000110".U
4592225d46eSJiawei Lin    def amoswap_w = "b001010".U
4602225d46eSJiawei Lin    def amoadd_w  = "b001110".U
4612225d46eSJiawei Lin    def amoxor_w  = "b010010".U
4622225d46eSJiawei Lin    def amoand_w  = "b010110".U
4632225d46eSJiawei Lin    def amoor_w   = "b011010".U
4642225d46eSJiawei Lin    def amomin_w  = "b011110".U
4652225d46eSJiawei Lin    def amomax_w  = "b100010".U
4662225d46eSJiawei Lin    def amominu_w = "b100110".U
4672225d46eSJiawei Lin    def amomaxu_w = "b101010".U
4682225d46eSJiawei Lin
4692225d46eSJiawei Lin    def lr_d      = "b000011".U
4702225d46eSJiawei Lin    def sc_d      = "b000111".U
4712225d46eSJiawei Lin    def amoswap_d = "b001011".U
4722225d46eSJiawei Lin    def amoadd_d  = "b001111".U
4732225d46eSJiawei Lin    def amoxor_d  = "b010011".U
4742225d46eSJiawei Lin    def amoand_d  = "b010111".U
4752225d46eSJiawei Lin    def amoor_d   = "b011011".U
4762225d46eSJiawei Lin    def amomin_d  = "b011111".U
4772225d46eSJiawei Lin    def amomax_d  = "b100011".U
4782225d46eSJiawei Lin    def amominu_d = "b100111".U
4792225d46eSJiawei Lin    def amomaxu_d = "b101011".U
480b6982e83SLemover
481b6982e83SLemover    def size(op: UInt) = op(1,0)
4822225d46eSJiawei Lin  }
4832225d46eSJiawei Lin
4843feeca58Szfw  object BKUOpType {
485ee8ff153Szfw
4863feeca58Szfw    def clmul       = "b000000".U
4873feeca58Szfw    def clmulh      = "b000001".U
4883feeca58Szfw    def clmulr      = "b000010".U
4893feeca58Szfw    def xpermn      = "b000100".U
4903feeca58Szfw    def xpermb      = "b000101".U
491ee8ff153Szfw
4923feeca58Szfw    def clz         = "b001000".U
4933feeca58Szfw    def clzw        = "b001001".U
4943feeca58Szfw    def ctz         = "b001010".U
4953feeca58Szfw    def ctzw        = "b001011".U
4963feeca58Szfw    def cpop        = "b001100".U
4973feeca58Szfw    def cpopw       = "b001101".U
49807596dc6Szfw
4993feeca58Szfw    // 01xxxx is reserve
5003feeca58Szfw    def aes64es     = "b100000".U
5013feeca58Szfw    def aes64esm    = "b100001".U
5023feeca58Szfw    def aes64ds     = "b100010".U
5033feeca58Szfw    def aes64dsm    = "b100011".U
5043feeca58Szfw    def aes64im     = "b100100".U
5053feeca58Szfw    def aes64ks1i   = "b100101".U
5063feeca58Szfw    def aes64ks2    = "b100110".U
5073feeca58Szfw
5083feeca58Szfw    // merge to two instruction sm4ks & sm4ed
50919bcce38SFawang Zhang    def sm4ed0      = "b101000".U
51019bcce38SFawang Zhang    def sm4ed1      = "b101001".U
51119bcce38SFawang Zhang    def sm4ed2      = "b101010".U
51219bcce38SFawang Zhang    def sm4ed3      = "b101011".U
51319bcce38SFawang Zhang    def sm4ks0      = "b101100".U
51419bcce38SFawang Zhang    def sm4ks1      = "b101101".U
51519bcce38SFawang Zhang    def sm4ks2      = "b101110".U
51619bcce38SFawang Zhang    def sm4ks3      = "b101111".U
5173feeca58Szfw
5183feeca58Szfw    def sha256sum0  = "b110000".U
5193feeca58Szfw    def sha256sum1  = "b110001".U
5203feeca58Szfw    def sha256sig0  = "b110010".U
5213feeca58Szfw    def sha256sig1  = "b110011".U
5223feeca58Szfw    def sha512sum0  = "b110100".U
5233feeca58Szfw    def sha512sum1  = "b110101".U
5243feeca58Szfw    def sha512sig0  = "b110110".U
5253feeca58Szfw    def sha512sig1  = "b110111".U
5263feeca58Szfw
5273feeca58Szfw    def sm3p0       = "b111000".U
5283feeca58Szfw    def sm3p1       = "b111001".U
529ee8ff153Szfw  }
530ee8ff153Szfw
5312225d46eSJiawei Lin  object BTBtype {
5322225d46eSJiawei Lin    def B = "b00".U  // branch
5332225d46eSJiawei Lin    def J = "b01".U  // jump
5342225d46eSJiawei Lin    def I = "b10".U  // indirect
5352225d46eSJiawei Lin    def R = "b11".U  // return
5362225d46eSJiawei Lin
5372225d46eSJiawei Lin    def apply() = UInt(2.W)
5382225d46eSJiawei Lin  }
5392225d46eSJiawei Lin
5402225d46eSJiawei Lin  object SelImm {
541ee8ff153Szfw    def IMM_X  = "b0111".U
54266ce8f52Sczw    def IMM_S  = "b1110".U
543ee8ff153Szfw    def IMM_SB = "b0001".U
544ee8ff153Szfw    def IMM_U  = "b0010".U
545ee8ff153Szfw    def IMM_UJ = "b0011".U
546ee8ff153Szfw    def IMM_I  = "b0100".U
547ee8ff153Szfw    def IMM_Z  = "b0101".U
548ee8ff153Szfw    def INVALID_INSTR = "b0110".U
549ee8ff153Szfw    def IMM_B6 = "b1000".U
5502225d46eSJiawei Lin
55158c35d23Shuxuan0307    def IMM_OPIVIS = "b1001".U
55258c35d23Shuxuan0307    def IMM_OPIVIU = "b1010".U
553912e2179SXuan Hu    def IMM_VSETVLI   = "b1100".U
554912e2179SXuan Hu    def IMM_VSETIVLI  = "b1101".U
55558c35d23Shuxuan0307
55657a10886SXuan Hu    def X      = BitPat("b0000")
5576e7c9679Shuxuan0307
558ee8ff153Szfw    def apply() = UInt(4.W)
5592225d46eSJiawei Lin  }
5602225d46eSJiawei Lin
561e2695e90SzhanglyGit  object UopSplitType {
562b238ab97SzhanglyGit    def SCA_SIM          = "b000000".U //
563b238ab97SzhanglyGit    def DIR              = "b010001".U // dirty: vset
564b238ab97SzhanglyGit    def VEC_VVV          = "b010010".U // VEC_VVV
565b238ab97SzhanglyGit    def VEC_VXV          = "b010011".U // VEC_VXV
566b238ab97SzhanglyGit    def VEC_0XV          = "b010100".U // VEC_0XV
567b238ab97SzhanglyGit    def VEC_VVW          = "b010101".U // VEC_VVW
568b238ab97SzhanglyGit    def VEC_WVW          = "b010110".U // VEC_WVW
569b238ab97SzhanglyGit    def VEC_VXW          = "b010111".U // VEC_VXW
570b238ab97SzhanglyGit    def VEC_WXW          = "b011000".U // VEC_WXW
571b238ab97SzhanglyGit    def VEC_WVV          = "b011001".U // VEC_WVV
572b238ab97SzhanglyGit    def VEC_WXV          = "b011010".U // VEC_WXV
573b238ab97SzhanglyGit    def VEC_EXT2         = "b011011".U // VF2 0 -> V
574b238ab97SzhanglyGit    def VEC_EXT4         = "b011100".U // VF4 0 -> V
575b238ab97SzhanglyGit    def VEC_EXT8         = "b011101".U // VF8 0 -> V
576b238ab97SzhanglyGit    def VEC_VVM          = "b011110".U // VEC_VVM
577b238ab97SzhanglyGit    def VEC_VXM          = "b011111".U // VEC_VXM
5784365a7a7Sczw    def VEC_SLIDE1UP     = "b100000".U // vslide1up.vx
5794365a7a7Sczw    def VEC_FSLIDE1UP    = "b100001".U // vfslide1up.vf
5804365a7a7Sczw    def VEC_SLIDE1DOWN   = "b100010".U // vslide1down.vx
5814365a7a7Sczw    def VEC_FSLIDE1DOWN  = "b100011".U // vfslide1down.vf
582b8298242Sczw    def VEC_VRED         = "b100100".U // VEC_VRED
583fbc24a91Sczw    def VEC_SLIDEUP      = "b100101".U // VEC_SLIDEUP
584fbc24a91Sczw    def VEC_ISLIDEUP     = "b100110".U // VEC_ISLIDEUP
585fbc24a91Sczw    def VEC_SLIDEDOWN    = "b100111".U // VEC_SLIDEDOWN
586fbc24a91Sczw    def VEC_ISLIDEDOWN   = "b101000".U // VEC_ISLIDEDOWN
5872b4b6de4Sczw    def VEC_M0X          = "b101001".U // VEC_M0X  0MV
5882b4b6de4Sczw    def VEC_MVV          = "b101010".U // VEC_MVV  VMV
5892b4b6de4Sczw    def VEC_M0X_VFIRST   = "b101011".U //
59084260280Sczw    def VEC_VWW          = "b101100".U //
59165df1368Sczw    def VEC_RGATHER      = "b101101".U // vrgather.vv, vrgather.vi
59265df1368Sczw    def VEC_RGATHER_VX   = "b101110".U // vrgather.vx
59365df1368Sczw    def VEC_RGATHEREI16  = "b101111".U // vrgatherei16.vv
594*adf68ff3Sczw    def VEC_COMPRESS     = "b110000".U // vcompress.vm
5952b4b6de4Sczw    def VEC_M0M          = "b000000".U // VEC_M0M
596b238ab97SzhanglyGit    def VEC_MMM          = "b000000".U // VEC_MMM
597b238ab97SzhanglyGit    def dummy     = "b111111".U
598acbea6c4SzhanglyGit
599b238ab97SzhanglyGit    def X = BitPat("b000000")
600acbea6c4SzhanglyGit
601b238ab97SzhanglyGit    def apply() = UInt(6.W)
602e2695e90SzhanglyGit    def needSplit(UopSplitType: UInt) = UopSplitType(4) || UopSplitType(5)
603acbea6c4SzhanglyGit  }
604acbea6c4SzhanglyGit
6056ab6918fSYinan Xu  object ExceptionNO {
6066ab6918fSYinan Xu    def instrAddrMisaligned = 0
6076ab6918fSYinan Xu    def instrAccessFault    = 1
6086ab6918fSYinan Xu    def illegalInstr        = 2
6096ab6918fSYinan Xu    def breakPoint          = 3
6106ab6918fSYinan Xu    def loadAddrMisaligned  = 4
6116ab6918fSYinan Xu    def loadAccessFault     = 5
6126ab6918fSYinan Xu    def storeAddrMisaligned = 6
6136ab6918fSYinan Xu    def storeAccessFault    = 7
6146ab6918fSYinan Xu    def ecallU              = 8
6156ab6918fSYinan Xu    def ecallS              = 9
6166ab6918fSYinan Xu    def ecallM              = 11
6176ab6918fSYinan Xu    def instrPageFault      = 12
6186ab6918fSYinan Xu    def loadPageFault       = 13
6196ab6918fSYinan Xu    // def singleStep          = 14
6206ab6918fSYinan Xu    def storePageFault      = 15
6216ab6918fSYinan Xu    def priorities = Seq(
6226ab6918fSYinan Xu      breakPoint, // TODO: different BP has different priority
6236ab6918fSYinan Xu      instrPageFault,
6246ab6918fSYinan Xu      instrAccessFault,
6256ab6918fSYinan Xu      illegalInstr,
6266ab6918fSYinan Xu      instrAddrMisaligned,
6276ab6918fSYinan Xu      ecallM, ecallS, ecallU,
628d880177dSYinan Xu      storeAddrMisaligned,
629d880177dSYinan Xu      loadAddrMisaligned,
6306ab6918fSYinan Xu      storePageFault,
6316ab6918fSYinan Xu      loadPageFault,
6326ab6918fSYinan Xu      storeAccessFault,
633d880177dSYinan Xu      loadAccessFault
6346ab6918fSYinan Xu    )
6356ab6918fSYinan Xu    def all = priorities.distinct.sorted
6366ab6918fSYinan Xu    def frontendSet = Seq(
6376ab6918fSYinan Xu      instrAddrMisaligned,
6386ab6918fSYinan Xu      instrAccessFault,
6396ab6918fSYinan Xu      illegalInstr,
6406ab6918fSYinan Xu      instrPageFault
6416ab6918fSYinan Xu    )
6426ab6918fSYinan Xu    def partialSelect(vec: Vec[Bool], select: Seq[Int]): Vec[Bool] = {
6436ab6918fSYinan Xu      val new_vec = Wire(ExceptionVec())
6446ab6918fSYinan Xu      new_vec.foreach(_ := false.B)
6456ab6918fSYinan Xu      select.foreach(i => new_vec(i) := vec(i))
6466ab6918fSYinan Xu      new_vec
6476ab6918fSYinan Xu    }
6486ab6918fSYinan Xu    def selectFrontend(vec: Vec[Bool]): Vec[Bool] = partialSelect(vec, frontendSet)
6496ab6918fSYinan Xu    def selectAll(vec: Vec[Bool]): Vec[Bool] = partialSelect(vec, ExceptionNO.all)
6506ab6918fSYinan Xu    def selectByFu(vec:Vec[Bool], fuConfig: FuConfig): Vec[Bool] =
6516ab6918fSYinan Xu      partialSelect(vec, fuConfig.exceptionOut)
6526ab6918fSYinan Xu    def selectByExu(vec:Vec[Bool], exuConfig: ExuConfig): Vec[Bool] =
6536ab6918fSYinan Xu      partialSelect(vec, exuConfig.exceptionOut)
6546ab6918fSYinan Xu    def selectByExu(vec:Vec[Bool], exuConfigs: Seq[ExuConfig]): Vec[Bool] =
6556ab6918fSYinan Xu      partialSelect(vec, exuConfigs.map(_.exceptionOut).reduce(_ ++ _).distinct.sorted)
6566ab6918fSYinan Xu  }
6576ab6918fSYinan Xu
6581c62c387SYinan Xu  def dividerGen(p: Parameters) = new DividerWrapper(p(XLen))(p)
659c3d7991bSJiawei Lin  def multiplierGen(p: Parameters) = new ArrayMultiplier(p(XLen) + 1)(p)
6602225d46eSJiawei Lin  def aluGen(p: Parameters) = new Alu()(p)
6613feeca58Szfw  def bkuGen(p: Parameters) = new Bku()(p)
6622225d46eSJiawei Lin  def jmpGen(p: Parameters) = new Jump()(p)
6632225d46eSJiawei Lin  def fenceGen(p: Parameters) = new Fence()(p)
6642225d46eSJiawei Lin  def csrGen(p: Parameters) = new CSR()(p)
6652225d46eSJiawei Lin  def i2fGen(p: Parameters) = new IntToFP()(p)
6662225d46eSJiawei Lin  def fmacGen(p: Parameters) = new FMA()(p)
6672225d46eSJiawei Lin  def f2iGen(p: Parameters) = new FPToInt()(p)
6682225d46eSJiawei Lin  def f2fGen(p: Parameters) = new FPToFP()(p)
6692225d46eSJiawei Lin  def fdivSqrtGen(p: Parameters) = new FDivSqrt()(p)
67085b4cd54SYinan Xu  def stdGen(p: Parameters) = new Std()(p)
6716ab6918fSYinan Xu  def mouDataGen(p: Parameters) = new Std()(p)
6726827759bSZhangZifei  def vipuGen(p: Parameters) = new VIPU()(p)
673*adf68ff3Sczw  def vimacGen(p: Parameters) = new VIMacU()(p)
674876aa65bSczw  def vialuFGen(p: Parameters) = new VIAluFix()(p)
675de9e1949Sczw  def vppuGen(p: Parameters) = new VPerm()(p)
67694c0d8cfSczw  def vfpuGen(p: Parameters) = new VFPU()(p)
6772225d46eSJiawei Lin
6786cdd85d9SYinan Xu  def f2iSel(uop: MicroOp): Bool = {
6796cdd85d9SYinan Xu    uop.ctrl.rfWen
6802225d46eSJiawei Lin  }
6812225d46eSJiawei Lin
6826cdd85d9SYinan Xu  def i2fSel(uop: MicroOp): Bool = {
6836cdd85d9SYinan Xu    uop.ctrl.fpu.fromInt
6842225d46eSJiawei Lin  }
6852225d46eSJiawei Lin
6866cdd85d9SYinan Xu  def f2fSel(uop: MicroOp): Bool = {
6876cdd85d9SYinan Xu    val ctrl = uop.ctrl.fpu
6882225d46eSJiawei Lin    ctrl.fpWen && !ctrl.div && !ctrl.sqrt
6892225d46eSJiawei Lin  }
6902225d46eSJiawei Lin
6916cdd85d9SYinan Xu  def fdivSqrtSel(uop: MicroOp): Bool = {
6926cdd85d9SYinan Xu    val ctrl = uop.ctrl.fpu
6932225d46eSJiawei Lin    ctrl.div || ctrl.sqrt
6942225d46eSJiawei Lin  }
6952225d46eSJiawei Lin
6962225d46eSJiawei Lin  val aluCfg = FuConfig(
6971a0f06eeSYinan Xu    name = "alu",
6982225d46eSJiawei Lin    fuGen = aluGen,
6996cdd85d9SYinan Xu    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.alu,
7002225d46eSJiawei Lin    fuType = FuType.alu,
7012225d46eSJiawei Lin    numIntSrc = 2,
7022225d46eSJiawei Lin    numFpSrc = 0,
7032225d46eSJiawei Lin    writeIntRf = true,
7042225d46eSJiawei Lin    writeFpRf = false,
7052225d46eSJiawei Lin    hasRedirect = true,
7062225d46eSJiawei Lin  )
7072225d46eSJiawei Lin
7082225d46eSJiawei Lin  val jmpCfg = FuConfig(
7091a0f06eeSYinan Xu    name = "jmp",
7102225d46eSJiawei Lin    fuGen = jmpGen,
7116cdd85d9SYinan Xu    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.jmp,
7122225d46eSJiawei Lin    fuType = FuType.jmp,
7132225d46eSJiawei Lin    numIntSrc = 1,
7142225d46eSJiawei Lin    numFpSrc = 0,
7152225d46eSJiawei Lin    writeIntRf = true,
7162225d46eSJiawei Lin    writeFpRf = false,
7172225d46eSJiawei Lin    hasRedirect = true,
7182225d46eSJiawei Lin  )
7192225d46eSJiawei Lin
7202225d46eSJiawei Lin  val fenceCfg = FuConfig(
7211a0f06eeSYinan Xu    name = "fence",
7222225d46eSJiawei Lin    fuGen = fenceGen,
7236cdd85d9SYinan Xu    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.fence,
7246ab6918fSYinan Xu    FuType.fence, 2, 0, writeIntRf = false, writeFpRf = false,
725f1fe8698SLemover    latency = UncertainLatency(), exceptionOut = Seq(illegalInstr), // TODO: need rewrite latency structure, not just this value,
726f1fe8698SLemover    flushPipe = true
7272225d46eSJiawei Lin  )
7282225d46eSJiawei Lin
7292225d46eSJiawei Lin  val csrCfg = FuConfig(
7301a0f06eeSYinan Xu    name = "csr",
7312225d46eSJiawei Lin    fuGen = csrGen,
7326cdd85d9SYinan Xu    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.csr,
7332225d46eSJiawei Lin    fuType = FuType.csr,
7342225d46eSJiawei Lin    numIntSrc = 1,
7352225d46eSJiawei Lin    numFpSrc = 0,
7362225d46eSJiawei Lin    writeIntRf = true,
7372225d46eSJiawei Lin    writeFpRf = false,
7386ab6918fSYinan Xu    exceptionOut = Seq(illegalInstr, breakPoint, ecallU, ecallS, ecallM),
7396ab6918fSYinan Xu    flushPipe = true
7402225d46eSJiawei Lin  )
7412225d46eSJiawei Lin
7422225d46eSJiawei Lin  val i2fCfg = FuConfig(
7431a0f06eeSYinan Xu    name = "i2f",
7442225d46eSJiawei Lin    fuGen = i2fGen,
7452225d46eSJiawei Lin    fuSel = i2fSel,
7462225d46eSJiawei Lin    FuType.i2f,
7472225d46eSJiawei Lin    numIntSrc = 1,
7482225d46eSJiawei Lin    numFpSrc = 0,
7492225d46eSJiawei Lin    writeIntRf = false,
7502225d46eSJiawei Lin    writeFpRf = true,
7516ab6918fSYinan Xu    writeFflags = true,
752e174d629SJiawei Lin    latency = CertainLatency(2),
753e174d629SJiawei Lin    fastUopOut = true, fastImplemented = true
7542225d46eSJiawei Lin  )
7552225d46eSJiawei Lin
7562225d46eSJiawei Lin  val divCfg = FuConfig(
7571a0f06eeSYinan Xu    name = "div",
7582225d46eSJiawei Lin    fuGen = dividerGen,
75907596dc6Szfw    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.div,
7602225d46eSJiawei Lin    FuType.div,
7612225d46eSJiawei Lin    2,
7622225d46eSJiawei Lin    0,
7632225d46eSJiawei Lin    writeIntRf = true,
7642225d46eSJiawei Lin    writeFpRf = false,
765f83b578aSYinan Xu    latency = UncertainLatency(),
766f83b578aSYinan Xu    fastUopOut = true,
7671c62c387SYinan Xu    fastImplemented = true,
7685ee7cabeSYinan Xu    hasInputBuffer = (true, 4, true)
7692225d46eSJiawei Lin  )
7702225d46eSJiawei Lin
7712225d46eSJiawei Lin  val mulCfg = FuConfig(
7721a0f06eeSYinan Xu    name = "mul",
7732225d46eSJiawei Lin    fuGen = multiplierGen,
77407596dc6Szfw    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.mul,
7752225d46eSJiawei Lin    FuType.mul,
7762225d46eSJiawei Lin    2,
7772225d46eSJiawei Lin    0,
7782225d46eSJiawei Lin    writeIntRf = true,
7792225d46eSJiawei Lin    writeFpRf = false,
780b2482bc1SYinan Xu    latency = CertainLatency(2),
781f83b578aSYinan Xu    fastUopOut = true,
782b2482bc1SYinan Xu    fastImplemented = true
7832225d46eSJiawei Lin  )
7842225d46eSJiawei Lin
7853feeca58Szfw  val bkuCfg = FuConfig(
7863feeca58Szfw    name = "bku",
7873feeca58Szfw    fuGen = bkuGen,
7883feeca58Szfw    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.bku,
7893feeca58Szfw    fuType = FuType.bku,
790ee8ff153Szfw    numIntSrc = 2,
791ee8ff153Szfw    numFpSrc = 0,
792ee8ff153Szfw    writeIntRf = true,
793ee8ff153Szfw    writeFpRf = false,
794f83b578aSYinan Xu    latency = CertainLatency(1),
795f83b578aSYinan Xu    fastUopOut = true,
79607596dc6Szfw    fastImplemented = true
797ee8ff153Szfw )
798ee8ff153Szfw
7992225d46eSJiawei Lin  val fmacCfg = FuConfig(
8001a0f06eeSYinan Xu    name = "fmac",
8012225d46eSJiawei Lin    fuGen = fmacGen,
8020f038924SZhangZifei    fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.fmac,
8036ab6918fSYinan Xu    FuType.fmac, 0, 3, writeIntRf = false, writeFpRf = true, writeFflags = true,
8044b65fc7eSJiawei Lin    latency = UncertainLatency(), fastUopOut = true, fastImplemented = true
8052225d46eSJiawei Lin  )
8062225d46eSJiawei Lin
8072225d46eSJiawei Lin  val f2iCfg = FuConfig(
8081a0f06eeSYinan Xu    name = "f2i",
8092225d46eSJiawei Lin    fuGen = f2iGen,
8102225d46eSJiawei Lin    fuSel = f2iSel,
8116ab6918fSYinan Xu    FuType.fmisc, 0, 1, writeIntRf = true, writeFpRf = false, writeFflags = true, latency = CertainLatency(2),
812b2482bc1SYinan Xu    fastUopOut = true, fastImplemented = true
8132225d46eSJiawei Lin  )
8142225d46eSJiawei Lin
8152225d46eSJiawei Lin  val f2fCfg = FuConfig(
8161a0f06eeSYinan Xu    name = "f2f",
8172225d46eSJiawei Lin    fuGen = f2fGen,
8182225d46eSJiawei Lin    fuSel = f2fSel,
8196ab6918fSYinan Xu    FuType.fmisc, 0, 1, writeIntRf = false, writeFpRf = true, writeFflags = true, latency = CertainLatency(2),
820b2482bc1SYinan Xu    fastUopOut = true, fastImplemented = true
8212225d46eSJiawei Lin  )
8222225d46eSJiawei Lin
8232225d46eSJiawei Lin  val fdivSqrtCfg = FuConfig(
8241a0f06eeSYinan Xu    name = "fdivSqrt",
8252225d46eSJiawei Lin    fuGen = fdivSqrtGen,
8262225d46eSJiawei Lin    fuSel = fdivSqrtSel,
8276ab6918fSYinan Xu    FuType.fDivSqrt, 0, 2, writeIntRf = false, writeFpRf = true, writeFflags = true, latency = UncertainLatency(),
828140aff85SYinan Xu    fastUopOut = true, fastImplemented = true, hasInputBuffer = (true, 8, true)
8292225d46eSJiawei Lin  )
8302225d46eSJiawei Lin
8312225d46eSJiawei Lin  val lduCfg = FuConfig(
8321a0f06eeSYinan Xu    "ldu",
8332225d46eSJiawei Lin    null, // DontCare
8342b4e8253SYinan Xu    (uop: MicroOp) => FuType.loadCanAccept(uop.ctrl.fuType),
8356ab6918fSYinan Xu    FuType.ldu, 1, 0, writeIntRf = true, writeFpRf = true,
8366ab6918fSYinan Xu    latency = UncertainLatency(),
8376ab6918fSYinan Xu    exceptionOut = Seq(loadAddrMisaligned, loadAccessFault, loadPageFault),
8386ab6918fSYinan Xu    flushPipe = true,
8396786cfb7SWilliam Wang    replayInst = true,
8406786cfb7SWilliam Wang    hasLoadError = true
8412225d46eSJiawei Lin  )
8422225d46eSJiawei Lin
84385b4cd54SYinan Xu  val staCfg = FuConfig(
8441a0f06eeSYinan Xu    "sta",
8452225d46eSJiawei Lin    null,
8462b4e8253SYinan Xu    (uop: MicroOp) => FuType.storeCanAccept(uop.ctrl.fuType),
8476ab6918fSYinan Xu    FuType.stu, 1, 0, writeIntRf = false, writeFpRf = false,
8486ab6918fSYinan Xu    latency = UncertainLatency(),
8496ab6918fSYinan Xu    exceptionOut = Seq(storeAddrMisaligned, storeAccessFault, storePageFault)
8502225d46eSJiawei Lin  )
8512225d46eSJiawei Lin
85285b4cd54SYinan Xu  val stdCfg = FuConfig(
8531a0f06eeSYinan Xu    "std",
8542b4e8253SYinan Xu    fuGen = stdGen, fuSel = (uop: MicroOp) => FuType.storeCanAccept(uop.ctrl.fuType), FuType.stu, 1, 1,
8556ab6918fSYinan Xu    writeIntRf = false, writeFpRf = false, latency = CertainLatency(1)
85685b4cd54SYinan Xu  )
85785b4cd54SYinan Xu
8582225d46eSJiawei Lin  val mouCfg = FuConfig(
8591a0f06eeSYinan Xu    "mou",
8602225d46eSJiawei Lin    null,
8612b4e8253SYinan Xu    (uop: MicroOp) => FuType.storeCanAccept(uop.ctrl.fuType),
8626ab6918fSYinan Xu    FuType.mou, 1, 0, writeIntRf = false, writeFpRf = false,
8636ab6918fSYinan Xu    latency = UncertainLatency(), exceptionOut = lduCfg.exceptionOut ++ staCfg.exceptionOut
8642b4e8253SYinan Xu  )
8652b4e8253SYinan Xu
8662b4e8253SYinan Xu  val mouDataCfg = FuConfig(
8672b4e8253SYinan Xu    "mou",
8682b4e8253SYinan Xu    mouDataGen,
8692b4e8253SYinan Xu    (uop: MicroOp) => FuType.storeCanAccept(uop.ctrl.fuType),
8706ab6918fSYinan Xu    FuType.mou, 1, 0, writeIntRf = false, writeFpRf = false,
8716ab6918fSYinan Xu    latency = UncertainLatency()
8722225d46eSJiawei Lin  )
8732225d46eSJiawei Lin
8746827759bSZhangZifei  val vipuCfg = FuConfig(
8756827759bSZhangZifei    name = "vipu",
8766827759bSZhangZifei    fuGen = vipuGen,
8776827759bSZhangZifei    fuSel = (uop: MicroOp) => FuType.vipu === uop.ctrl.fuType,
8786827759bSZhangZifei    fuType = FuType.vipu,
8796355a2b7Sczw    numIntSrc = 0, numFpSrc = 0, writeIntRf = false, writeFpRf = false, writeFflags = false, writeVxsat = true,
880822120dfSczw    numVecSrc = 4, writeVecRf = true,
8810f038924SZhangZifei    fastUopOut = false, // TODO: check
8826827759bSZhangZifei    fastImplemented = true, //TODO: check
8836827759bSZhangZifei  )
8846827759bSZhangZifei
885*adf68ff3Sczw  val vimacCfg = FuConfig(
886*adf68ff3Sczw    name = "vimac",
887*adf68ff3Sczw    fuGen = vimacGen,
888*adf68ff3Sczw    fuSel = (uop: MicroOp) => FuType.vimac === uop.ctrl.fuType,
889*adf68ff3Sczw    fuType = FuType.vimac,
890*adf68ff3Sczw    numIntSrc = 0, numFpSrc = 0, writeIntRf = false, writeFpRf = false, writeFflags = false, writeVxsat = true,
891*adf68ff3Sczw    numVecSrc = 4, writeVecRf = true,
892*adf68ff3Sczw    fastUopOut = false, // TODO: check
893*adf68ff3Sczw    fastImplemented = true, //TODO: check
894*adf68ff3Sczw  )
895*adf68ff3Sczw
896876aa65bSczw  val vialuFCfg = FuConfig(
897876aa65bSczw    name = "vialuF",
898876aa65bSczw    fuGen = vialuFGen,
899876aa65bSczw    fuSel = (uop: MicroOp) => FuType.vialuF === uop.ctrl.fuType,
900876aa65bSczw    fuType = FuType.vialuF,
901876aa65bSczw    numIntSrc = 0, numFpSrc = 0, writeIntRf = false, writeFpRf = false, writeFflags = false, writeVxsat = true,
902876aa65bSczw    numVecSrc = 4, writeVecRf = true,
903876aa65bSczw    fastUopOut = false, // TODO: check
904876aa65bSczw    fastImplemented = true, //TODO: check
905876aa65bSczw  )
906876aa65bSczw
90799e169c5Sczw  val vppuCfg = FuConfig(
90899e169c5Sczw    name = "vppu",
90999e169c5Sczw    fuGen = vppuGen,
91099e169c5Sczw    fuSel = (uop: MicroOp) => FuType.vppu === uop.ctrl.fuType,
91199e169c5Sczw    fuType = FuType.vppu,
91299e169c5Sczw    numIntSrc = 0, numFpSrc = 1, writeIntRf = false, writeFpRf = false, writeFflags = false,
91399e169c5Sczw    numVecSrc = 1, writeVecRf = true,
91499e169c5Sczw    fastUopOut = false, // TODO: check
91599e169c5Sczw    fastImplemented = true, //TODO: check
91699e169c5Sczw  )
91799e169c5Sczw
91894c0d8cfSczw  val vfpuCfg = FuConfig(
91994c0d8cfSczw    name = "vfpu",
92094c0d8cfSczw    fuGen = vfpuGen,
92194c0d8cfSczw    fuSel = (uop: MicroOp) => FuType.vfpu === uop.ctrl.fuType,
92294c0d8cfSczw    fuType = FuType.vfpu,
92394c0d8cfSczw    numIntSrc = 0, numFpSrc = 1, writeIntRf = false, writeFpRf = false, writeFflags = true,
924822120dfSczw    numVecSrc = 3, writeVecRf = true,
92594c0d8cfSczw    fastUopOut = false, // TODO: check
92694c0d8cfSczw    fastImplemented = true, //TODO: check
92794c0d8cfSczw    // latency = CertainLatency(2)
92894c0d8cfSczw  )
92994c0d8cfSczw
930adb5df20SYinan Xu  val JumpExeUnitCfg = ExuConfig("JmpExeUnit", "Int", Seq(jmpCfg, i2fCfg), 2, Int.MaxValue)
931b6220f0dSLemover  val AluExeUnitCfg = ExuConfig("AluExeUnit", "Int", Seq(aluCfg), 0, Int.MaxValue)
932adb5df20SYinan Xu  val JumpCSRExeUnitCfg = ExuConfig("JmpCSRExeUnit", "Int", Seq(jmpCfg, csrCfg, fenceCfg, i2fCfg), 2, Int.MaxValue)
9333feeca58Szfw  val MulDivExeUnitCfg = ExuConfig("MulDivExeUnit", "Int", Seq(mulCfg, divCfg, bkuCfg), 1, Int.MaxValue)
934*adf68ff3Sczw  val FmacExeUnitCfg = ExuConfig("FmacExeUnit", "Fp", Seq(fmacCfg, vipuCfg, vimacCfg, vppuCfg, vfpuCfg, vialuFCfg), Int.MaxValue, 0)
9352225d46eSJiawei Lin  val FmiscExeUnitCfg = ExuConfig(
9362225d46eSJiawei Lin    "FmiscExeUnit",
937b6220f0dSLemover    "Fp",
9382225d46eSJiawei Lin    Seq(f2iCfg, f2fCfg, fdivSqrtCfg),
9392225d46eSJiawei Lin    Int.MaxValue, 1
9402225d46eSJiawei Lin  )
9412b4e8253SYinan Xu  val LdExeUnitCfg = ExuConfig("LoadExu", "Mem", Seq(lduCfg), wbIntPriority = 0, wbFpPriority = 0, extendsExu = false)
9422b4e8253SYinan Xu  val StaExeUnitCfg = ExuConfig("StaExu", "Mem", Seq(staCfg, mouCfg), wbIntPriority = Int.MaxValue, wbFpPriority = Int.MaxValue, extendsExu = false)
9432b4e8253SYinan Xu  val StdExeUnitCfg = ExuConfig("StdExu", "Mem", Seq(stdCfg, mouDataCfg), wbIntPriority = Int.MaxValue, wbFpPriority = Int.MaxValue, extendsExu = false)
94454034ccdSZhangZifei
945d16f4ea4SZhangZifei  // def jumpRSWrapperGen(p: Parameters) = new JumpRSWrapper()(p)
946d16f4ea4SZhangZifei  // def mulRSWrapperGen(p: Parameters) = new MulRSWrapper()(p)
947d16f4ea4SZhangZifei  // def loadRSWrapperGen(p: Parameters) = new LoadRSWrapper()(p)
948d16f4ea4SZhangZifei  // def stdRSWrapperGen(p: Parameters) = new StdRSWrapper()(p)
949d16f4ea4SZhangZifei  // def staRSWrapperGen(p: Parameters) = new StaRSWrapper()(p)
950d16f4ea4SZhangZifei  // def fmaRSWrapperGen(p: Parameters) = new FMARSWrapper()(p)
951d16f4ea4SZhangZifei  // def fmiscRSWrapperGen(p: Parameters) = new FMiscRSWrapper()(p)
95254034ccdSZhangZifei
953d16f4ea4SZhangZifei  val aluRSMod = new RSMod(
954d16f4ea4SZhangZifei    rsWrapperGen = (modGen: RSMod, p: Parameters) => new ALURSWrapper(modGen)(p),
955d16f4ea4SZhangZifei    rsGen = (a: RSParams, b: Parameters) => new ALURS(a)(b),
956d16f4ea4SZhangZifei    immExtractorGen = (src: Int, width: Int, p: Parameters) => new AluImmExtractor()(p)
957d16f4ea4SZhangZifei  )
958d16f4ea4SZhangZifei  val fmaRSMod = new RSMod(
959d16f4ea4SZhangZifei    rsWrapperGen = (modGen: RSMod, p: Parameters) => new FMARSWrapper(modGen)(p),
960d16f4ea4SZhangZifei    rsGen = (a: RSParams, b: Parameters) => new FMARS(a)(b),
961d16f4ea4SZhangZifei  )
962d16f4ea4SZhangZifei  val fmiscRSMod = new RSMod(
963d16f4ea4SZhangZifei    rsWrapperGen = (modGen: RSMod, p: Parameters) => new FMiscRSWrapper(modGen)(p),
964d16f4ea4SZhangZifei    rsGen = (a: RSParams, b: Parameters) => new FMiscRS(a)(b),
965d16f4ea4SZhangZifei  )
966d16f4ea4SZhangZifei  val jumpRSMod = new RSMod(
967d16f4ea4SZhangZifei    rsWrapperGen = (modGen: RSMod, p: Parameters) => new JumpRSWrapper(modGen)(p),
968d16f4ea4SZhangZifei    rsGen = (a: RSParams, b: Parameters) => new JumpRS(a)(b),
969d16f4ea4SZhangZifei    immExtractorGen = (src: Int, width: Int, p: Parameters) => new JumpImmExtractor()(p)
970d16f4ea4SZhangZifei  )
971d16f4ea4SZhangZifei  val loadRSMod = new RSMod(
972d16f4ea4SZhangZifei    rsWrapperGen = (modGen: RSMod, p: Parameters) => new LoadRSWrapper(modGen)(p),
973d16f4ea4SZhangZifei    rsGen = (a: RSParams, b: Parameters) => new LoadRS(a)(b),
974d16f4ea4SZhangZifei    immExtractorGen = (src: Int, width: Int, p: Parameters) => new LoadImmExtractor()(p)
975d16f4ea4SZhangZifei  )
976d16f4ea4SZhangZifei  val mulRSMod = new RSMod(
977d16f4ea4SZhangZifei    rsWrapperGen = (modGen: RSMod, p: Parameters) => new MulRSWrapper(modGen)(p),
978d16f4ea4SZhangZifei    rsGen = (a: RSParams, b: Parameters) => new MulRS(a)(b),
979d16f4ea4SZhangZifei    immExtractorGen = (src: Int, width: Int, p: Parameters) => new MduImmExtractor()(p)
980d16f4ea4SZhangZifei  )
981d16f4ea4SZhangZifei  val staRSMod = new RSMod(
982d16f4ea4SZhangZifei    rsWrapperGen = (modGen: RSMod, p: Parameters) => new StaRSWrapper(modGen)(p),
983d16f4ea4SZhangZifei    rsGen = (a: RSParams, b: Parameters) => new StaRS(a)(b),
984d16f4ea4SZhangZifei  )
985d16f4ea4SZhangZifei  val stdRSMod = new RSMod(
986d16f4ea4SZhangZifei    rsWrapperGen = (modGen: RSMod, p: Parameters) => new StdRSWrapper(modGen)(p),
987d16f4ea4SZhangZifei    rsGen = (a: RSParams, b: Parameters) => new StdRS(a)(b),
988d16f4ea4SZhangZifei  )
9899a2e6b8aSLinJiawei}
990