1c6d43980SLemover/*************************************************************************************** 2c6d43980SLemover* Copyright (c) 2020-2021 Institute of Computing Technology, Chinese Academy of Sciences 3f320e0f0SYinan Xu* Copyright (c) 2020-2021 Peng Cheng Laboratory 4c6d43980SLemover* 5c6d43980SLemover* XiangShan is licensed under Mulan PSL v2. 6c6d43980SLemover* You can use this software according to the terms and conditions of the Mulan PSL v2. 7c6d43980SLemover* You may obtain a copy of Mulan PSL v2 at: 8c6d43980SLemover* http://license.coscl.org.cn/MulanPSL2 9c6d43980SLemover* 10c6d43980SLemover* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, 11c6d43980SLemover* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, 12c6d43980SLemover* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. 13c6d43980SLemover* 14c6d43980SLemover* See the Mulan PSL v2 for more details. 15c6d43980SLemover***************************************************************************************/ 16c6d43980SLemover 179a2e6b8aSLinJiaweiimport chisel3._ 189a2e6b8aSLinJiaweiimport chisel3.util._ 192225d46eSJiawei Linimport chipsalliance.rocketchip.config.Parameters 202225d46eSJiawei Linimport freechips.rocketchip.tile.XLen 216ab6918fSYinan Xuimport xiangshan.ExceptionNO._ 222225d46eSJiawei Linimport xiangshan.backend.fu._ 232225d46eSJiawei Linimport xiangshan.backend.fu.fpu._ 242225d46eSJiawei Linimport xiangshan.backend.exu._ 256ab6918fSYinan Xuimport xiangshan.backend.Std 262225d46eSJiawei Lin 279a2e6b8aSLinJiaweipackage object xiangshan { 289ee9f926SYikeZhou object SrcType { 299a2e6b8aSLinJiawei def reg = "b00".U 309a2e6b8aSLinJiawei def pc = "b01".U 319a2e6b8aSLinJiawei def imm = "b01".U 329a2e6b8aSLinJiawei def fp = "b10".U 3304b56283SZhangZifei 341a3df1feSYikeZhou def DC = imm // Don't Care 356e7c9679Shuxuan0307 def X = BitPat("b??") 364d24c305SYikeZhou 3704b56283SZhangZifei def isReg(srcType: UInt) = srcType===reg 3804b56283SZhangZifei def isPc(srcType: UInt) = srcType===pc 3904b56283SZhangZifei def isImm(srcType: UInt) = srcType===imm 402b4e8253SYinan Xu def isFp(srcType: UInt) = srcType(1) 41c9ebdf90SYinan Xu def isPcOrImm(srcType: UInt) = srcType(0) 422b4e8253SYinan Xu def isRegOrFp(srcType: UInt) = !srcType(0) 43c9ebdf90SYinan Xu def regIsFp(srcType: UInt) = srcType(1) 4404b56283SZhangZifei 459a2e6b8aSLinJiawei def apply() = UInt(2.W) 469a2e6b8aSLinJiawei } 479a2e6b8aSLinJiawei 489a2e6b8aSLinJiawei object SrcState { 49100aa93cSYinan Xu def busy = "b0".U 50100aa93cSYinan Xu def rdy = "b1".U 51100aa93cSYinan Xu // def specRdy = "b10".U // speculative ready, for future use 52100aa93cSYinan Xu def apply() = UInt(1.W) 539a2e6b8aSLinJiawei } 549a2e6b8aSLinJiawei 552225d46eSJiawei Lin object FuType { 56cafb3558SLinJiawei def jmp = "b0000".U 57cafb3558SLinJiawei def i2f = "b0001".U 58cafb3558SLinJiawei def csr = "b0010".U 59975b9ea3SYinan Xu def alu = "b0110".U 60cafb3558SLinJiawei def mul = "b0100".U 61cafb3558SLinJiawei def div = "b0101".U 62975b9ea3SYinan Xu def fence = "b0011".U 633feeca58Szfw def bku = "b0111".U 64cafb3558SLinJiawei 65cafb3558SLinJiawei def fmac = "b1000".U 6692ab24ebSYinan Xu def fmisc = "b1011".U 67cafb3558SLinJiawei def fDivSqrt = "b1010".U 68cafb3558SLinJiawei 69cafb3558SLinJiawei def ldu = "b1100".U 70cafb3558SLinJiawei def stu = "b1101".U 7192ab24ebSYinan Xu def mou = "b1111".U // for amo, lr, sc, fence 729a2e6b8aSLinJiawei 736e7c9679Shuxuan0307 def X = BitPat("b????") 746e7c9679Shuxuan0307 75ee8ff153Szfw def num = 14 762225d46eSJiawei Lin 779a2e6b8aSLinJiawei def apply() = UInt(log2Up(num).W) 789a2e6b8aSLinJiawei 79cafb3558SLinJiawei def isIntExu(fuType: UInt) = !fuType(3) 806ac289b3SLinJiawei def isJumpExu(fuType: UInt) = fuType === jmp 81cafb3558SLinJiawei def isFpExu(fuType: UInt) = fuType(3, 2) === "b10".U 82cafb3558SLinJiawei def isMemExu(fuType: UInt) = fuType(3, 2) === "b11".U 8392ab24ebSYinan Xu def isLoadStore(fuType: UInt) = isMemExu(fuType) && !fuType(1) 8492ab24ebSYinan Xu def isStoreExu(fuType: UInt) = isMemExu(fuType) && fuType(0) 850f9d3717SYinan Xu def isAMO(fuType: UInt) = fuType(1) 86af2f7849Shappy-lx def isFence(fuType: UInt) = fuType === fence 87af2f7849Shappy-lx def isSvinvalBegin(fuType: UInt, func: UInt, flush: Bool) = isFence(fuType) && func === FenceOpType.nofence && !flush 88af2f7849Shappy-lx def isSvinval(fuType: UInt, func: UInt, flush: Bool) = isFence(fuType) && func === FenceOpType.sfence && !flush 89af2f7849Shappy-lx def isSvinvalEnd(fuType: UInt, func: UInt, flush: Bool) = isFence(fuType) && func === FenceOpType.nofence && flush 90af2f7849Shappy-lx 9192ab24ebSYinan Xu 9292ab24ebSYinan Xu def jmpCanAccept(fuType: UInt) = !fuType(2) 93ee8ff153Szfw def mduCanAccept(fuType: UInt) = fuType(2) && !fuType(1) || fuType(2) && fuType(1) && fuType(0) 94ee8ff153Szfw def aluCanAccept(fuType: UInt) = fuType(2) && fuType(1) && !fuType(0) 9592ab24ebSYinan Xu 9692ab24ebSYinan Xu def fmacCanAccept(fuType: UInt) = !fuType(1) 9792ab24ebSYinan Xu def fmiscCanAccept(fuType: UInt) = fuType(1) 9892ab24ebSYinan Xu 9992ab24ebSYinan Xu def loadCanAccept(fuType: UInt) = !fuType(0) 10092ab24ebSYinan Xu def storeCanAccept(fuType: UInt) = fuType(0) 10192ab24ebSYinan Xu 10292ab24ebSYinan Xu def storeIsAMO(fuType: UInt) = fuType(1) 103cafb3558SLinJiawei 104cafb3558SLinJiawei val functionNameMap = Map( 105cafb3558SLinJiawei jmp.litValue() -> "jmp", 106ebb8ebf8SYinan Xu i2f.litValue() -> "int_to_float", 107cafb3558SLinJiawei csr.litValue() -> "csr", 108cafb3558SLinJiawei alu.litValue() -> "alu", 109cafb3558SLinJiawei mul.litValue() -> "mul", 110cafb3558SLinJiawei div.litValue() -> "div", 111b8f08ca0SZhangZifei fence.litValue() -> "fence", 1123feeca58Szfw bku.litValue() -> "bku", 113cafb3558SLinJiawei fmac.litValue() -> "fmac", 114cafb3558SLinJiawei fmisc.litValue() -> "fmisc", 115d18dc7e6Swakafa fDivSqrt.litValue() -> "fdiv_fsqrt", 116cafb3558SLinJiawei ldu.litValue() -> "load", 117ebb8ebf8SYinan Xu stu.litValue() -> "store", 118ebb8ebf8SYinan Xu mou.litValue() -> "mou" 119cafb3558SLinJiawei ) 1209a2e6b8aSLinJiawei } 1219a2e6b8aSLinJiawei 1222225d46eSJiawei Lin object FuOpType { 123675acc68SYinan Xu def apply() = UInt(7.W) 124361e6d51SJiuyang Liu def X = BitPat("b???????") 125ebd97ecbSzhanglinjuan } 126518d8658SYinan Xu 127a3edac52SYinan Xu object CommitType { 128c3abb8b6SYinan Xu def NORMAL = "b000".U // int/fp 129c3abb8b6SYinan Xu def BRANCH = "b001".U // branch 130c3abb8b6SYinan Xu def LOAD = "b010".U // load 131c3abb8b6SYinan Xu def STORE = "b011".U // store 132518d8658SYinan Xu 133c3abb8b6SYinan Xu def apply() = UInt(3.W) 134c3abb8b6SYinan Xu def isFused(commitType: UInt): Bool = commitType(2) 135c3abb8b6SYinan Xu def isLoadStore(commitType: UInt): Bool = !isFused(commitType) && commitType(1) 136c3abb8b6SYinan Xu def lsInstIsStore(commitType: UInt): Bool = commitType(0) 137c3abb8b6SYinan Xu def isStore(commitType: UInt): Bool = isLoadStore(commitType) && lsInstIsStore(commitType) 138c3abb8b6SYinan Xu def isBranch(commitType: UInt): Bool = commitType(0) && !commitType(1) && !isFused(commitType) 139518d8658SYinan Xu } 140bfb958a3SYinan Xu 141bfb958a3SYinan Xu object RedirectLevel { 1422d7c7105SYinan Xu def flushAfter = "b0".U 1432d7c7105SYinan Xu def flush = "b1".U 144bfb958a3SYinan Xu 1452d7c7105SYinan Xu def apply() = UInt(1.W) 1462d7c7105SYinan Xu // def isUnconditional(level: UInt) = level(1) 147bfb958a3SYinan Xu def flushItself(level: UInt) = level(0) 1482d7c7105SYinan Xu // def isException(level: UInt) = level(1) && level(0) 149bfb958a3SYinan Xu } 150baf8def6SYinan Xu 151baf8def6SYinan Xu object ExceptionVec { 152baf8def6SYinan Xu def apply() = Vec(16, Bool()) 153baf8def6SYinan Xu } 154a8e04b1dSYinan Xu 155c60c1ab4SWilliam Wang object PMAMode { 1568d9a04fcSWilliam Wang def R = "b1".U << 0 //readable 1578d9a04fcSWilliam Wang def W = "b1".U << 1 //writeable 1588d9a04fcSWilliam Wang def X = "b1".U << 2 //executable 1598d9a04fcSWilliam Wang def I = "b1".U << 3 //cacheable: icache 1608d9a04fcSWilliam Wang def D = "b1".U << 4 //cacheable: dcache 1618d9a04fcSWilliam Wang def S = "b1".U << 5 //enable speculative access 162cff68e26SWilliam Wang def A = "b1".U << 6 //enable atomic operation, A imply R & W 1638d9a04fcSWilliam Wang def C = "b1".U << 7 //if it is cacheable is configable 164c60c1ab4SWilliam Wang def Reserved = "b0".U 165c60c1ab4SWilliam Wang 166c60c1ab4SWilliam Wang def apply() = UInt(7.W) 167c60c1ab4SWilliam Wang 168c60c1ab4SWilliam Wang def read(mode: UInt) = mode(0) 169c60c1ab4SWilliam Wang def write(mode: UInt) = mode(1) 170c60c1ab4SWilliam Wang def execute(mode: UInt) = mode(2) 171c60c1ab4SWilliam Wang def icache(mode: UInt) = mode(3) 172c60c1ab4SWilliam Wang def dcache(mode: UInt) = mode(4) 173c60c1ab4SWilliam Wang def speculate(mode: UInt) = mode(5) 174c60c1ab4SWilliam Wang def atomic(mode: UInt) = mode(6) 175c60c1ab4SWilliam Wang def configable_cache(mode: UInt) = mode(7) 176c60c1ab4SWilliam Wang 177c60c1ab4SWilliam Wang def strToMode(s: String) = { 178423b9255SWilliam Wang var result = 0.U(8.W) 179c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("R") >= 0) result = result + R 180c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("W") >= 0) result = result + W 181c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("X") >= 0) result = result + X 182c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("I") >= 0) result = result + I 183c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("D") >= 0) result = result + D 184c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("S") >= 0) result = result + S 185c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("A") >= 0) result = result + A 186c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("C") >= 0) result = result + C 187c60c1ab4SWilliam Wang result 188c60c1ab4SWilliam Wang } 189c60c1ab4SWilliam Wang } 1902225d46eSJiawei Lin 1912225d46eSJiawei Lin 1922225d46eSJiawei Lin object CSROpType { 1932225d46eSJiawei Lin def jmp = "b000".U 1942225d46eSJiawei Lin def wrt = "b001".U 1952225d46eSJiawei Lin def set = "b010".U 1962225d46eSJiawei Lin def clr = "b011".U 197b6900d94SYinan Xu def wfi = "b100".U 1982225d46eSJiawei Lin def wrti = "b101".U 1992225d46eSJiawei Lin def seti = "b110".U 2002225d46eSJiawei Lin def clri = "b111".U 2015d669833SYinan Xu def needAccess(op: UInt): Bool = op(1, 0) =/= 0.U 2022225d46eSJiawei Lin } 2032225d46eSJiawei Lin 2042225d46eSJiawei Lin // jump 2052225d46eSJiawei Lin object JumpOpType { 2062225d46eSJiawei Lin def jal = "b00".U 2072225d46eSJiawei Lin def jalr = "b01".U 2082225d46eSJiawei Lin def auipc = "b10".U 2092225d46eSJiawei Lin// def call = "b11_011".U 2102225d46eSJiawei Lin// def ret = "b11_100".U 2112225d46eSJiawei Lin def jumpOpisJalr(op: UInt) = op(0) 2122225d46eSJiawei Lin def jumpOpisAuipc(op: UInt) = op(1) 2132225d46eSJiawei Lin } 2142225d46eSJiawei Lin 2152225d46eSJiawei Lin object FenceOpType { 2162225d46eSJiawei Lin def fence = "b10000".U 2172225d46eSJiawei Lin def sfence = "b10001".U 2182225d46eSJiawei Lin def fencei = "b10010".U 219af2f7849Shappy-lx def nofence= "b00000".U 2202225d46eSJiawei Lin } 2212225d46eSJiawei Lin 2222225d46eSJiawei Lin object ALUOpType { 223ee8ff153Szfw // shift optype 224675acc68SYinan Xu def slliuw = "b000_0000".U // slliuw: ZEXT(src1[31:0]) << shamt 225675acc68SYinan Xu def sll = "b000_0001".U // sll: src1 << src2 226ee8ff153Szfw 227675acc68SYinan Xu def bclr = "b000_0010".U // bclr: src1 & ~(1 << src2[5:0]) 228675acc68SYinan Xu def bset = "b000_0011".U // bset: src1 | (1 << src2[5:0]) 229675acc68SYinan Xu def binv = "b000_0100".U // binv: src1 ^ ~(1 << src2[5:0]) 230ee8ff153Szfw 231675acc68SYinan Xu def srl = "b000_0101".U // srl: src1 >> src2 232675acc68SYinan Xu def bext = "b000_0110".U // bext: (src1 >> src2)[0] 233675acc68SYinan Xu def sra = "b000_0111".U // sra: src1 >> src2 (arithmetic) 234ee8ff153Szfw 2357b441e5eSYinan Xu def rol = "b000_1001".U // rol: (src1 << src2) | (src1 >> (xlen - src2)) 2367b441e5eSYinan Xu def ror = "b000_1011".U // ror: (src1 >> src2) | (src1 << (xlen - src2)) 237184a1958Szfw 238ee8ff153Szfw // RV64 32bit optype 239675acc68SYinan Xu def addw = "b001_0000".U // addw: SEXT((src1 + src2)[31:0]) 240675acc68SYinan Xu def oddaddw = "b001_0001".U // oddaddw: SEXT((src1[0] + src2)[31:0]) 241675acc68SYinan Xu def subw = "b001_0010".U // subw: SEXT((src1 - src2)[31:0]) 242ee8ff153Szfw 243675acc68SYinan Xu def addwbit = "b001_0100".U // addwbit: (src1 + src2)[0] 244675acc68SYinan Xu def addwbyte = "b001_0101".U // addwbyte: (src1 + src2)[7:0] 245675acc68SYinan Xu def addwzexth = "b001_0110".U // addwzexth: ZEXT((src1 + src2)[15:0]) 246675acc68SYinan Xu def addwsexth = "b001_0111".U // addwsexth: SEXT((src1 + src2)[15:0]) 247ee8ff153Szfw 248675acc68SYinan Xu def sllw = "b001_1000".U // sllw: SEXT((src1 << src2)[31:0]) 249675acc68SYinan Xu def srlw = "b001_1001".U // srlw: SEXT((src1[31:0] >> src2)[31:0]) 250675acc68SYinan Xu def sraw = "b001_1010".U // sraw: SEXT((src1[31:0] >> src2)[31:0]) 251675acc68SYinan Xu def rolw = "b001_1100".U 252675acc68SYinan Xu def rorw = "b001_1101".U 253675acc68SYinan Xu 254675acc68SYinan Xu // ADD-op 255675acc68SYinan Xu def adduw = "b010_0000".U // adduw: src1[31:0] + src2 256675acc68SYinan Xu def add = "b010_0001".U // add: src1 + src2 257675acc68SYinan Xu def oddadd = "b010_0010".U // oddadd: src1[0] + src2 258675acc68SYinan Xu 259675acc68SYinan Xu def sr29add = "b010_0100".U // sr29add: src1[63:29] + src2 260675acc68SYinan Xu def sr30add = "b010_0101".U // sr30add: src1[63:30] + src2 261675acc68SYinan Xu def sr31add = "b010_0110".U // sr31add: src1[63:31] + src2 262675acc68SYinan Xu def sr32add = "b010_0111".U // sr32add: src1[63:32] + src2 263675acc68SYinan Xu 264675acc68SYinan Xu def sh1adduw = "b010_1000".U // sh1adduw: {src1[31:0], 1'b0} + src2 265675acc68SYinan Xu def sh1add = "b010_1001".U // sh1add: {src1[62:0], 1'b0} + src2 266675acc68SYinan Xu def sh2adduw = "b010_1010".U // sh2add_uw: {src1[31:0], 2'b0} + src2 267675acc68SYinan Xu def sh2add = "b010_1011".U // sh2add: {src1[61:0], 2'b0} + src2 268675acc68SYinan Xu def sh3adduw = "b010_1100".U // sh3add_uw: {src1[31:0], 3'b0} + src2 269675acc68SYinan Xu def sh3add = "b010_1101".U // sh3add: {src1[60:0], 3'b0} + src2 270675acc68SYinan Xu def sh4add = "b010_1111".U // sh4add: {src1[59:0], 4'b0} + src2 271675acc68SYinan Xu 272675acc68SYinan Xu // SUB-op: src1 - src2 273675acc68SYinan Xu def sub = "b011_0000".U 274675acc68SYinan Xu def sltu = "b011_0001".U 275675acc68SYinan Xu def slt = "b011_0010".U 276675acc68SYinan Xu def maxu = "b011_0100".U 277675acc68SYinan Xu def minu = "b011_0101".U 278675acc68SYinan Xu def max = "b011_0110".U 279675acc68SYinan Xu def min = "b011_0111".U 280675acc68SYinan Xu 281675acc68SYinan Xu // branch 282675acc68SYinan Xu def beq = "b111_0000".U 283675acc68SYinan Xu def bne = "b111_0010".U 284675acc68SYinan Xu def blt = "b111_1000".U 285675acc68SYinan Xu def bge = "b111_1010".U 286675acc68SYinan Xu def bltu = "b111_1100".U 287675acc68SYinan Xu def bgeu = "b111_1110".U 288675acc68SYinan Xu 289675acc68SYinan Xu // misc optype 290675acc68SYinan Xu def and = "b100_0000".U 291675acc68SYinan Xu def andn = "b100_0001".U 292675acc68SYinan Xu def or = "b100_0010".U 293675acc68SYinan Xu def orn = "b100_0011".U 294675acc68SYinan Xu def xor = "b100_0100".U 295675acc68SYinan Xu def xnor = "b100_0101".U 296675acc68SYinan Xu def orcb = "b100_0110".U 297675acc68SYinan Xu 298675acc68SYinan Xu def sextb = "b100_1000".U 299675acc68SYinan Xu def packh = "b100_1001".U 300675acc68SYinan Xu def sexth = "b100_1010".U 301675acc68SYinan Xu def packw = "b100_1011".U 302675acc68SYinan Xu 303675acc68SYinan Xu def revb = "b101_0000".U 304675acc68SYinan Xu def rev8 = "b101_0001".U 305675acc68SYinan Xu def pack = "b101_0010".U 306675acc68SYinan Xu def orh48 = "b101_0011".U 307675acc68SYinan Xu 308675acc68SYinan Xu def szewl1 = "b101_1000".U 309675acc68SYinan Xu def szewl2 = "b101_1001".U 310675acc68SYinan Xu def szewl3 = "b101_1010".U 311675acc68SYinan Xu def byte2 = "b101_1011".U 312675acc68SYinan Xu 313675acc68SYinan Xu def andlsb = "b110_0000".U 314675acc68SYinan Xu def andzexth = "b110_0001".U 315675acc68SYinan Xu def orlsb = "b110_0010".U 316675acc68SYinan Xu def orzexth = "b110_0011".U 317675acc68SYinan Xu def xorlsb = "b110_0100".U 318675acc68SYinan Xu def xorzexth = "b110_0101".U 319675acc68SYinan Xu def orcblsb = "b110_0110".U 320675acc68SYinan Xu def orcbzexth = "b110_0111".U 321675acc68SYinan Xu 322675acc68SYinan Xu def isAddw(func: UInt) = func(6, 4) === "b001".U && !func(3) && !func(1) 323675acc68SYinan Xu def isSimpleLogic(func: UInt) = func(6, 4) === "b100".U && !func(0) 324675acc68SYinan Xu def logicToLsb(func: UInt) = Cat("b110".U(3.W), func(3, 1), 0.U(1.W)) 325675acc68SYinan Xu def logicToZexth(func: UInt) = Cat("b110".U(3.W), func(3, 1), 1.U(1.W)) 326675acc68SYinan Xu def isBranch(func: UInt) = func(6, 4) === "b111".U 327675acc68SYinan Xu def getBranchType(func: UInt) = func(3, 2) 328675acc68SYinan Xu def isBranchInvert(func: UInt) = func(1) 329675acc68SYinan Xu 330675acc68SYinan Xu def apply() = UInt(7.W) 3312225d46eSJiawei Lin } 3322225d46eSJiawei Lin 3332225d46eSJiawei Lin object MDUOpType { 3342225d46eSJiawei Lin // mul 3352225d46eSJiawei Lin // bit encoding: | type (2bit) | isWord(1bit) | opcode(2bit) | 3362225d46eSJiawei Lin def mul = "b00000".U 3372225d46eSJiawei Lin def mulh = "b00001".U 3382225d46eSJiawei Lin def mulhsu = "b00010".U 3392225d46eSJiawei Lin def mulhu = "b00011".U 3402225d46eSJiawei Lin def mulw = "b00100".U 3412225d46eSJiawei Lin 34288825c5cSYinan Xu def mulw7 = "b01100".U 34388825c5cSYinan Xu 3442225d46eSJiawei Lin // div 3452225d46eSJiawei Lin // bit encoding: | type (2bit) | isWord(1bit) | isSign(1bit) | opcode(1bit) | 34688825c5cSYinan Xu def div = "b10000".U 34788825c5cSYinan Xu def divu = "b10010".U 34888825c5cSYinan Xu def rem = "b10001".U 34988825c5cSYinan Xu def remu = "b10011".U 3502225d46eSJiawei Lin 35188825c5cSYinan Xu def divw = "b10100".U 35288825c5cSYinan Xu def divuw = "b10110".U 35388825c5cSYinan Xu def remw = "b10101".U 35488825c5cSYinan Xu def remuw = "b10111".U 3552225d46eSJiawei Lin 35688825c5cSYinan Xu def isMul(op: UInt) = !op(4) 35788825c5cSYinan Xu def isDiv(op: UInt) = op(4) 3582225d46eSJiawei Lin 3592225d46eSJiawei Lin def isDivSign(op: UInt) = isDiv(op) && !op(1) 3602225d46eSJiawei Lin def isW(op: UInt) = op(2) 3612225d46eSJiawei Lin def isH(op: UInt) = (isDiv(op) && op(0)) || (isMul(op) && op(1, 0) =/= 0.U) 3622225d46eSJiawei Lin def getMulOp(op: UInt) = op(1, 0) 3632225d46eSJiawei Lin } 3642225d46eSJiawei Lin 3652225d46eSJiawei Lin object LSUOpType { 366d200f594SWilliam Wang // load pipeline 3672225d46eSJiawei Lin 368d200f594SWilliam Wang // normal load 369d200f594SWilliam Wang // Note: bit(1, 0) are size, DO NOT CHANGE 370d200f594SWilliam Wang // bit encoding: | load 0 | is unsigned(1bit) | size(2bit) | 371d200f594SWilliam Wang def lb = "b0000".U 372d200f594SWilliam Wang def lh = "b0001".U 373d200f594SWilliam Wang def lw = "b0010".U 374d200f594SWilliam Wang def ld = "b0011".U 375d200f594SWilliam Wang def lbu = "b0100".U 376d200f594SWilliam Wang def lhu = "b0101".U 377d200f594SWilliam Wang def lwu = "b0110".U 378ca18a0b4SWilliam Wang 379d200f594SWilliam Wang // Zicbop software prefetch 380d200f594SWilliam Wang // bit encoding: | prefetch 1 | 0 | prefetch type (2bit) | 381d200f594SWilliam Wang def prefetch_i = "b1000".U // TODO 382d200f594SWilliam Wang def prefetch_r = "b1001".U 383d200f594SWilliam Wang def prefetch_w = "b1010".U 384ca18a0b4SWilliam Wang 385d200f594SWilliam Wang def isPrefetch(op: UInt): Bool = op(3) 386d200f594SWilliam Wang 387d200f594SWilliam Wang // store pipeline 388d200f594SWilliam Wang // normal store 389d200f594SWilliam Wang // bit encoding: | store 00 | size(2bit) | 390d200f594SWilliam Wang def sb = "b0000".U 391d200f594SWilliam Wang def sh = "b0001".U 392d200f594SWilliam Wang def sw = "b0010".U 393d200f594SWilliam Wang def sd = "b0011".U 394d200f594SWilliam Wang 395d200f594SWilliam Wang // l1 cache op 396d200f594SWilliam Wang // bit encoding: | cbo_zero 01 | size(2bit) 11 | 397d200f594SWilliam Wang def cbo_zero = "b0111".U 398d200f594SWilliam Wang 399d200f594SWilliam Wang // llc op 400d200f594SWilliam Wang // bit encoding: | prefetch 11 | suboptype(2bit) | 401d200f594SWilliam Wang def cbo_clean = "b1100".U 402d200f594SWilliam Wang def cbo_flush = "b1101".U 403d200f594SWilliam Wang def cbo_inval = "b1110".U 404d200f594SWilliam Wang 405d200f594SWilliam Wang def isCbo(op: UInt): Bool = op(3, 2) === "b11".U 4062225d46eSJiawei Lin 4072225d46eSJiawei Lin // atomics 4082225d46eSJiawei Lin // bit(1, 0) are size 4092225d46eSJiawei Lin // since atomics use a different fu type 4102225d46eSJiawei Lin // so we can safely reuse other load/store's encodings 411d200f594SWilliam Wang // bit encoding: | optype(4bit) | size (2bit) | 4122225d46eSJiawei Lin def lr_w = "b000010".U 4132225d46eSJiawei Lin def sc_w = "b000110".U 4142225d46eSJiawei Lin def amoswap_w = "b001010".U 4152225d46eSJiawei Lin def amoadd_w = "b001110".U 4162225d46eSJiawei Lin def amoxor_w = "b010010".U 4172225d46eSJiawei Lin def amoand_w = "b010110".U 4182225d46eSJiawei Lin def amoor_w = "b011010".U 4192225d46eSJiawei Lin def amomin_w = "b011110".U 4202225d46eSJiawei Lin def amomax_w = "b100010".U 4212225d46eSJiawei Lin def amominu_w = "b100110".U 4222225d46eSJiawei Lin def amomaxu_w = "b101010".U 4232225d46eSJiawei Lin 4242225d46eSJiawei Lin def lr_d = "b000011".U 4252225d46eSJiawei Lin def sc_d = "b000111".U 4262225d46eSJiawei Lin def amoswap_d = "b001011".U 4272225d46eSJiawei Lin def amoadd_d = "b001111".U 4282225d46eSJiawei Lin def amoxor_d = "b010011".U 4292225d46eSJiawei Lin def amoand_d = "b010111".U 4302225d46eSJiawei Lin def amoor_d = "b011011".U 4312225d46eSJiawei Lin def amomin_d = "b011111".U 4322225d46eSJiawei Lin def amomax_d = "b100011".U 4332225d46eSJiawei Lin def amominu_d = "b100111".U 4342225d46eSJiawei Lin def amomaxu_d = "b101011".U 435b6982e83SLemover 436b6982e83SLemover def size(op: UInt) = op(1,0) 4372225d46eSJiawei Lin } 4382225d46eSJiawei Lin 4393feeca58Szfw object BKUOpType { 440ee8ff153Szfw 4413feeca58Szfw def clmul = "b000000".U 4423feeca58Szfw def clmulh = "b000001".U 4433feeca58Szfw def clmulr = "b000010".U 4443feeca58Szfw def xpermn = "b000100".U 4453feeca58Szfw def xpermb = "b000101".U 446ee8ff153Szfw 4473feeca58Szfw def clz = "b001000".U 4483feeca58Szfw def clzw = "b001001".U 4493feeca58Szfw def ctz = "b001010".U 4503feeca58Szfw def ctzw = "b001011".U 4513feeca58Szfw def cpop = "b001100".U 4523feeca58Szfw def cpopw = "b001101".U 45307596dc6Szfw 4543feeca58Szfw // 01xxxx is reserve 4553feeca58Szfw def aes64es = "b100000".U 4563feeca58Szfw def aes64esm = "b100001".U 4573feeca58Szfw def aes64ds = "b100010".U 4583feeca58Szfw def aes64dsm = "b100011".U 4593feeca58Szfw def aes64im = "b100100".U 4603feeca58Szfw def aes64ks1i = "b100101".U 4613feeca58Szfw def aes64ks2 = "b100110".U 4623feeca58Szfw 4633feeca58Szfw // merge to two instruction sm4ks & sm4ed 46419bcce38SFawang Zhang def sm4ed0 = "b101000".U 46519bcce38SFawang Zhang def sm4ed1 = "b101001".U 46619bcce38SFawang Zhang def sm4ed2 = "b101010".U 46719bcce38SFawang Zhang def sm4ed3 = "b101011".U 46819bcce38SFawang Zhang def sm4ks0 = "b101100".U 46919bcce38SFawang Zhang def sm4ks1 = "b101101".U 47019bcce38SFawang Zhang def sm4ks2 = "b101110".U 47119bcce38SFawang Zhang def sm4ks3 = "b101111".U 4723feeca58Szfw 4733feeca58Szfw def sha256sum0 = "b110000".U 4743feeca58Szfw def sha256sum1 = "b110001".U 4753feeca58Szfw def sha256sig0 = "b110010".U 4763feeca58Szfw def sha256sig1 = "b110011".U 4773feeca58Szfw def sha512sum0 = "b110100".U 4783feeca58Szfw def sha512sum1 = "b110101".U 4793feeca58Szfw def sha512sig0 = "b110110".U 4803feeca58Szfw def sha512sig1 = "b110111".U 4813feeca58Szfw 4823feeca58Szfw def sm3p0 = "b111000".U 4833feeca58Szfw def sm3p1 = "b111001".U 484ee8ff153Szfw } 485ee8ff153Szfw 4862225d46eSJiawei Lin object BTBtype { 4872225d46eSJiawei Lin def B = "b00".U // branch 4882225d46eSJiawei Lin def J = "b01".U // jump 4892225d46eSJiawei Lin def I = "b10".U // indirect 4902225d46eSJiawei Lin def R = "b11".U // return 4912225d46eSJiawei Lin 4922225d46eSJiawei Lin def apply() = UInt(2.W) 4932225d46eSJiawei Lin } 4942225d46eSJiawei Lin 4952225d46eSJiawei Lin object SelImm { 496ee8ff153Szfw def IMM_X = "b0111".U 497ee8ff153Szfw def IMM_S = "b0000".U 498ee8ff153Szfw def IMM_SB = "b0001".U 499ee8ff153Szfw def IMM_U = "b0010".U 500ee8ff153Szfw def IMM_UJ = "b0011".U 501ee8ff153Szfw def IMM_I = "b0100".U 502ee8ff153Szfw def IMM_Z = "b0101".U 503ee8ff153Szfw def INVALID_INSTR = "b0110".U 504ee8ff153Szfw def IMM_B6 = "b1000".U 5052225d46eSJiawei Lin 5066e7c9679Shuxuan0307 def X = BitPat("b????") 5076e7c9679Shuxuan0307 508ee8ff153Szfw def apply() = UInt(4.W) 5092225d46eSJiawei Lin } 5102225d46eSJiawei Lin 5116ab6918fSYinan Xu object ExceptionNO { 5126ab6918fSYinan Xu def instrAddrMisaligned = 0 5136ab6918fSYinan Xu def instrAccessFault = 1 5146ab6918fSYinan Xu def illegalInstr = 2 5156ab6918fSYinan Xu def breakPoint = 3 5166ab6918fSYinan Xu def loadAddrMisaligned = 4 5176ab6918fSYinan Xu def loadAccessFault = 5 5186ab6918fSYinan Xu def storeAddrMisaligned = 6 5196ab6918fSYinan Xu def storeAccessFault = 7 5206ab6918fSYinan Xu def ecallU = 8 5216ab6918fSYinan Xu def ecallS = 9 5226ab6918fSYinan Xu def ecallM = 11 5236ab6918fSYinan Xu def instrPageFault = 12 5246ab6918fSYinan Xu def loadPageFault = 13 5256ab6918fSYinan Xu // def singleStep = 14 5266ab6918fSYinan Xu def storePageFault = 15 5276ab6918fSYinan Xu def priorities = Seq( 5286ab6918fSYinan Xu breakPoint, // TODO: different BP has different priority 5296ab6918fSYinan Xu instrPageFault, 5306ab6918fSYinan Xu instrAccessFault, 5316ab6918fSYinan Xu illegalInstr, 5326ab6918fSYinan Xu instrAddrMisaligned, 5336ab6918fSYinan Xu ecallM, ecallS, ecallU, 534d880177dSYinan Xu storeAddrMisaligned, 535d880177dSYinan Xu loadAddrMisaligned, 5366ab6918fSYinan Xu storePageFault, 5376ab6918fSYinan Xu loadPageFault, 5386ab6918fSYinan Xu storeAccessFault, 539d880177dSYinan Xu loadAccessFault 5406ab6918fSYinan Xu ) 5416ab6918fSYinan Xu def all = priorities.distinct.sorted 5426ab6918fSYinan Xu def frontendSet = Seq( 5436ab6918fSYinan Xu instrAddrMisaligned, 5446ab6918fSYinan Xu instrAccessFault, 5456ab6918fSYinan Xu illegalInstr, 5466ab6918fSYinan Xu instrPageFault 5476ab6918fSYinan Xu ) 5486ab6918fSYinan Xu def partialSelect(vec: Vec[Bool], select: Seq[Int]): Vec[Bool] = { 5496ab6918fSYinan Xu val new_vec = Wire(ExceptionVec()) 5506ab6918fSYinan Xu new_vec.foreach(_ := false.B) 5516ab6918fSYinan Xu select.foreach(i => new_vec(i) := vec(i)) 5526ab6918fSYinan Xu new_vec 5536ab6918fSYinan Xu } 5546ab6918fSYinan Xu def selectFrontend(vec: Vec[Bool]): Vec[Bool] = partialSelect(vec, frontendSet) 5556ab6918fSYinan Xu def selectAll(vec: Vec[Bool]): Vec[Bool] = partialSelect(vec, ExceptionNO.all) 5566ab6918fSYinan Xu def selectByFu(vec:Vec[Bool], fuConfig: FuConfig): Vec[Bool] = 5576ab6918fSYinan Xu partialSelect(vec, fuConfig.exceptionOut) 5586ab6918fSYinan Xu def selectByExu(vec:Vec[Bool], exuConfig: ExuConfig): Vec[Bool] = 5596ab6918fSYinan Xu partialSelect(vec, exuConfig.exceptionOut) 5606ab6918fSYinan Xu def selectByExu(vec:Vec[Bool], exuConfigs: Seq[ExuConfig]): Vec[Bool] = 5616ab6918fSYinan Xu partialSelect(vec, exuConfigs.map(_.exceptionOut).reduce(_ ++ _).distinct.sorted) 5626ab6918fSYinan Xu } 5636ab6918fSYinan Xu 5641c62c387SYinan Xu def dividerGen(p: Parameters) = new DividerWrapper(p(XLen))(p) 565c3d7991bSJiawei Lin def multiplierGen(p: Parameters) = new ArrayMultiplier(p(XLen) + 1)(p) 5662225d46eSJiawei Lin def aluGen(p: Parameters) = new Alu()(p) 5673feeca58Szfw def bkuGen(p: Parameters) = new Bku()(p) 5682225d46eSJiawei Lin def jmpGen(p: Parameters) = new Jump()(p) 5692225d46eSJiawei Lin def fenceGen(p: Parameters) = new Fence()(p) 5702225d46eSJiawei Lin def csrGen(p: Parameters) = new CSR()(p) 5712225d46eSJiawei Lin def i2fGen(p: Parameters) = new IntToFP()(p) 5722225d46eSJiawei Lin def fmacGen(p: Parameters) = new FMA()(p) 5732225d46eSJiawei Lin def f2iGen(p: Parameters) = new FPToInt()(p) 5742225d46eSJiawei Lin def f2fGen(p: Parameters) = new FPToFP()(p) 5752225d46eSJiawei Lin def fdivSqrtGen(p: Parameters) = new FDivSqrt()(p) 57685b4cd54SYinan Xu def stdGen(p: Parameters) = new Std()(p) 5776ab6918fSYinan Xu def mouDataGen(p: Parameters) = new Std()(p) 5782225d46eSJiawei Lin 5796cdd85d9SYinan Xu def f2iSel(uop: MicroOp): Bool = { 5806cdd85d9SYinan Xu uop.ctrl.rfWen 5812225d46eSJiawei Lin } 5822225d46eSJiawei Lin 5836cdd85d9SYinan Xu def i2fSel(uop: MicroOp): Bool = { 5846cdd85d9SYinan Xu uop.ctrl.fpu.fromInt 5852225d46eSJiawei Lin } 5862225d46eSJiawei Lin 5876cdd85d9SYinan Xu def f2fSel(uop: MicroOp): Bool = { 5886cdd85d9SYinan Xu val ctrl = uop.ctrl.fpu 5892225d46eSJiawei Lin ctrl.fpWen && !ctrl.div && !ctrl.sqrt 5902225d46eSJiawei Lin } 5912225d46eSJiawei Lin 5926cdd85d9SYinan Xu def fdivSqrtSel(uop: MicroOp): Bool = { 5936cdd85d9SYinan Xu val ctrl = uop.ctrl.fpu 5942225d46eSJiawei Lin ctrl.div || ctrl.sqrt 5952225d46eSJiawei Lin } 5962225d46eSJiawei Lin 5972225d46eSJiawei Lin val aluCfg = FuConfig( 5981a0f06eeSYinan Xu name = "alu", 5992225d46eSJiawei Lin fuGen = aluGen, 6006cdd85d9SYinan Xu fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.alu, 6012225d46eSJiawei Lin fuType = FuType.alu, 6022225d46eSJiawei Lin numIntSrc = 2, 6032225d46eSJiawei Lin numFpSrc = 0, 6042225d46eSJiawei Lin writeIntRf = true, 6052225d46eSJiawei Lin writeFpRf = false, 6062225d46eSJiawei Lin hasRedirect = true, 6072225d46eSJiawei Lin ) 6082225d46eSJiawei Lin 6092225d46eSJiawei Lin val jmpCfg = FuConfig( 6101a0f06eeSYinan Xu name = "jmp", 6112225d46eSJiawei Lin fuGen = jmpGen, 6126cdd85d9SYinan Xu fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.jmp, 6132225d46eSJiawei Lin fuType = FuType.jmp, 6142225d46eSJiawei Lin numIntSrc = 1, 6152225d46eSJiawei Lin numFpSrc = 0, 6162225d46eSJiawei Lin writeIntRf = true, 6172225d46eSJiawei Lin writeFpRf = false, 6182225d46eSJiawei Lin hasRedirect = true, 6192225d46eSJiawei Lin ) 6202225d46eSJiawei Lin 6212225d46eSJiawei Lin val fenceCfg = FuConfig( 6221a0f06eeSYinan Xu name = "fence", 6232225d46eSJiawei Lin fuGen = fenceGen, 6246cdd85d9SYinan Xu fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.fence, 6256ab6918fSYinan Xu FuType.fence, 2, 0, writeIntRf = false, writeFpRf = false, 626f1fe8698SLemover latency = UncertainLatency(), exceptionOut = Seq(illegalInstr), // TODO: need rewrite latency structure, not just this value, 627f1fe8698SLemover flushPipe = true 6282225d46eSJiawei Lin ) 6292225d46eSJiawei Lin 6302225d46eSJiawei Lin val csrCfg = FuConfig( 6311a0f06eeSYinan Xu name = "csr", 6322225d46eSJiawei Lin fuGen = csrGen, 6336cdd85d9SYinan Xu fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.csr, 6342225d46eSJiawei Lin fuType = FuType.csr, 6352225d46eSJiawei Lin numIntSrc = 1, 6362225d46eSJiawei Lin numFpSrc = 0, 6372225d46eSJiawei Lin writeIntRf = true, 6382225d46eSJiawei Lin writeFpRf = false, 6396ab6918fSYinan Xu exceptionOut = Seq(illegalInstr, breakPoint, ecallU, ecallS, ecallM), 6406ab6918fSYinan Xu flushPipe = true 6412225d46eSJiawei Lin ) 6422225d46eSJiawei Lin 6432225d46eSJiawei Lin val i2fCfg = FuConfig( 6441a0f06eeSYinan Xu name = "i2f", 6452225d46eSJiawei Lin fuGen = i2fGen, 6462225d46eSJiawei Lin fuSel = i2fSel, 6472225d46eSJiawei Lin FuType.i2f, 6482225d46eSJiawei Lin numIntSrc = 1, 6492225d46eSJiawei Lin numFpSrc = 0, 6502225d46eSJiawei Lin writeIntRf = false, 6512225d46eSJiawei Lin writeFpRf = true, 6526ab6918fSYinan Xu writeFflags = true, 653e174d629SJiawei Lin latency = CertainLatency(2), 654e174d629SJiawei Lin fastUopOut = true, fastImplemented = true 6552225d46eSJiawei Lin ) 6562225d46eSJiawei Lin 6572225d46eSJiawei Lin val divCfg = FuConfig( 6581a0f06eeSYinan Xu name = "div", 6592225d46eSJiawei Lin fuGen = dividerGen, 66007596dc6Szfw fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.div, 6612225d46eSJiawei Lin FuType.div, 6622225d46eSJiawei Lin 2, 6632225d46eSJiawei Lin 0, 6642225d46eSJiawei Lin writeIntRf = true, 6652225d46eSJiawei Lin writeFpRf = false, 666f83b578aSYinan Xu latency = UncertainLatency(), 667f83b578aSYinan Xu fastUopOut = true, 6681c62c387SYinan Xu fastImplemented = true, 669*5ee7cabeSYinan Xu hasInputBuffer = (true, 4, true) 6702225d46eSJiawei Lin ) 6712225d46eSJiawei Lin 6722225d46eSJiawei Lin val mulCfg = FuConfig( 6731a0f06eeSYinan Xu name = "mul", 6742225d46eSJiawei Lin fuGen = multiplierGen, 67507596dc6Szfw fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.mul, 6762225d46eSJiawei Lin FuType.mul, 6772225d46eSJiawei Lin 2, 6782225d46eSJiawei Lin 0, 6792225d46eSJiawei Lin writeIntRf = true, 6802225d46eSJiawei Lin writeFpRf = false, 681b2482bc1SYinan Xu latency = CertainLatency(2), 682f83b578aSYinan Xu fastUopOut = true, 683b2482bc1SYinan Xu fastImplemented = true 6842225d46eSJiawei Lin ) 6852225d46eSJiawei Lin 6863feeca58Szfw val bkuCfg = FuConfig( 6873feeca58Szfw name = "bku", 6883feeca58Szfw fuGen = bkuGen, 6893feeca58Szfw fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.bku, 6903feeca58Szfw fuType = FuType.bku, 691ee8ff153Szfw numIntSrc = 2, 692ee8ff153Szfw numFpSrc = 0, 693ee8ff153Szfw writeIntRf = true, 694ee8ff153Szfw writeFpRf = false, 695f83b578aSYinan Xu latency = CertainLatency(1), 696f83b578aSYinan Xu fastUopOut = true, 69707596dc6Szfw fastImplemented = true 698ee8ff153Szfw ) 699ee8ff153Szfw 7002225d46eSJiawei Lin val fmacCfg = FuConfig( 7011a0f06eeSYinan Xu name = "fmac", 7022225d46eSJiawei Lin fuGen = fmacGen, 7032225d46eSJiawei Lin fuSel = _ => true.B, 7046ab6918fSYinan Xu FuType.fmac, 0, 3, writeIntRf = false, writeFpRf = true, writeFflags = true, 7054b65fc7eSJiawei Lin latency = UncertainLatency(), fastUopOut = true, fastImplemented = true 7062225d46eSJiawei Lin ) 7072225d46eSJiawei Lin 7082225d46eSJiawei Lin val f2iCfg = FuConfig( 7091a0f06eeSYinan Xu name = "f2i", 7102225d46eSJiawei Lin fuGen = f2iGen, 7112225d46eSJiawei Lin fuSel = f2iSel, 7126ab6918fSYinan Xu FuType.fmisc, 0, 1, writeIntRf = true, writeFpRf = false, writeFflags = true, latency = CertainLatency(2), 713b2482bc1SYinan Xu fastUopOut = true, fastImplemented = true 7142225d46eSJiawei Lin ) 7152225d46eSJiawei Lin 7162225d46eSJiawei Lin val f2fCfg = FuConfig( 7171a0f06eeSYinan Xu name = "f2f", 7182225d46eSJiawei Lin fuGen = f2fGen, 7192225d46eSJiawei Lin fuSel = f2fSel, 7206ab6918fSYinan Xu FuType.fmisc, 0, 1, writeIntRf = false, writeFpRf = true, writeFflags = true, latency = CertainLatency(2), 721b2482bc1SYinan Xu fastUopOut = true, fastImplemented = true 7222225d46eSJiawei Lin ) 7232225d46eSJiawei Lin 7242225d46eSJiawei Lin val fdivSqrtCfg = FuConfig( 7251a0f06eeSYinan Xu name = "fdivSqrt", 7262225d46eSJiawei Lin fuGen = fdivSqrtGen, 7272225d46eSJiawei Lin fuSel = fdivSqrtSel, 7286ab6918fSYinan Xu FuType.fDivSqrt, 0, 2, writeIntRf = false, writeFpRf = true, writeFflags = true, latency = UncertainLatency(), 729*5ee7cabeSYinan Xu fastUopOut = true, fastImplemented = true, hasInputBuffer = (true, 8, false) 7302225d46eSJiawei Lin ) 7312225d46eSJiawei Lin 7322225d46eSJiawei Lin val lduCfg = FuConfig( 7331a0f06eeSYinan Xu "ldu", 7342225d46eSJiawei Lin null, // DontCare 7352b4e8253SYinan Xu (uop: MicroOp) => FuType.loadCanAccept(uop.ctrl.fuType), 7366ab6918fSYinan Xu FuType.ldu, 1, 0, writeIntRf = true, writeFpRf = true, 7376ab6918fSYinan Xu latency = UncertainLatency(), 7386ab6918fSYinan Xu exceptionOut = Seq(loadAddrMisaligned, loadAccessFault, loadPageFault), 7396ab6918fSYinan Xu flushPipe = true, 7406786cfb7SWilliam Wang replayInst = true, 7416786cfb7SWilliam Wang hasLoadError = true 7422225d46eSJiawei Lin ) 7432225d46eSJiawei Lin 74485b4cd54SYinan Xu val staCfg = FuConfig( 7451a0f06eeSYinan Xu "sta", 7462225d46eSJiawei Lin null, 7472b4e8253SYinan Xu (uop: MicroOp) => FuType.storeCanAccept(uop.ctrl.fuType), 7486ab6918fSYinan Xu FuType.stu, 1, 0, writeIntRf = false, writeFpRf = false, 7496ab6918fSYinan Xu latency = UncertainLatency(), 7506ab6918fSYinan Xu exceptionOut = Seq(storeAddrMisaligned, storeAccessFault, storePageFault) 7512225d46eSJiawei Lin ) 7522225d46eSJiawei Lin 75385b4cd54SYinan Xu val stdCfg = FuConfig( 7541a0f06eeSYinan Xu "std", 7552b4e8253SYinan Xu fuGen = stdGen, fuSel = (uop: MicroOp) => FuType.storeCanAccept(uop.ctrl.fuType), FuType.stu, 1, 1, 7566ab6918fSYinan Xu writeIntRf = false, writeFpRf = false, latency = CertainLatency(1) 75785b4cd54SYinan Xu ) 75885b4cd54SYinan Xu 7592225d46eSJiawei Lin val mouCfg = FuConfig( 7601a0f06eeSYinan Xu "mou", 7612225d46eSJiawei Lin null, 7622b4e8253SYinan Xu (uop: MicroOp) => FuType.storeCanAccept(uop.ctrl.fuType), 7636ab6918fSYinan Xu FuType.mou, 1, 0, writeIntRf = false, writeFpRf = false, 7646ab6918fSYinan Xu latency = UncertainLatency(), exceptionOut = lduCfg.exceptionOut ++ staCfg.exceptionOut 7652b4e8253SYinan Xu ) 7662b4e8253SYinan Xu 7672b4e8253SYinan Xu val mouDataCfg = FuConfig( 7682b4e8253SYinan Xu "mou", 7692b4e8253SYinan Xu mouDataGen, 7702b4e8253SYinan Xu (uop: MicroOp) => FuType.storeCanAccept(uop.ctrl.fuType), 7716ab6918fSYinan Xu FuType.mou, 1, 0, writeIntRf = false, writeFpRf = false, 7726ab6918fSYinan Xu latency = UncertainLatency() 7732225d46eSJiawei Lin ) 7742225d46eSJiawei Lin 775adb5df20SYinan Xu val JumpExeUnitCfg = ExuConfig("JmpExeUnit", "Int", Seq(jmpCfg, i2fCfg), 2, Int.MaxValue) 776b6220f0dSLemover val AluExeUnitCfg = ExuConfig("AluExeUnit", "Int", Seq(aluCfg), 0, Int.MaxValue) 777adb5df20SYinan Xu val JumpCSRExeUnitCfg = ExuConfig("JmpCSRExeUnit", "Int", Seq(jmpCfg, csrCfg, fenceCfg, i2fCfg), 2, Int.MaxValue) 7783feeca58Szfw val MulDivExeUnitCfg = ExuConfig("MulDivExeUnit", "Int", Seq(mulCfg, divCfg, bkuCfg), 1, Int.MaxValue) 779b6220f0dSLemover val FmacExeUnitCfg = ExuConfig("FmacExeUnit", "Fp", Seq(fmacCfg), Int.MaxValue, 0) 7802225d46eSJiawei Lin val FmiscExeUnitCfg = ExuConfig( 7812225d46eSJiawei Lin "FmiscExeUnit", 782b6220f0dSLemover "Fp", 7832225d46eSJiawei Lin Seq(f2iCfg, f2fCfg, fdivSqrtCfg), 7842225d46eSJiawei Lin Int.MaxValue, 1 7852225d46eSJiawei Lin ) 7862b4e8253SYinan Xu val LdExeUnitCfg = ExuConfig("LoadExu", "Mem", Seq(lduCfg), wbIntPriority = 0, wbFpPriority = 0, extendsExu = false) 7872b4e8253SYinan Xu val StaExeUnitCfg = ExuConfig("StaExu", "Mem", Seq(staCfg, mouCfg), wbIntPriority = Int.MaxValue, wbFpPriority = Int.MaxValue, extendsExu = false) 7882b4e8253SYinan Xu val StdExeUnitCfg = ExuConfig("StdExu", "Mem", Seq(stdCfg, mouDataCfg), wbIntPriority = Int.MaxValue, wbFpPriority = Int.MaxValue, extendsExu = false) 7899a2e6b8aSLinJiawei} 790