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 71*d2b20d1aSTang Haojin def mou = "b1111".U // for amo, lr, sc 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 87*d2b20d1aSTang Haojin def isDivSqrt(fuType: UInt) = fuType === div || fuType === fDivSqrt 88af2f7849Shappy-lx def isSvinvalBegin(fuType: UInt, func: UInt, flush: Bool) = isFence(fuType) && func === FenceOpType.nofence && !flush 89af2f7849Shappy-lx def isSvinval(fuType: UInt, func: UInt, flush: Bool) = isFence(fuType) && func === FenceOpType.sfence && !flush 90af2f7849Shappy-lx def isSvinvalEnd(fuType: UInt, func: UInt, flush: Bool) = isFence(fuType) && func === FenceOpType.nofence && flush 91af2f7849Shappy-lx 9292ab24ebSYinan Xu 9392ab24ebSYinan Xu def jmpCanAccept(fuType: UInt) = !fuType(2) 94ee8ff153Szfw def mduCanAccept(fuType: UInt) = fuType(2) && !fuType(1) || fuType(2) && fuType(1) && fuType(0) 95ee8ff153Szfw def aluCanAccept(fuType: UInt) = fuType(2) && fuType(1) && !fuType(0) 9692ab24ebSYinan Xu 9792ab24ebSYinan Xu def fmacCanAccept(fuType: UInt) = !fuType(1) 9892ab24ebSYinan Xu def fmiscCanAccept(fuType: UInt) = fuType(1) 9992ab24ebSYinan Xu 10092ab24ebSYinan Xu def loadCanAccept(fuType: UInt) = !fuType(0) 10192ab24ebSYinan Xu def storeCanAccept(fuType: UInt) = fuType(0) 10292ab24ebSYinan Xu 10392ab24ebSYinan Xu def storeIsAMO(fuType: UInt) = fuType(1) 104cafb3558SLinJiawei 105cafb3558SLinJiawei val functionNameMap = Map( 106cafb3558SLinJiawei jmp.litValue() -> "jmp", 107ebb8ebf8SYinan Xu i2f.litValue() -> "int_to_float", 108cafb3558SLinJiawei csr.litValue() -> "csr", 109cafb3558SLinJiawei alu.litValue() -> "alu", 110cafb3558SLinJiawei mul.litValue() -> "mul", 111cafb3558SLinJiawei div.litValue() -> "div", 112b8f08ca0SZhangZifei fence.litValue() -> "fence", 1133feeca58Szfw bku.litValue() -> "bku", 114cafb3558SLinJiawei fmac.litValue() -> "fmac", 115cafb3558SLinJiawei fmisc.litValue() -> "fmisc", 116d18dc7e6Swakafa fDivSqrt.litValue() -> "fdiv_fsqrt", 117cafb3558SLinJiawei ldu.litValue() -> "load", 118ebb8ebf8SYinan Xu stu.litValue() -> "store", 119ebb8ebf8SYinan Xu mou.litValue() -> "mou" 120cafb3558SLinJiawei ) 1219a2e6b8aSLinJiawei } 1229a2e6b8aSLinJiawei 1232225d46eSJiawei Lin object FuOpType { 124675acc68SYinan Xu def apply() = UInt(7.W) 125361e6d51SJiuyang Liu def X = BitPat("b???????") 126ebd97ecbSzhanglinjuan } 127518d8658SYinan Xu 128a3edac52SYinan Xu object CommitType { 129c3abb8b6SYinan Xu def NORMAL = "b000".U // int/fp 130c3abb8b6SYinan Xu def BRANCH = "b001".U // branch 131c3abb8b6SYinan Xu def LOAD = "b010".U // load 132c3abb8b6SYinan Xu def STORE = "b011".U // store 133518d8658SYinan Xu 134c3abb8b6SYinan Xu def apply() = UInt(3.W) 135c3abb8b6SYinan Xu def isFused(commitType: UInt): Bool = commitType(2) 136c3abb8b6SYinan Xu def isLoadStore(commitType: UInt): Bool = !isFused(commitType) && commitType(1) 137c3abb8b6SYinan Xu def lsInstIsStore(commitType: UInt): Bool = commitType(0) 138c3abb8b6SYinan Xu def isStore(commitType: UInt): Bool = isLoadStore(commitType) && lsInstIsStore(commitType) 139c3abb8b6SYinan Xu def isBranch(commitType: UInt): Bool = commitType(0) && !commitType(1) && !isFused(commitType) 140518d8658SYinan Xu } 141bfb958a3SYinan Xu 142bfb958a3SYinan Xu object RedirectLevel { 1432d7c7105SYinan Xu def flushAfter = "b0".U 1442d7c7105SYinan Xu def flush = "b1".U 145bfb958a3SYinan Xu 1462d7c7105SYinan Xu def apply() = UInt(1.W) 1472d7c7105SYinan Xu // def isUnconditional(level: UInt) = level(1) 148bfb958a3SYinan Xu def flushItself(level: UInt) = level(0) 1492d7c7105SYinan Xu // def isException(level: UInt) = level(1) && level(0) 150bfb958a3SYinan Xu } 151baf8def6SYinan Xu 152baf8def6SYinan Xu object ExceptionVec { 153da3bf434SMaxpicca-Li val ExceptionVecSize = 16 154da3bf434SMaxpicca-Li def apply() = Vec(ExceptionVecSize, Bool()) 155baf8def6SYinan Xu } 156a8e04b1dSYinan Xu 157c60c1ab4SWilliam Wang object PMAMode { 1588d9a04fcSWilliam Wang def R = "b1".U << 0 //readable 1598d9a04fcSWilliam Wang def W = "b1".U << 1 //writeable 1608d9a04fcSWilliam Wang def X = "b1".U << 2 //executable 1618d9a04fcSWilliam Wang def I = "b1".U << 3 //cacheable: icache 1628d9a04fcSWilliam Wang def D = "b1".U << 4 //cacheable: dcache 1638d9a04fcSWilliam Wang def S = "b1".U << 5 //enable speculative access 164cff68e26SWilliam Wang def A = "b1".U << 6 //enable atomic operation, A imply R & W 1658d9a04fcSWilliam Wang def C = "b1".U << 7 //if it is cacheable is configable 166c60c1ab4SWilliam Wang def Reserved = "b0".U 167c60c1ab4SWilliam Wang 168c60c1ab4SWilliam Wang def apply() = UInt(7.W) 169c60c1ab4SWilliam Wang 170c60c1ab4SWilliam Wang def read(mode: UInt) = mode(0) 171c60c1ab4SWilliam Wang def write(mode: UInt) = mode(1) 172c60c1ab4SWilliam Wang def execute(mode: UInt) = mode(2) 173c60c1ab4SWilliam Wang def icache(mode: UInt) = mode(3) 174c60c1ab4SWilliam Wang def dcache(mode: UInt) = mode(4) 175c60c1ab4SWilliam Wang def speculate(mode: UInt) = mode(5) 176c60c1ab4SWilliam Wang def atomic(mode: UInt) = mode(6) 177c60c1ab4SWilliam Wang def configable_cache(mode: UInt) = mode(7) 178c60c1ab4SWilliam Wang 179c60c1ab4SWilliam Wang def strToMode(s: String) = { 180423b9255SWilliam Wang var result = 0.U(8.W) 181c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("R") >= 0) result = result + R 182c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("W") >= 0) result = result + W 183c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("X") >= 0) result = result + X 184c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("I") >= 0) result = result + I 185c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("D") >= 0) result = result + D 186c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("S") >= 0) result = result + S 187c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("A") >= 0) result = result + A 188c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("C") >= 0) result = result + C 189c60c1ab4SWilliam Wang result 190c60c1ab4SWilliam Wang } 191c60c1ab4SWilliam Wang } 1922225d46eSJiawei Lin 1932225d46eSJiawei Lin 1942225d46eSJiawei Lin object CSROpType { 1952225d46eSJiawei Lin def jmp = "b000".U 1962225d46eSJiawei Lin def wrt = "b001".U 1972225d46eSJiawei Lin def set = "b010".U 1982225d46eSJiawei Lin def clr = "b011".U 199b6900d94SYinan Xu def wfi = "b100".U 2002225d46eSJiawei Lin def wrti = "b101".U 2012225d46eSJiawei Lin def seti = "b110".U 2022225d46eSJiawei Lin def clri = "b111".U 2035d669833SYinan Xu def needAccess(op: UInt): Bool = op(1, 0) =/= 0.U 2042225d46eSJiawei Lin } 2052225d46eSJiawei Lin 2062225d46eSJiawei Lin // jump 2072225d46eSJiawei Lin object JumpOpType { 2082225d46eSJiawei Lin def jal = "b00".U 2092225d46eSJiawei Lin def jalr = "b01".U 2102225d46eSJiawei Lin def auipc = "b10".U 2112225d46eSJiawei Lin// def call = "b11_011".U 2122225d46eSJiawei Lin// def ret = "b11_100".U 2132225d46eSJiawei Lin def jumpOpisJalr(op: UInt) = op(0) 2142225d46eSJiawei Lin def jumpOpisAuipc(op: UInt) = op(1) 2152225d46eSJiawei Lin } 2162225d46eSJiawei Lin 2172225d46eSJiawei Lin object FenceOpType { 2182225d46eSJiawei Lin def fence = "b10000".U 2192225d46eSJiawei Lin def sfence = "b10001".U 2202225d46eSJiawei Lin def fencei = "b10010".U 221af2f7849Shappy-lx def nofence= "b00000".U 2222225d46eSJiawei Lin } 2232225d46eSJiawei Lin 2242225d46eSJiawei Lin object ALUOpType { 225ee8ff153Szfw // shift optype 226675acc68SYinan Xu def slliuw = "b000_0000".U // slliuw: ZEXT(src1[31:0]) << shamt 227675acc68SYinan Xu def sll = "b000_0001".U // sll: src1 << src2 228ee8ff153Szfw 229675acc68SYinan Xu def bclr = "b000_0010".U // bclr: src1 & ~(1 << src2[5:0]) 230675acc68SYinan Xu def bset = "b000_0011".U // bset: src1 | (1 << src2[5:0]) 231675acc68SYinan Xu def binv = "b000_0100".U // binv: src1 ^ ~(1 << src2[5:0]) 232ee8ff153Szfw 233675acc68SYinan Xu def srl = "b000_0101".U // srl: src1 >> src2 234675acc68SYinan Xu def bext = "b000_0110".U // bext: (src1 >> src2)[0] 235675acc68SYinan Xu def sra = "b000_0111".U // sra: src1 >> src2 (arithmetic) 236ee8ff153Szfw 2377b441e5eSYinan Xu def rol = "b000_1001".U // rol: (src1 << src2) | (src1 >> (xlen - src2)) 2387b441e5eSYinan Xu def ror = "b000_1011".U // ror: (src1 >> src2) | (src1 << (xlen - src2)) 239184a1958Szfw 240ee8ff153Szfw // RV64 32bit optype 241675acc68SYinan Xu def addw = "b001_0000".U // addw: SEXT((src1 + src2)[31:0]) 242675acc68SYinan Xu def oddaddw = "b001_0001".U // oddaddw: SEXT((src1[0] + src2)[31:0]) 243675acc68SYinan Xu def subw = "b001_0010".U // subw: SEXT((src1 - src2)[31:0]) 244ee8ff153Szfw 245675acc68SYinan Xu def addwbit = "b001_0100".U // addwbit: (src1 + src2)[0] 246675acc68SYinan Xu def addwbyte = "b001_0101".U // addwbyte: (src1 + src2)[7:0] 247675acc68SYinan Xu def addwzexth = "b001_0110".U // addwzexth: ZEXT((src1 + src2)[15:0]) 248675acc68SYinan Xu def addwsexth = "b001_0111".U // addwsexth: SEXT((src1 + src2)[15:0]) 249ee8ff153Szfw 250675acc68SYinan Xu def sllw = "b001_1000".U // sllw: SEXT((src1 << src2)[31:0]) 251675acc68SYinan Xu def srlw = "b001_1001".U // srlw: SEXT((src1[31:0] >> src2)[31:0]) 252675acc68SYinan Xu def sraw = "b001_1010".U // sraw: SEXT((src1[31:0] >> src2)[31:0]) 253675acc68SYinan Xu def rolw = "b001_1100".U 254675acc68SYinan Xu def rorw = "b001_1101".U 255675acc68SYinan Xu 256675acc68SYinan Xu // ADD-op 257675acc68SYinan Xu def adduw = "b010_0000".U // adduw: src1[31:0] + src2 258675acc68SYinan Xu def add = "b010_0001".U // add: src1 + src2 259675acc68SYinan Xu def oddadd = "b010_0010".U // oddadd: src1[0] + src2 260675acc68SYinan Xu 261675acc68SYinan Xu def sr29add = "b010_0100".U // sr29add: src1[63:29] + src2 262675acc68SYinan Xu def sr30add = "b010_0101".U // sr30add: src1[63:30] + src2 263675acc68SYinan Xu def sr31add = "b010_0110".U // sr31add: src1[63:31] + src2 264675acc68SYinan Xu def sr32add = "b010_0111".U // sr32add: src1[63:32] + src2 265675acc68SYinan Xu 266675acc68SYinan Xu def sh1adduw = "b010_1000".U // sh1adduw: {src1[31:0], 1'b0} + src2 267675acc68SYinan Xu def sh1add = "b010_1001".U // sh1add: {src1[62:0], 1'b0} + src2 268675acc68SYinan Xu def sh2adduw = "b010_1010".U // sh2add_uw: {src1[31:0], 2'b0} + src2 269675acc68SYinan Xu def sh2add = "b010_1011".U // sh2add: {src1[61:0], 2'b0} + src2 270675acc68SYinan Xu def sh3adduw = "b010_1100".U // sh3add_uw: {src1[31:0], 3'b0} + src2 271675acc68SYinan Xu def sh3add = "b010_1101".U // sh3add: {src1[60:0], 3'b0} + src2 272675acc68SYinan Xu def sh4add = "b010_1111".U // sh4add: {src1[59:0], 4'b0} + src2 273675acc68SYinan Xu 274675acc68SYinan Xu // SUB-op: src1 - src2 275675acc68SYinan Xu def sub = "b011_0000".U 276675acc68SYinan Xu def sltu = "b011_0001".U 277675acc68SYinan Xu def slt = "b011_0010".U 278675acc68SYinan Xu def maxu = "b011_0100".U 279675acc68SYinan Xu def minu = "b011_0101".U 280675acc68SYinan Xu def max = "b011_0110".U 281675acc68SYinan Xu def min = "b011_0111".U 282675acc68SYinan Xu 283675acc68SYinan Xu // branch 284675acc68SYinan Xu def beq = "b111_0000".U 285675acc68SYinan Xu def bne = "b111_0010".U 286675acc68SYinan Xu def blt = "b111_1000".U 287675acc68SYinan Xu def bge = "b111_1010".U 288675acc68SYinan Xu def bltu = "b111_1100".U 289675acc68SYinan Xu def bgeu = "b111_1110".U 290675acc68SYinan Xu 291675acc68SYinan Xu // misc optype 292675acc68SYinan Xu def and = "b100_0000".U 293675acc68SYinan Xu def andn = "b100_0001".U 294675acc68SYinan Xu def or = "b100_0010".U 295675acc68SYinan Xu def orn = "b100_0011".U 296675acc68SYinan Xu def xor = "b100_0100".U 297675acc68SYinan Xu def xnor = "b100_0101".U 298675acc68SYinan Xu def orcb = "b100_0110".U 299675acc68SYinan Xu 300675acc68SYinan Xu def sextb = "b100_1000".U 301675acc68SYinan Xu def packh = "b100_1001".U 302675acc68SYinan Xu def sexth = "b100_1010".U 303675acc68SYinan Xu def packw = "b100_1011".U 304675acc68SYinan Xu 305675acc68SYinan Xu def revb = "b101_0000".U 306675acc68SYinan Xu def rev8 = "b101_0001".U 307675acc68SYinan Xu def pack = "b101_0010".U 308675acc68SYinan Xu def orh48 = "b101_0011".U 309675acc68SYinan Xu 310675acc68SYinan Xu def szewl1 = "b101_1000".U 311675acc68SYinan Xu def szewl2 = "b101_1001".U 312675acc68SYinan Xu def szewl3 = "b101_1010".U 313675acc68SYinan Xu def byte2 = "b101_1011".U 314675acc68SYinan Xu 315675acc68SYinan Xu def andlsb = "b110_0000".U 316675acc68SYinan Xu def andzexth = "b110_0001".U 317675acc68SYinan Xu def orlsb = "b110_0010".U 318675acc68SYinan Xu def orzexth = "b110_0011".U 319675acc68SYinan Xu def xorlsb = "b110_0100".U 320675acc68SYinan Xu def xorzexth = "b110_0101".U 321675acc68SYinan Xu def orcblsb = "b110_0110".U 322675acc68SYinan Xu def orcbzexth = "b110_0111".U 323675acc68SYinan Xu 324675acc68SYinan Xu def isAddw(func: UInt) = func(6, 4) === "b001".U && !func(3) && !func(1) 325675acc68SYinan Xu def isSimpleLogic(func: UInt) = func(6, 4) === "b100".U && !func(0) 326675acc68SYinan Xu def logicToLsb(func: UInt) = Cat("b110".U(3.W), func(3, 1), 0.U(1.W)) 327675acc68SYinan Xu def logicToZexth(func: UInt) = Cat("b110".U(3.W), func(3, 1), 1.U(1.W)) 328675acc68SYinan Xu def isBranch(func: UInt) = func(6, 4) === "b111".U 329675acc68SYinan Xu def getBranchType(func: UInt) = func(3, 2) 330675acc68SYinan Xu def isBranchInvert(func: UInt) = func(1) 331675acc68SYinan Xu 332675acc68SYinan Xu def apply() = UInt(7.W) 3332225d46eSJiawei Lin } 3342225d46eSJiawei Lin 3352225d46eSJiawei Lin object MDUOpType { 3362225d46eSJiawei Lin // mul 3372225d46eSJiawei Lin // bit encoding: | type (2bit) | isWord(1bit) | opcode(2bit) | 3382225d46eSJiawei Lin def mul = "b00000".U 3392225d46eSJiawei Lin def mulh = "b00001".U 3402225d46eSJiawei Lin def mulhsu = "b00010".U 3412225d46eSJiawei Lin def mulhu = "b00011".U 3422225d46eSJiawei Lin def mulw = "b00100".U 3432225d46eSJiawei Lin 34488825c5cSYinan Xu def mulw7 = "b01100".U 34588825c5cSYinan Xu 3462225d46eSJiawei Lin // div 3472225d46eSJiawei Lin // bit encoding: | type (2bit) | isWord(1bit) | isSign(1bit) | opcode(1bit) | 34888825c5cSYinan Xu def div = "b10000".U 34988825c5cSYinan Xu def divu = "b10010".U 35088825c5cSYinan Xu def rem = "b10001".U 35188825c5cSYinan Xu def remu = "b10011".U 3522225d46eSJiawei Lin 35388825c5cSYinan Xu def divw = "b10100".U 35488825c5cSYinan Xu def divuw = "b10110".U 35588825c5cSYinan Xu def remw = "b10101".U 35688825c5cSYinan Xu def remuw = "b10111".U 3572225d46eSJiawei Lin 35888825c5cSYinan Xu def isMul(op: UInt) = !op(4) 35988825c5cSYinan Xu def isDiv(op: UInt) = op(4) 3602225d46eSJiawei Lin 3612225d46eSJiawei Lin def isDivSign(op: UInt) = isDiv(op) && !op(1) 3622225d46eSJiawei Lin def isW(op: UInt) = op(2) 3632225d46eSJiawei Lin def isH(op: UInt) = (isDiv(op) && op(0)) || (isMul(op) && op(1, 0) =/= 0.U) 3642225d46eSJiawei Lin def getMulOp(op: UInt) = op(1, 0) 3652225d46eSJiawei Lin } 3662225d46eSJiawei Lin 3672225d46eSJiawei Lin object LSUOpType { 368d200f594SWilliam Wang // load pipeline 3692225d46eSJiawei Lin 370d200f594SWilliam Wang // normal load 371d200f594SWilliam Wang // Note: bit(1, 0) are size, DO NOT CHANGE 372d200f594SWilliam Wang // bit encoding: | load 0 | is unsigned(1bit) | size(2bit) | 373d200f594SWilliam Wang def lb = "b0000".U 374d200f594SWilliam Wang def lh = "b0001".U 375d200f594SWilliam Wang def lw = "b0010".U 376d200f594SWilliam Wang def ld = "b0011".U 377d200f594SWilliam Wang def lbu = "b0100".U 378d200f594SWilliam Wang def lhu = "b0101".U 379d200f594SWilliam Wang def lwu = "b0110".U 380ca18a0b4SWilliam Wang 381d200f594SWilliam Wang // Zicbop software prefetch 382d200f594SWilliam Wang // bit encoding: | prefetch 1 | 0 | prefetch type (2bit) | 383d200f594SWilliam Wang def prefetch_i = "b1000".U // TODO 384d200f594SWilliam Wang def prefetch_r = "b1001".U 385d200f594SWilliam Wang def prefetch_w = "b1010".U 386ca18a0b4SWilliam Wang 387d200f594SWilliam Wang def isPrefetch(op: UInt): Bool = op(3) 388d200f594SWilliam Wang 389d200f594SWilliam Wang // store pipeline 390d200f594SWilliam Wang // normal store 391d200f594SWilliam Wang // bit encoding: | store 00 | size(2bit) | 392d200f594SWilliam Wang def sb = "b0000".U 393d200f594SWilliam Wang def sh = "b0001".U 394d200f594SWilliam Wang def sw = "b0010".U 395d200f594SWilliam Wang def sd = "b0011".U 396d200f594SWilliam Wang 397d200f594SWilliam Wang // l1 cache op 398d200f594SWilliam Wang // bit encoding: | cbo_zero 01 | size(2bit) 11 | 399d200f594SWilliam Wang def cbo_zero = "b0111".U 400d200f594SWilliam Wang 401d200f594SWilliam Wang // llc op 402d200f594SWilliam Wang // bit encoding: | prefetch 11 | suboptype(2bit) | 403d200f594SWilliam Wang def cbo_clean = "b1100".U 404d200f594SWilliam Wang def cbo_flush = "b1101".U 405d200f594SWilliam Wang def cbo_inval = "b1110".U 406d200f594SWilliam Wang 407d200f594SWilliam Wang def isCbo(op: UInt): Bool = op(3, 2) === "b11".U 4082225d46eSJiawei Lin 4092225d46eSJiawei Lin // atomics 4102225d46eSJiawei Lin // bit(1, 0) are size 4112225d46eSJiawei Lin // since atomics use a different fu type 4122225d46eSJiawei Lin // so we can safely reuse other load/store's encodings 413d200f594SWilliam Wang // bit encoding: | optype(4bit) | size (2bit) | 4142225d46eSJiawei Lin def lr_w = "b000010".U 4152225d46eSJiawei Lin def sc_w = "b000110".U 4162225d46eSJiawei Lin def amoswap_w = "b001010".U 4172225d46eSJiawei Lin def amoadd_w = "b001110".U 4182225d46eSJiawei Lin def amoxor_w = "b010010".U 4192225d46eSJiawei Lin def amoand_w = "b010110".U 4202225d46eSJiawei Lin def amoor_w = "b011010".U 4212225d46eSJiawei Lin def amomin_w = "b011110".U 4222225d46eSJiawei Lin def amomax_w = "b100010".U 4232225d46eSJiawei Lin def amominu_w = "b100110".U 4242225d46eSJiawei Lin def amomaxu_w = "b101010".U 4252225d46eSJiawei Lin 4262225d46eSJiawei Lin def lr_d = "b000011".U 4272225d46eSJiawei Lin def sc_d = "b000111".U 4282225d46eSJiawei Lin def amoswap_d = "b001011".U 4292225d46eSJiawei Lin def amoadd_d = "b001111".U 4302225d46eSJiawei Lin def amoxor_d = "b010011".U 4312225d46eSJiawei Lin def amoand_d = "b010111".U 4322225d46eSJiawei Lin def amoor_d = "b011011".U 4332225d46eSJiawei Lin def amomin_d = "b011111".U 4342225d46eSJiawei Lin def amomax_d = "b100011".U 4352225d46eSJiawei Lin def amominu_d = "b100111".U 4362225d46eSJiawei Lin def amomaxu_d = "b101011".U 437b6982e83SLemover 438b6982e83SLemover def size(op: UInt) = op(1,0) 4392225d46eSJiawei Lin } 4402225d46eSJiawei Lin 4413feeca58Szfw object BKUOpType { 442ee8ff153Szfw 4433feeca58Szfw def clmul = "b000000".U 4443feeca58Szfw def clmulh = "b000001".U 4453feeca58Szfw def clmulr = "b000010".U 4463feeca58Szfw def xpermn = "b000100".U 4473feeca58Szfw def xpermb = "b000101".U 448ee8ff153Szfw 4493feeca58Szfw def clz = "b001000".U 4503feeca58Szfw def clzw = "b001001".U 4513feeca58Szfw def ctz = "b001010".U 4523feeca58Szfw def ctzw = "b001011".U 4533feeca58Szfw def cpop = "b001100".U 4543feeca58Szfw def cpopw = "b001101".U 45507596dc6Szfw 4563feeca58Szfw // 01xxxx is reserve 4573feeca58Szfw def aes64es = "b100000".U 4583feeca58Szfw def aes64esm = "b100001".U 4593feeca58Szfw def aes64ds = "b100010".U 4603feeca58Szfw def aes64dsm = "b100011".U 4613feeca58Szfw def aes64im = "b100100".U 4623feeca58Szfw def aes64ks1i = "b100101".U 4633feeca58Szfw def aes64ks2 = "b100110".U 4643feeca58Szfw 4653feeca58Szfw // merge to two instruction sm4ks & sm4ed 46619bcce38SFawang Zhang def sm4ed0 = "b101000".U 46719bcce38SFawang Zhang def sm4ed1 = "b101001".U 46819bcce38SFawang Zhang def sm4ed2 = "b101010".U 46919bcce38SFawang Zhang def sm4ed3 = "b101011".U 47019bcce38SFawang Zhang def sm4ks0 = "b101100".U 47119bcce38SFawang Zhang def sm4ks1 = "b101101".U 47219bcce38SFawang Zhang def sm4ks2 = "b101110".U 47319bcce38SFawang Zhang def sm4ks3 = "b101111".U 4743feeca58Szfw 4753feeca58Szfw def sha256sum0 = "b110000".U 4763feeca58Szfw def sha256sum1 = "b110001".U 4773feeca58Szfw def sha256sig0 = "b110010".U 4783feeca58Szfw def sha256sig1 = "b110011".U 4793feeca58Szfw def sha512sum0 = "b110100".U 4803feeca58Szfw def sha512sum1 = "b110101".U 4813feeca58Szfw def sha512sig0 = "b110110".U 4823feeca58Szfw def sha512sig1 = "b110111".U 4833feeca58Szfw 4843feeca58Szfw def sm3p0 = "b111000".U 4853feeca58Szfw def sm3p1 = "b111001".U 486ee8ff153Szfw } 487ee8ff153Szfw 4882225d46eSJiawei Lin object BTBtype { 4892225d46eSJiawei Lin def B = "b00".U // branch 4902225d46eSJiawei Lin def J = "b01".U // jump 4912225d46eSJiawei Lin def I = "b10".U // indirect 4922225d46eSJiawei Lin def R = "b11".U // return 4932225d46eSJiawei Lin 4942225d46eSJiawei Lin def apply() = UInt(2.W) 4952225d46eSJiawei Lin } 4962225d46eSJiawei Lin 4972225d46eSJiawei Lin object SelImm { 498ee8ff153Szfw def IMM_X = "b0111".U 499ee8ff153Szfw def IMM_S = "b0000".U 500ee8ff153Szfw def IMM_SB = "b0001".U 501ee8ff153Szfw def IMM_U = "b0010".U 502ee8ff153Szfw def IMM_UJ = "b0011".U 503ee8ff153Szfw def IMM_I = "b0100".U 504ee8ff153Szfw def IMM_Z = "b0101".U 505ee8ff153Szfw def INVALID_INSTR = "b0110".U 506ee8ff153Szfw def IMM_B6 = "b1000".U 5072225d46eSJiawei Lin 5086e7c9679Shuxuan0307 def X = BitPat("b????") 5096e7c9679Shuxuan0307 510ee8ff153Szfw def apply() = UInt(4.W) 5112225d46eSJiawei Lin } 5122225d46eSJiawei Lin 5136ab6918fSYinan Xu object ExceptionNO { 5146ab6918fSYinan Xu def instrAddrMisaligned = 0 5156ab6918fSYinan Xu def instrAccessFault = 1 5166ab6918fSYinan Xu def illegalInstr = 2 5176ab6918fSYinan Xu def breakPoint = 3 5186ab6918fSYinan Xu def loadAddrMisaligned = 4 5196ab6918fSYinan Xu def loadAccessFault = 5 5206ab6918fSYinan Xu def storeAddrMisaligned = 6 5216ab6918fSYinan Xu def storeAccessFault = 7 5226ab6918fSYinan Xu def ecallU = 8 5236ab6918fSYinan Xu def ecallS = 9 5246ab6918fSYinan Xu def ecallM = 11 5256ab6918fSYinan Xu def instrPageFault = 12 5266ab6918fSYinan Xu def loadPageFault = 13 5276ab6918fSYinan Xu // def singleStep = 14 5286ab6918fSYinan Xu def storePageFault = 15 5296ab6918fSYinan Xu def priorities = Seq( 5306ab6918fSYinan Xu breakPoint, // TODO: different BP has different priority 5316ab6918fSYinan Xu instrPageFault, 5326ab6918fSYinan Xu instrAccessFault, 5336ab6918fSYinan Xu illegalInstr, 5346ab6918fSYinan Xu instrAddrMisaligned, 5356ab6918fSYinan Xu ecallM, ecallS, ecallU, 536d880177dSYinan Xu storeAddrMisaligned, 537d880177dSYinan Xu loadAddrMisaligned, 5386ab6918fSYinan Xu storePageFault, 5396ab6918fSYinan Xu loadPageFault, 5406ab6918fSYinan Xu storeAccessFault, 541d880177dSYinan Xu loadAccessFault 5426ab6918fSYinan Xu ) 5436ab6918fSYinan Xu def all = priorities.distinct.sorted 5446ab6918fSYinan Xu def frontendSet = Seq( 5456ab6918fSYinan Xu instrAddrMisaligned, 5466ab6918fSYinan Xu instrAccessFault, 5476ab6918fSYinan Xu illegalInstr, 5486ab6918fSYinan Xu instrPageFault 5496ab6918fSYinan Xu ) 5506ab6918fSYinan Xu def partialSelect(vec: Vec[Bool], select: Seq[Int]): Vec[Bool] = { 5516ab6918fSYinan Xu val new_vec = Wire(ExceptionVec()) 5526ab6918fSYinan Xu new_vec.foreach(_ := false.B) 5536ab6918fSYinan Xu select.foreach(i => new_vec(i) := vec(i)) 5546ab6918fSYinan Xu new_vec 5556ab6918fSYinan Xu } 5566ab6918fSYinan Xu def selectFrontend(vec: Vec[Bool]): Vec[Bool] = partialSelect(vec, frontendSet) 5576ab6918fSYinan Xu def selectAll(vec: Vec[Bool]): Vec[Bool] = partialSelect(vec, ExceptionNO.all) 5586ab6918fSYinan Xu def selectByFu(vec:Vec[Bool], fuConfig: FuConfig): Vec[Bool] = 5596ab6918fSYinan Xu partialSelect(vec, fuConfig.exceptionOut) 5606ab6918fSYinan Xu def selectByExu(vec:Vec[Bool], exuConfig: ExuConfig): Vec[Bool] = 5616ab6918fSYinan Xu partialSelect(vec, exuConfig.exceptionOut) 5626ab6918fSYinan Xu def selectByExu(vec:Vec[Bool], exuConfigs: Seq[ExuConfig]): Vec[Bool] = 5636ab6918fSYinan Xu partialSelect(vec, exuConfigs.map(_.exceptionOut).reduce(_ ++ _).distinct.sorted) 5646ab6918fSYinan Xu } 5656ab6918fSYinan Xu 5661c62c387SYinan Xu def dividerGen(p: Parameters) = new DividerWrapper(p(XLen))(p) 567c3d7991bSJiawei Lin def multiplierGen(p: Parameters) = new ArrayMultiplier(p(XLen) + 1)(p) 5682225d46eSJiawei Lin def aluGen(p: Parameters) = new Alu()(p) 5693feeca58Szfw def bkuGen(p: Parameters) = new Bku()(p) 5702225d46eSJiawei Lin def jmpGen(p: Parameters) = new Jump()(p) 5712225d46eSJiawei Lin def fenceGen(p: Parameters) = new Fence()(p) 5722225d46eSJiawei Lin def csrGen(p: Parameters) = new CSR()(p) 5732225d46eSJiawei Lin def i2fGen(p: Parameters) = new IntToFP()(p) 5742225d46eSJiawei Lin def fmacGen(p: Parameters) = new FMA()(p) 5752225d46eSJiawei Lin def f2iGen(p: Parameters) = new FPToInt()(p) 5762225d46eSJiawei Lin def f2fGen(p: Parameters) = new FPToFP()(p) 5772225d46eSJiawei Lin def fdivSqrtGen(p: Parameters) = new FDivSqrt()(p) 57885b4cd54SYinan Xu def stdGen(p: Parameters) = new Std()(p) 5796ab6918fSYinan Xu def mouDataGen(p: Parameters) = new Std()(p) 5802225d46eSJiawei Lin 5816cdd85d9SYinan Xu def f2iSel(uop: MicroOp): Bool = { 5826cdd85d9SYinan Xu uop.ctrl.rfWen 5832225d46eSJiawei Lin } 5842225d46eSJiawei Lin 5856cdd85d9SYinan Xu def i2fSel(uop: MicroOp): Bool = { 5866cdd85d9SYinan Xu uop.ctrl.fpu.fromInt 5872225d46eSJiawei Lin } 5882225d46eSJiawei Lin 5896cdd85d9SYinan Xu def f2fSel(uop: MicroOp): Bool = { 5906cdd85d9SYinan Xu val ctrl = uop.ctrl.fpu 5912225d46eSJiawei Lin ctrl.fpWen && !ctrl.div && !ctrl.sqrt 5922225d46eSJiawei Lin } 5932225d46eSJiawei Lin 5946cdd85d9SYinan Xu def fdivSqrtSel(uop: MicroOp): Bool = { 5956cdd85d9SYinan Xu val ctrl = uop.ctrl.fpu 5962225d46eSJiawei Lin ctrl.div || ctrl.sqrt 5972225d46eSJiawei Lin } 5982225d46eSJiawei Lin 5992225d46eSJiawei Lin val aluCfg = FuConfig( 6001a0f06eeSYinan Xu name = "alu", 6012225d46eSJiawei Lin fuGen = aluGen, 6026cdd85d9SYinan Xu fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.alu, 6032225d46eSJiawei Lin fuType = FuType.alu, 6042225d46eSJiawei Lin numIntSrc = 2, 6052225d46eSJiawei Lin numFpSrc = 0, 6062225d46eSJiawei Lin writeIntRf = true, 6072225d46eSJiawei Lin writeFpRf = false, 6082225d46eSJiawei Lin hasRedirect = true, 6092225d46eSJiawei Lin ) 6102225d46eSJiawei Lin 6112225d46eSJiawei Lin val jmpCfg = FuConfig( 6121a0f06eeSYinan Xu name = "jmp", 6132225d46eSJiawei Lin fuGen = jmpGen, 6146cdd85d9SYinan Xu fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.jmp, 6152225d46eSJiawei Lin fuType = FuType.jmp, 6162225d46eSJiawei Lin numIntSrc = 1, 6172225d46eSJiawei Lin numFpSrc = 0, 6182225d46eSJiawei Lin writeIntRf = true, 6192225d46eSJiawei Lin writeFpRf = false, 6202225d46eSJiawei Lin hasRedirect = true, 6212225d46eSJiawei Lin ) 6222225d46eSJiawei Lin 6232225d46eSJiawei Lin val fenceCfg = FuConfig( 6241a0f06eeSYinan Xu name = "fence", 6252225d46eSJiawei Lin fuGen = fenceGen, 6266cdd85d9SYinan Xu fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.fence, 6276ab6918fSYinan Xu FuType.fence, 2, 0, writeIntRf = false, writeFpRf = false, 628f1fe8698SLemover latency = UncertainLatency(), exceptionOut = Seq(illegalInstr), // TODO: need rewrite latency structure, not just this value, 629f1fe8698SLemover flushPipe = true 6302225d46eSJiawei Lin ) 6312225d46eSJiawei Lin 6322225d46eSJiawei Lin val csrCfg = FuConfig( 6331a0f06eeSYinan Xu name = "csr", 6342225d46eSJiawei Lin fuGen = csrGen, 6356cdd85d9SYinan Xu fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.csr, 6362225d46eSJiawei Lin fuType = FuType.csr, 6372225d46eSJiawei Lin numIntSrc = 1, 6382225d46eSJiawei Lin numFpSrc = 0, 6392225d46eSJiawei Lin writeIntRf = true, 6402225d46eSJiawei Lin writeFpRf = false, 6416ab6918fSYinan Xu exceptionOut = Seq(illegalInstr, breakPoint, ecallU, ecallS, ecallM), 6426ab6918fSYinan Xu flushPipe = true 6432225d46eSJiawei Lin ) 6442225d46eSJiawei Lin 6452225d46eSJiawei Lin val i2fCfg = FuConfig( 6461a0f06eeSYinan Xu name = "i2f", 6472225d46eSJiawei Lin fuGen = i2fGen, 6482225d46eSJiawei Lin fuSel = i2fSel, 6492225d46eSJiawei Lin FuType.i2f, 6502225d46eSJiawei Lin numIntSrc = 1, 6512225d46eSJiawei Lin numFpSrc = 0, 6522225d46eSJiawei Lin writeIntRf = false, 6532225d46eSJiawei Lin writeFpRf = true, 6546ab6918fSYinan Xu writeFflags = true, 655e174d629SJiawei Lin latency = CertainLatency(2), 656e174d629SJiawei Lin fastUopOut = true, fastImplemented = true 6572225d46eSJiawei Lin ) 6582225d46eSJiawei Lin 6592225d46eSJiawei Lin val divCfg = FuConfig( 6601a0f06eeSYinan Xu name = "div", 6612225d46eSJiawei Lin fuGen = dividerGen, 66207596dc6Szfw fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.div, 6632225d46eSJiawei Lin FuType.div, 6642225d46eSJiawei Lin 2, 6652225d46eSJiawei Lin 0, 6662225d46eSJiawei Lin writeIntRf = true, 6672225d46eSJiawei Lin writeFpRf = false, 668f83b578aSYinan Xu latency = UncertainLatency(), 669f83b578aSYinan Xu fastUopOut = true, 6701c62c387SYinan Xu fastImplemented = true, 6715ee7cabeSYinan Xu hasInputBuffer = (true, 4, true) 6722225d46eSJiawei Lin ) 6732225d46eSJiawei Lin 6742225d46eSJiawei Lin val mulCfg = FuConfig( 6751a0f06eeSYinan Xu name = "mul", 6762225d46eSJiawei Lin fuGen = multiplierGen, 67707596dc6Szfw fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.mul, 6782225d46eSJiawei Lin FuType.mul, 6792225d46eSJiawei Lin 2, 6802225d46eSJiawei Lin 0, 6812225d46eSJiawei Lin writeIntRf = true, 6822225d46eSJiawei Lin writeFpRf = false, 683b2482bc1SYinan Xu latency = CertainLatency(2), 684f83b578aSYinan Xu fastUopOut = true, 685b2482bc1SYinan Xu fastImplemented = true 6862225d46eSJiawei Lin ) 6872225d46eSJiawei Lin 6883feeca58Szfw val bkuCfg = FuConfig( 6893feeca58Szfw name = "bku", 6903feeca58Szfw fuGen = bkuGen, 6913feeca58Szfw fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.bku, 6923feeca58Szfw fuType = FuType.bku, 693ee8ff153Szfw numIntSrc = 2, 694ee8ff153Szfw numFpSrc = 0, 695ee8ff153Szfw writeIntRf = true, 696ee8ff153Szfw writeFpRf = false, 697f83b578aSYinan Xu latency = CertainLatency(1), 698f83b578aSYinan Xu fastUopOut = true, 69907596dc6Szfw fastImplemented = true 700ee8ff153Szfw ) 701ee8ff153Szfw 7022225d46eSJiawei Lin val fmacCfg = FuConfig( 7031a0f06eeSYinan Xu name = "fmac", 7042225d46eSJiawei Lin fuGen = fmacGen, 7052225d46eSJiawei Lin fuSel = _ => true.B, 7066ab6918fSYinan Xu FuType.fmac, 0, 3, writeIntRf = false, writeFpRf = true, writeFflags = true, 7074b65fc7eSJiawei Lin latency = UncertainLatency(), fastUopOut = true, fastImplemented = true 7082225d46eSJiawei Lin ) 7092225d46eSJiawei Lin 7102225d46eSJiawei Lin val f2iCfg = FuConfig( 7111a0f06eeSYinan Xu name = "f2i", 7122225d46eSJiawei Lin fuGen = f2iGen, 7132225d46eSJiawei Lin fuSel = f2iSel, 7146ab6918fSYinan Xu FuType.fmisc, 0, 1, writeIntRf = true, writeFpRf = false, writeFflags = true, latency = CertainLatency(2), 715b2482bc1SYinan Xu fastUopOut = true, fastImplemented = true 7162225d46eSJiawei Lin ) 7172225d46eSJiawei Lin 7182225d46eSJiawei Lin val f2fCfg = FuConfig( 7191a0f06eeSYinan Xu name = "f2f", 7202225d46eSJiawei Lin fuGen = f2fGen, 7212225d46eSJiawei Lin fuSel = f2fSel, 7226ab6918fSYinan Xu FuType.fmisc, 0, 1, writeIntRf = false, writeFpRf = true, writeFflags = true, latency = CertainLatency(2), 723b2482bc1SYinan Xu fastUopOut = true, fastImplemented = true 7242225d46eSJiawei Lin ) 7252225d46eSJiawei Lin 7262225d46eSJiawei Lin val fdivSqrtCfg = FuConfig( 7271a0f06eeSYinan Xu name = "fdivSqrt", 7282225d46eSJiawei Lin fuGen = fdivSqrtGen, 7292225d46eSJiawei Lin fuSel = fdivSqrtSel, 7306ab6918fSYinan Xu FuType.fDivSqrt, 0, 2, writeIntRf = false, writeFpRf = true, writeFflags = true, latency = UncertainLatency(), 731140aff85SYinan Xu fastUopOut = true, fastImplemented = true, hasInputBuffer = (true, 8, true) 7322225d46eSJiawei Lin ) 7332225d46eSJiawei Lin 7342225d46eSJiawei Lin val lduCfg = FuConfig( 7351a0f06eeSYinan Xu "ldu", 7362225d46eSJiawei Lin null, // DontCare 7372b4e8253SYinan Xu (uop: MicroOp) => FuType.loadCanAccept(uop.ctrl.fuType), 7386ab6918fSYinan Xu FuType.ldu, 1, 0, writeIntRf = true, writeFpRf = true, 7396ab6918fSYinan Xu latency = UncertainLatency(), 7406ab6918fSYinan Xu exceptionOut = Seq(loadAddrMisaligned, loadAccessFault, loadPageFault), 7416ab6918fSYinan Xu flushPipe = true, 7426786cfb7SWilliam Wang replayInst = true, 7436786cfb7SWilliam Wang hasLoadError = true 7442225d46eSJiawei Lin ) 7452225d46eSJiawei Lin 74685b4cd54SYinan Xu val staCfg = FuConfig( 7471a0f06eeSYinan Xu "sta", 7482225d46eSJiawei Lin null, 7492b4e8253SYinan Xu (uop: MicroOp) => FuType.storeCanAccept(uop.ctrl.fuType), 7506ab6918fSYinan Xu FuType.stu, 1, 0, writeIntRf = false, writeFpRf = false, 7516ab6918fSYinan Xu latency = UncertainLatency(), 7526ab6918fSYinan Xu exceptionOut = Seq(storeAddrMisaligned, storeAccessFault, storePageFault) 7532225d46eSJiawei Lin ) 7542225d46eSJiawei Lin 75585b4cd54SYinan Xu val stdCfg = FuConfig( 7561a0f06eeSYinan Xu "std", 7572b4e8253SYinan Xu fuGen = stdGen, fuSel = (uop: MicroOp) => FuType.storeCanAccept(uop.ctrl.fuType), FuType.stu, 1, 1, 7586ab6918fSYinan Xu writeIntRf = false, writeFpRf = false, latency = CertainLatency(1) 75985b4cd54SYinan Xu ) 76085b4cd54SYinan Xu 7612225d46eSJiawei Lin val mouCfg = FuConfig( 7621a0f06eeSYinan Xu "mou", 7632225d46eSJiawei Lin null, 7642b4e8253SYinan Xu (uop: MicroOp) => FuType.storeCanAccept(uop.ctrl.fuType), 7656ab6918fSYinan Xu FuType.mou, 1, 0, writeIntRf = false, writeFpRf = false, 7666ab6918fSYinan Xu latency = UncertainLatency(), exceptionOut = lduCfg.exceptionOut ++ staCfg.exceptionOut 7672b4e8253SYinan Xu ) 7682b4e8253SYinan Xu 7692b4e8253SYinan Xu val mouDataCfg = FuConfig( 7702b4e8253SYinan Xu "mou", 7712b4e8253SYinan Xu mouDataGen, 7722b4e8253SYinan Xu (uop: MicroOp) => FuType.storeCanAccept(uop.ctrl.fuType), 7736ab6918fSYinan Xu FuType.mou, 1, 0, writeIntRf = false, writeFpRf = false, 7746ab6918fSYinan Xu latency = UncertainLatency() 7752225d46eSJiawei Lin ) 7762225d46eSJiawei Lin 777adb5df20SYinan Xu val JumpExeUnitCfg = ExuConfig("JmpExeUnit", "Int", Seq(jmpCfg, i2fCfg), 2, Int.MaxValue) 778b6220f0dSLemover val AluExeUnitCfg = ExuConfig("AluExeUnit", "Int", Seq(aluCfg), 0, Int.MaxValue) 779adb5df20SYinan Xu val JumpCSRExeUnitCfg = ExuConfig("JmpCSRExeUnit", "Int", Seq(jmpCfg, csrCfg, fenceCfg, i2fCfg), 2, Int.MaxValue) 7803feeca58Szfw val MulDivExeUnitCfg = ExuConfig("MulDivExeUnit", "Int", Seq(mulCfg, divCfg, bkuCfg), 1, Int.MaxValue) 781b6220f0dSLemover val FmacExeUnitCfg = ExuConfig("FmacExeUnit", "Fp", Seq(fmacCfg), Int.MaxValue, 0) 7822225d46eSJiawei Lin val FmiscExeUnitCfg = ExuConfig( 7832225d46eSJiawei Lin "FmiscExeUnit", 784b6220f0dSLemover "Fp", 7852225d46eSJiawei Lin Seq(f2iCfg, f2fCfg, fdivSqrtCfg), 7862225d46eSJiawei Lin Int.MaxValue, 1 7872225d46eSJiawei Lin ) 7882b4e8253SYinan Xu val LdExeUnitCfg = ExuConfig("LoadExu", "Mem", Seq(lduCfg), wbIntPriority = 0, wbFpPriority = 0, extendsExu = false) 7892b4e8253SYinan Xu val StaExeUnitCfg = ExuConfig("StaExu", "Mem", Seq(staCfg, mouCfg), wbIntPriority = Int.MaxValue, wbFpPriority = Int.MaxValue, extendsExu = false) 7902b4e8253SYinan Xu val StdExeUnitCfg = ExuConfig("StdExu", "Mem", Seq(stdCfg, mouDataCfg), wbIntPriority = Int.MaxValue, wbFpPriority = Int.MaxValue, extendsExu = false) 791*d2b20d1aSTang Haojin 792*d2b20d1aSTang Haojin // indicates where the memory access request comes from 793*d2b20d1aSTang Haojin // a dupliacte of this is in HuanCun.common and CoupledL2.common 794*d2b20d1aSTang Haojin // TODO: consider moving it to Utility, so that they could share the same definition 795*d2b20d1aSTang Haojin object MemReqSource extends Enumeration { 796*d2b20d1aSTang Haojin val NoWhere = Value("NoWhere") 797*d2b20d1aSTang Haojin 798*d2b20d1aSTang Haojin val CPUInst = Value("CPUInst") 799*d2b20d1aSTang Haojin val CPULoadData = Value("CPULoadData") 800*d2b20d1aSTang Haojin val CPUStoreData = Value("CPUStoreData") 801*d2b20d1aSTang Haojin val CPUAtomicData = Value("CPUAtomicData") 802*d2b20d1aSTang Haojin val L1InstPrefetch = Value("L1InstPrefetch") 803*d2b20d1aSTang Haojin val L1DataPrefetch = Value("L1DataPrefetch") 804*d2b20d1aSTang Haojin val PTW = Value("PTW") 805*d2b20d1aSTang Haojin val L2Prefetch = Value("L2Prefetch") 806*d2b20d1aSTang Haojin val ReqSourceCount = Value("ReqSourceCount") 807*d2b20d1aSTang Haojin 808*d2b20d1aSTang Haojin val reqSourceBits = log2Ceil(ReqSourceCount.id) 809*d2b20d1aSTang Haojin } 810*d2b20d1aSTang Haojin 811*d2b20d1aSTang Haojin object TopDownCounters extends Enumeration { 812*d2b20d1aSTang Haojin val NoStall = Value("NoStall") // Base 813*d2b20d1aSTang Haojin // frontend 814*d2b20d1aSTang Haojin val OverrideBubble = Value("OverrideBubble") 815*d2b20d1aSTang Haojin val FtqUpdateBubble = Value("FtqUpdateBubble") 816*d2b20d1aSTang Haojin // val ControlRedirectBubble = Value("ControlRedirectBubble") 817*d2b20d1aSTang Haojin val TAGEMissBubble = Value("TAGEMissBubble") 818*d2b20d1aSTang Haojin val SCMissBubble = Value("SCMissBubble") 819*d2b20d1aSTang Haojin val ITTAGEMissBubble = Value("ITTAGEMissBubble") 820*d2b20d1aSTang Haojin val RASMissBubble = Value("RASMissBubble") 821*d2b20d1aSTang Haojin val MemVioRedirectBubble = Value("MemVioRedirectBubble") 822*d2b20d1aSTang Haojin val OtherRedirectBubble = Value("OtherRedirectBubble") 823*d2b20d1aSTang Haojin val FtqFullStall = Value("FtqFullStall") 824*d2b20d1aSTang Haojin 825*d2b20d1aSTang Haojin val ICacheMissBubble = Value("ICacheMissBubble") 826*d2b20d1aSTang Haojin val ITLBMissBubble = Value("ITLBMissBubble") 827*d2b20d1aSTang Haojin val BTBMissBubble = Value("BTBMissBubble") 828*d2b20d1aSTang Haojin val FetchFragBubble = Value("FetchFragBubble") 829*d2b20d1aSTang Haojin 830*d2b20d1aSTang Haojin // backend 831*d2b20d1aSTang Haojin // long inst stall at rob head 832*d2b20d1aSTang Haojin val DivStall = Value("DivStall") // int div, float div/sqrt 833*d2b20d1aSTang Haojin val IntNotReadyStall = Value("IntNotReadyStall") // int-inst at rob head not issue 834*d2b20d1aSTang Haojin val FPNotReadyStall = Value("FPNotReadyStall") // fp-inst at rob head not issue 835*d2b20d1aSTang Haojin val MemNotReadyStall = Value("MemNotReadyStall") // mem-inst at rob head not issue 836*d2b20d1aSTang Haojin // freelist full 837*d2b20d1aSTang Haojin val IntFlStall = Value("IntFlStall") 838*d2b20d1aSTang Haojin val FpFlStall = Value("FpFlStall") 839*d2b20d1aSTang Haojin // dispatch queue full 840*d2b20d1aSTang Haojin val IntDqStall = Value("IntDqStall") 841*d2b20d1aSTang Haojin val FpDqStall = Value("FpDqStall") 842*d2b20d1aSTang Haojin val LsDqStall = Value("LsDqStall") 843*d2b20d1aSTang Haojin 844*d2b20d1aSTang Haojin // memblock 845*d2b20d1aSTang Haojin val LoadTLBStall = Value("LoadTLBStall") 846*d2b20d1aSTang Haojin val LoadL1Stall = Value("LoadL1Stall") 847*d2b20d1aSTang Haojin val LoadL2Stall = Value("LoadL2Stall") 848*d2b20d1aSTang Haojin val LoadL3Stall = Value("LoadL3Stall") 849*d2b20d1aSTang Haojin val LoadMemStall = Value("LoadMemStall") 850*d2b20d1aSTang Haojin val StoreStall = Value("StoreStall") // include store tlb miss 851*d2b20d1aSTang Haojin val AtomicStall = Value("AtomicStall") // atomic, load reserved, store conditional 852*d2b20d1aSTang Haojin 853*d2b20d1aSTang Haojin // xs replay (different to gem5) 854*d2b20d1aSTang Haojin val LoadVioReplayStall = Value("LoadVioReplayStall") 855*d2b20d1aSTang Haojin val LoadMSHRReplayStall = Value("LoadMSHRReplayStall") 856*d2b20d1aSTang Haojin 857*d2b20d1aSTang Haojin // bad speculation 858*d2b20d1aSTang Haojin val ControlRecoveryStall = Value("ControlRecoveryStall") 859*d2b20d1aSTang Haojin val MemVioRecoveryStall = Value("MemVioRecoveryStall") 860*d2b20d1aSTang Haojin val OtherRecoveryStall = Value("OtherRecoveryStall") 861*d2b20d1aSTang Haojin 862*d2b20d1aSTang Haojin val FlushedInsts = Value("FlushedInsts") // control flushed, memvio flushed, others 863*d2b20d1aSTang Haojin 864*d2b20d1aSTang Haojin val OtherCoreStall = Value("OtherCoreStall") 865*d2b20d1aSTang Haojin 866*d2b20d1aSTang Haojin val NumStallReasons = Value("NumStallReasons") 867*d2b20d1aSTang Haojin } 8689a2e6b8aSLinJiawei} 869