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._ 196ab6918fSYinan Xuimport xiangshan.ExceptionNO._ 202225d46eSJiawei Linimport xiangshan.backend.fu._ 212225d46eSJiawei Linimport xiangshan.backend.fu.fpu._ 226827759bSZhangZifeiimport xiangshan.backend.fu.vector._ 238f3b164bSXuan Huimport xiangshan.backend.issue._ 24730cfbc0SXuan Huimport xiangshan.backend.fu.FuConfig 252225d46eSJiawei Lin 269a2e6b8aSLinJiaweipackage object xiangshan { 279ee9f926SYikeZhou object SrcType { 281285b047SXuan Hu def imm = "b000".U 291285b047SXuan Hu def pc = "b000".U 301285b047SXuan Hu def xp = "b001".U 311285b047SXuan Hu def fp = "b010".U 321285b047SXuan Hu def vp = "b100".U 33*72d67441SXuan Hu def no = "b000".U // this src read no reg but cannot be Any value 3404b56283SZhangZifei 351285b047SXuan Hu // alias 361285b047SXuan Hu def reg = this.xp 371a3df1feSYikeZhou def DC = imm // Don't Care 3857a10886SXuan Hu def X = BitPat("b000") 394d24c305SYikeZhou 4004b56283SZhangZifei def isPc(srcType: UInt) = srcType===pc 4104b56283SZhangZifei def isImm(srcType: UInt) = srcType===imm 421285b047SXuan Hu def isReg(srcType: UInt) = srcType(0) 439ca09953SXuan Hu def isXp(srcType: UInt) = srcType(0) 442b4e8253SYinan Xu def isFp(srcType: UInt) = srcType(1) 451285b047SXuan Hu def isVp(srcType: UInt) = srcType(2) 461285b047SXuan Hu def isPcOrImm(srcType: UInt) = isPc(srcType) || isImm(srcType) 479ca09953SXuan Hu def isNotReg(srcType: UInt): Bool = !srcType.orR 48351e22f2SXuan Hu def isVfp(srcType: UInt) = isVp(srcType) || isFp(srcType) 491285b047SXuan Hu def apply() = UInt(3.W) 509a2e6b8aSLinJiawei } 519a2e6b8aSLinJiawei 529a2e6b8aSLinJiawei object SrcState { 53100aa93cSYinan Xu def busy = "b0".U 54100aa93cSYinan Xu def rdy = "b1".U 55100aa93cSYinan Xu // def specRdy = "b10".U // speculative ready, for future use 56100aa93cSYinan Xu def apply() = UInt(1.W) 579ca09953SXuan Hu 589ca09953SXuan Hu def isReady(state: UInt): Bool = state === this.rdy 599ca09953SXuan Hu def isBusy(state: UInt): Bool = state === this.busy 609a2e6b8aSLinJiawei } 619a2e6b8aSLinJiawei 629019e3efSXuan Hu def FuOpTypeWidth = 9 632225d46eSJiawei Lin object FuOpType { 6457a10886SXuan Hu def apply() = UInt(FuOpTypeWidth.W) 6557a10886SXuan Hu def X = BitPat("b00000000") 66ebd97ecbSzhanglinjuan } 67518d8658SYinan Xu 687f2b7720SXuan Hu object VlduType { 6957a10886SXuan Hu def dummy = 0.U 707f2b7720SXuan Hu } 717f2b7720SXuan Hu 727f2b7720SXuan Hu object VstuType { 7357a10886SXuan Hu def dummy = 0.U 747f2b7720SXuan Hu } 757f2b7720SXuan Hu 76a3edac52SYinan Xu object CommitType { 77c3abb8b6SYinan Xu def NORMAL = "b000".U // int/fp 78c3abb8b6SYinan Xu def BRANCH = "b001".U // branch 79c3abb8b6SYinan Xu def LOAD = "b010".U // load 80c3abb8b6SYinan Xu def STORE = "b011".U // store 81518d8658SYinan Xu 82c3abb8b6SYinan Xu def apply() = UInt(3.W) 83c3abb8b6SYinan Xu def isFused(commitType: UInt): Bool = commitType(2) 84c3abb8b6SYinan Xu def isLoadStore(commitType: UInt): Bool = !isFused(commitType) && commitType(1) 85c3abb8b6SYinan Xu def lsInstIsStore(commitType: UInt): Bool = commitType(0) 86c3abb8b6SYinan Xu def isStore(commitType: UInt): Bool = isLoadStore(commitType) && lsInstIsStore(commitType) 87c3abb8b6SYinan Xu def isBranch(commitType: UInt): Bool = commitType(0) && !commitType(1) && !isFused(commitType) 88518d8658SYinan Xu } 89bfb958a3SYinan Xu 90bfb958a3SYinan Xu object RedirectLevel { 912d7c7105SYinan Xu def flushAfter = "b0".U 922d7c7105SYinan Xu def flush = "b1".U 93bfb958a3SYinan Xu 942d7c7105SYinan Xu def apply() = UInt(1.W) 952d7c7105SYinan Xu // def isUnconditional(level: UInt) = level(1) 96bfb958a3SYinan Xu def flushItself(level: UInt) = level(0) 972d7c7105SYinan Xu // def isException(level: UInt) = level(1) && level(0) 98bfb958a3SYinan Xu } 99baf8def6SYinan Xu 100baf8def6SYinan Xu object ExceptionVec { 101da3bf434SMaxpicca-Li val ExceptionVecSize = 16 102da3bf434SMaxpicca-Li def apply() = Vec(ExceptionVecSize, Bool()) 103baf8def6SYinan Xu } 104a8e04b1dSYinan Xu 105c60c1ab4SWilliam Wang object PMAMode { 1068d9a04fcSWilliam Wang def R = "b1".U << 0 //readable 1078d9a04fcSWilliam Wang def W = "b1".U << 1 //writeable 1088d9a04fcSWilliam Wang def X = "b1".U << 2 //executable 1098d9a04fcSWilliam Wang def I = "b1".U << 3 //cacheable: icache 1108d9a04fcSWilliam Wang def D = "b1".U << 4 //cacheable: dcache 1118d9a04fcSWilliam Wang def S = "b1".U << 5 //enable speculative access 112cff68e26SWilliam Wang def A = "b1".U << 6 //enable atomic operation, A imply R & W 1138d9a04fcSWilliam Wang def C = "b1".U << 7 //if it is cacheable is configable 114c60c1ab4SWilliam Wang def Reserved = "b0".U 115c60c1ab4SWilliam Wang 116c60c1ab4SWilliam Wang def apply() = UInt(7.W) 117c60c1ab4SWilliam Wang 118c60c1ab4SWilliam Wang def read(mode: UInt) = mode(0) 119c60c1ab4SWilliam Wang def write(mode: UInt) = mode(1) 120c60c1ab4SWilliam Wang def execute(mode: UInt) = mode(2) 121c60c1ab4SWilliam Wang def icache(mode: UInt) = mode(3) 122c60c1ab4SWilliam Wang def dcache(mode: UInt) = mode(4) 123c60c1ab4SWilliam Wang def speculate(mode: UInt) = mode(5) 124c60c1ab4SWilliam Wang def atomic(mode: UInt) = mode(6) 125c60c1ab4SWilliam Wang def configable_cache(mode: UInt) = mode(7) 126c60c1ab4SWilliam Wang 127c60c1ab4SWilliam Wang def strToMode(s: String) = { 128423b9255SWilliam Wang var result = 0.U(8.W) 129c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("R") >= 0) result = result + R 130c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("W") >= 0) result = result + W 131c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("X") >= 0) result = result + X 132c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("I") >= 0) result = result + I 133c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("D") >= 0) result = result + D 134c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("S") >= 0) result = result + S 135c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("A") >= 0) result = result + A 136c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("C") >= 0) result = result + C 137c60c1ab4SWilliam Wang result 138c60c1ab4SWilliam Wang } 139c60c1ab4SWilliam Wang } 1402225d46eSJiawei Lin 1412225d46eSJiawei Lin 1422225d46eSJiawei Lin object CSROpType { 1432225d46eSJiawei Lin def jmp = "b000".U 1442225d46eSJiawei Lin def wrt = "b001".U 1452225d46eSJiawei Lin def set = "b010".U 1462225d46eSJiawei Lin def clr = "b011".U 147b6900d94SYinan Xu def wfi = "b100".U 1482225d46eSJiawei Lin def wrti = "b101".U 1492225d46eSJiawei Lin def seti = "b110".U 1502225d46eSJiawei Lin def clri = "b111".U 1515d669833SYinan Xu def needAccess(op: UInt): Bool = op(1, 0) =/= 0.U 1522225d46eSJiawei Lin } 1532225d46eSJiawei Lin 1542225d46eSJiawei Lin // jump 1552225d46eSJiawei Lin object JumpOpType { 1562225d46eSJiawei Lin def jal = "b00".U 1572225d46eSJiawei Lin def jalr = "b01".U 1582225d46eSJiawei Lin def auipc = "b10".U 1592225d46eSJiawei Lin// def call = "b11_011".U 1602225d46eSJiawei Lin// def ret = "b11_100".U 1612225d46eSJiawei Lin def jumpOpisJalr(op: UInt) = op(0) 1622225d46eSJiawei Lin def jumpOpisAuipc(op: UInt) = op(1) 1632225d46eSJiawei Lin } 1642225d46eSJiawei Lin 1652225d46eSJiawei Lin object FenceOpType { 1662225d46eSJiawei Lin def fence = "b10000".U 1672225d46eSJiawei Lin def sfence = "b10001".U 1682225d46eSJiawei Lin def fencei = "b10010".U 169af2f7849Shappy-lx def nofence= "b00000".U 1702225d46eSJiawei Lin } 1712225d46eSJiawei Lin 1722225d46eSJiawei Lin object ALUOpType { 173ee8ff153Szfw // shift optype 174675acc68SYinan Xu def slliuw = "b000_0000".U // slliuw: ZEXT(src1[31:0]) << shamt 175675acc68SYinan Xu def sll = "b000_0001".U // sll: src1 << src2 176ee8ff153Szfw 177675acc68SYinan Xu def bclr = "b000_0010".U // bclr: src1 & ~(1 << src2[5:0]) 178675acc68SYinan Xu def bset = "b000_0011".U // bset: src1 | (1 << src2[5:0]) 179675acc68SYinan Xu def binv = "b000_0100".U // binv: src1 ^ ~(1 << src2[5:0]) 180ee8ff153Szfw 181675acc68SYinan Xu def srl = "b000_0101".U // srl: src1 >> src2 182675acc68SYinan Xu def bext = "b000_0110".U // bext: (src1 >> src2)[0] 183675acc68SYinan Xu def sra = "b000_0111".U // sra: src1 >> src2 (arithmetic) 184ee8ff153Szfw 1857b441e5eSYinan Xu def rol = "b000_1001".U // rol: (src1 << src2) | (src1 >> (xlen - src2)) 1867b441e5eSYinan Xu def ror = "b000_1011".U // ror: (src1 >> src2) | (src1 << (xlen - src2)) 187184a1958Szfw 188ee8ff153Szfw // RV64 32bit optype 189675acc68SYinan Xu def addw = "b001_0000".U // addw: SEXT((src1 + src2)[31:0]) 190675acc68SYinan Xu def oddaddw = "b001_0001".U // oddaddw: SEXT((src1[0] + src2)[31:0]) 191675acc68SYinan Xu def subw = "b001_0010".U // subw: SEXT((src1 - src2)[31:0]) 19254711376Ssinsanction def lui32addw = "b001_0011".U // lui32addw: SEXT(SEXT(src2[11:0], 32) + {src2[31:12], 12'b0}, 64) 193ee8ff153Szfw 194675acc68SYinan Xu def addwbit = "b001_0100".U // addwbit: (src1 + src2)[0] 195675acc68SYinan Xu def addwbyte = "b001_0101".U // addwbyte: (src1 + src2)[7:0] 196675acc68SYinan Xu def addwzexth = "b001_0110".U // addwzexth: ZEXT((src1 + src2)[15:0]) 197675acc68SYinan Xu def addwsexth = "b001_0111".U // addwsexth: SEXT((src1 + src2)[15:0]) 198ee8ff153Szfw 199675acc68SYinan Xu def sllw = "b001_1000".U // sllw: SEXT((src1 << src2)[31:0]) 200675acc68SYinan Xu def srlw = "b001_1001".U // srlw: SEXT((src1[31:0] >> src2)[31:0]) 201675acc68SYinan Xu def sraw = "b001_1010".U // sraw: SEXT((src1[31:0] >> src2)[31:0]) 202675acc68SYinan Xu def rolw = "b001_1100".U 203675acc68SYinan Xu def rorw = "b001_1101".U 204675acc68SYinan Xu 205675acc68SYinan Xu // ADD-op 206675acc68SYinan Xu def adduw = "b010_0000".U // adduw: src1[31:0] + src2 207675acc68SYinan Xu def add = "b010_0001".U // add: src1 + src2 208675acc68SYinan Xu def oddadd = "b010_0010".U // oddadd: src1[0] + src2 209fe528fd6Ssinsanction def lui32add = "b010_0011".U // lui32add: SEXT(src2[11:0]) + {src2[63:12], 12'b0} 210675acc68SYinan Xu 211675acc68SYinan Xu def sr29add = "b010_0100".U // sr29add: src1[63:29] + src2 212675acc68SYinan Xu def sr30add = "b010_0101".U // sr30add: src1[63:30] + src2 213675acc68SYinan Xu def sr31add = "b010_0110".U // sr31add: src1[63:31] + src2 214675acc68SYinan Xu def sr32add = "b010_0111".U // sr32add: src1[63:32] + src2 215675acc68SYinan Xu 216675acc68SYinan Xu def sh1adduw = "b010_1000".U // sh1adduw: {src1[31:0], 1'b0} + src2 217675acc68SYinan Xu def sh1add = "b010_1001".U // sh1add: {src1[62:0], 1'b0} + src2 218675acc68SYinan Xu def sh2adduw = "b010_1010".U // sh2add_uw: {src1[31:0], 2'b0} + src2 219675acc68SYinan Xu def sh2add = "b010_1011".U // sh2add: {src1[61:0], 2'b0} + src2 220675acc68SYinan Xu def sh3adduw = "b010_1100".U // sh3add_uw: {src1[31:0], 3'b0} + src2 221675acc68SYinan Xu def sh3add = "b010_1101".U // sh3add: {src1[60:0], 3'b0} + src2 222675acc68SYinan Xu def sh4add = "b010_1111".U // sh4add: {src1[59:0], 4'b0} + src2 223675acc68SYinan Xu 224675acc68SYinan Xu // SUB-op: src1 - src2 225675acc68SYinan Xu def sub = "b011_0000".U 226675acc68SYinan Xu def sltu = "b011_0001".U 227675acc68SYinan Xu def slt = "b011_0010".U 228675acc68SYinan Xu def maxu = "b011_0100".U 229675acc68SYinan Xu def minu = "b011_0101".U 230675acc68SYinan Xu def max = "b011_0110".U 231675acc68SYinan Xu def min = "b011_0111".U 232675acc68SYinan Xu 233675acc68SYinan Xu // branch 234675acc68SYinan Xu def beq = "b111_0000".U 235675acc68SYinan Xu def bne = "b111_0010".U 236675acc68SYinan Xu def blt = "b111_1000".U 237675acc68SYinan Xu def bge = "b111_1010".U 238675acc68SYinan Xu def bltu = "b111_1100".U 239675acc68SYinan Xu def bgeu = "b111_1110".U 240675acc68SYinan Xu 241675acc68SYinan Xu // misc optype 242675acc68SYinan Xu def and = "b100_0000".U 243675acc68SYinan Xu def andn = "b100_0001".U 244675acc68SYinan Xu def or = "b100_0010".U 245675acc68SYinan Xu def orn = "b100_0011".U 246675acc68SYinan Xu def xor = "b100_0100".U 247675acc68SYinan Xu def xnor = "b100_0101".U 248675acc68SYinan Xu def orcb = "b100_0110".U 249675acc68SYinan Xu 250675acc68SYinan Xu def sextb = "b100_1000".U 251675acc68SYinan Xu def packh = "b100_1001".U 252675acc68SYinan Xu def sexth = "b100_1010".U 253675acc68SYinan Xu def packw = "b100_1011".U 254675acc68SYinan Xu 255675acc68SYinan Xu def revb = "b101_0000".U 256675acc68SYinan Xu def rev8 = "b101_0001".U 257675acc68SYinan Xu def pack = "b101_0010".U 258675acc68SYinan Xu def orh48 = "b101_0011".U 259675acc68SYinan Xu 260675acc68SYinan Xu def szewl1 = "b101_1000".U 261675acc68SYinan Xu def szewl2 = "b101_1001".U 262675acc68SYinan Xu def szewl3 = "b101_1010".U 263675acc68SYinan Xu def byte2 = "b101_1011".U 264675acc68SYinan Xu 265675acc68SYinan Xu def andlsb = "b110_0000".U 266675acc68SYinan Xu def andzexth = "b110_0001".U 267675acc68SYinan Xu def orlsb = "b110_0010".U 268675acc68SYinan Xu def orzexth = "b110_0011".U 269675acc68SYinan Xu def xorlsb = "b110_0100".U 270675acc68SYinan Xu def xorzexth = "b110_0101".U 271675acc68SYinan Xu def orcblsb = "b110_0110".U 272675acc68SYinan Xu def orcbzexth = "b110_0111".U 273675acc68SYinan Xu 274675acc68SYinan Xu def isAddw(func: UInt) = func(6, 4) === "b001".U && !func(3) && !func(1) 275675acc68SYinan Xu def isSimpleLogic(func: UInt) = func(6, 4) === "b100".U && !func(0) 276675acc68SYinan Xu def logicToLsb(func: UInt) = Cat("b110".U(3.W), func(3, 1), 0.U(1.W)) 277675acc68SYinan Xu def logicToZexth(func: UInt) = Cat("b110".U(3.W), func(3, 1), 1.U(1.W)) 278675acc68SYinan Xu 27957a10886SXuan Hu def apply() = UInt(FuOpTypeWidth.W) 2802225d46eSJiawei Lin } 2812225d46eSJiawei Lin 282d91483a6Sfdy object VSETOpType { 283a8db15d8Sfdy val setVlmaxBit = 0 284a8db15d8Sfdy val keepVlBit = 1 285a8db15d8Sfdy // destTypeBit == 0: write vl to rd 286a8db15d8Sfdy // destTypeBit == 1: write vconfig 287a8db15d8Sfdy val destTypeBit = 5 288a8db15d8Sfdy 289a32c56f4SXuan Hu // vsetvli's uop 290a32c56f4SXuan Hu // rs1!=x0, normal 291a32c56f4SXuan Hu // uop0: r(rs1), w(vconfig) | x[rs1],vtypei -> vconfig 292a32c56f4SXuan Hu // uop1: r(rs1), w(rd) | x[rs1],vtypei -> x[rd] 293a32c56f4SXuan Hu def uvsetvcfg_xi = "b1010_0000".U 294a32c56f4SXuan Hu def uvsetrd_xi = "b1000_0000".U 295a32c56f4SXuan Hu // rs1==x0, rd!=x0, set vl to vlmax, set rd to vlmax, set vtype 296a32c56f4SXuan Hu // uop0: w(vconfig) | vlmax, vtypei -> vconfig 297a32c56f4SXuan Hu // uop1: w(rd) | vlmax, vtypei -> x[rd] 298a32c56f4SXuan Hu def uvsetvcfg_vlmax_i = "b1010_0001".U 299a32c56f4SXuan Hu def uvsetrd_vlmax_i = "b1000_0001".U 300a32c56f4SXuan Hu // rs1==x0, rd==x0, keep vl, set vtype 301a32c56f4SXuan Hu // uop0: r(vconfig), w(vconfig) | ld_vconfig.vl, vtypei -> vconfig 302a32c56f4SXuan Hu def uvsetvcfg_keep_v = "b1010_0010".U 303d91483a6Sfdy 304a32c56f4SXuan Hu // vsetvl's uop 305a32c56f4SXuan Hu // rs1!=x0, normal 306a32c56f4SXuan Hu // uop0: r(rs1,rs2), w(vconfig) | x[rs1],x[rs2] -> vconfig 307a32c56f4SXuan Hu // uop1: r(rs1,rs2), w(rd) | x[rs1],x[rs2] -> x[rd] 308a32c56f4SXuan Hu def uvsetvcfg_xx = "b0110_0000".U 309a32c56f4SXuan Hu def uvsetrd_xx = "b0100_0000".U 310a32c56f4SXuan Hu // rs1==x0, rd!=x0, set vl to vlmax, set rd to vlmax, set vtype 311a32c56f4SXuan Hu // uop0: r(rs2), w(vconfig) | vlmax, vtypei -> vconfig 312a32c56f4SXuan Hu // uop1: r(rs2), w(rd) | vlmax, vtypei -> x[rd] 313a32c56f4SXuan Hu def uvsetvcfg_vlmax_x = "b0110_0001".U 314a32c56f4SXuan Hu def uvsetrd_vlmax_x = "b0100_0001".U 315a32c56f4SXuan Hu // rs1==x0, rd==x0, keep vl, set vtype 316a32c56f4SXuan Hu // uop0: r(rs2), w(vtmp) | x[rs2] -> vtmp 317a32c56f4SXuan Hu // uop0: r(vconfig,vtmp), w(vconfig) | old_vconfig.vl, vtmp -> vconfig 318a32c56f4SXuan Hu def uvmv_v_x = "b0110_0010".U 319a32c56f4SXuan Hu def uvsetvcfg_vv = "b0111_0010".U 320a32c56f4SXuan Hu 321a32c56f4SXuan Hu // vsetivli's uop 322a32c56f4SXuan Hu // uop0: w(vconfig) | vli, vtypei -> vconfig 323a32c56f4SXuan Hu // uop1: w(rd) | vli, vtypei -> x[rd] 324a32c56f4SXuan Hu def uvsetvcfg_ii = "b0010_0000".U 325a32c56f4SXuan Hu def uvsetrd_ii = "b0000_0000".U 326a32c56f4SXuan Hu 327a32c56f4SXuan Hu def isVsetvl (func: UInt) = func(6) 328a32c56f4SXuan Hu def isVsetvli (func: UInt) = func(7) 329a32c56f4SXuan Hu def isVsetivli(func: UInt) = func(7, 6) === 0.U 330a32c56f4SXuan Hu def isNormal (func: UInt) = func(1, 0) === 0.U 331a8db15d8Sfdy def isSetVlmax(func: UInt) = func(setVlmaxBit) 332a8db15d8Sfdy def isKeepVl (func: UInt) = func(keepVlBit) 333a32c56f4SXuan Hu // RG: region 334a32c56f4SXuan Hu def writeIntRG(func: UInt) = !func(5) 335a32c56f4SXuan Hu def writeVecRG(func: UInt) = func(5) 336a32c56f4SXuan Hu def readIntRG (func: UInt) = !func(4) 337a32c56f4SXuan Hu def readVecRG (func: UInt) = func(4) 338a8db15d8Sfdy // modify fuOpType 339a8db15d8Sfdy def switchDest(func: UInt) = func ^ (1 << destTypeBit).U 340a8db15d8Sfdy def keepVl(func: UInt) = func | (1 << keepVlBit).U 341a8db15d8Sfdy def setVlmax(func: UInt) = func | (1 << setVlmaxBit).U 342d91483a6Sfdy } 343d91483a6Sfdy 3443b739f49SXuan Hu object BRUOpType { 3453b739f49SXuan Hu // branch 3463b739f49SXuan Hu def beq = "b000_000".U 3473b739f49SXuan Hu def bne = "b000_001".U 3483b739f49SXuan Hu def blt = "b000_100".U 3493b739f49SXuan Hu def bge = "b000_101".U 3503b739f49SXuan Hu def bltu = "b001_000".U 3513b739f49SXuan Hu def bgeu = "b001_001".U 3523b739f49SXuan Hu 3533b739f49SXuan Hu def getBranchType(func: UInt) = func(3, 1) 3543b739f49SXuan Hu def isBranchInvert(func: UInt) = func(0) 3553b739f49SXuan Hu } 3563b739f49SXuan Hu 3573b739f49SXuan Hu object MULOpType { 3583b739f49SXuan Hu // mul 3593b739f49SXuan Hu // bit encoding: | type (2bit) | isWord(1bit) | opcode(2bit) | 3603b739f49SXuan Hu def mul = "b00000".U 3613b739f49SXuan Hu def mulh = "b00001".U 3623b739f49SXuan Hu def mulhsu = "b00010".U 3633b739f49SXuan Hu def mulhu = "b00011".U 3643b739f49SXuan Hu def mulw = "b00100".U 3653b739f49SXuan Hu 3663b739f49SXuan Hu def mulw7 = "b01100".U 3673b739f49SXuan Hu def isSign(op: UInt) = !op(1) 3683b739f49SXuan Hu def isW(op: UInt) = op(2) 3693b739f49SXuan Hu def isH(op: UInt) = op(1, 0) =/= 0.U 3703b739f49SXuan Hu def getOp(op: UInt) = Cat(op(3), op(1, 0)) 3713b739f49SXuan Hu } 3723b739f49SXuan Hu 3733b739f49SXuan Hu object DIVOpType { 3743b739f49SXuan Hu // div 3753b739f49SXuan Hu // bit encoding: | type (2bit) | isWord(1bit) | isSign(1bit) | opcode(1bit) | 3763b739f49SXuan Hu def div = "b10000".U 3773b739f49SXuan Hu def divu = "b10010".U 3783b739f49SXuan Hu def rem = "b10001".U 3793b739f49SXuan Hu def remu = "b10011".U 3803b739f49SXuan Hu 3813b739f49SXuan Hu def divw = "b10100".U 3823b739f49SXuan Hu def divuw = "b10110".U 3833b739f49SXuan Hu def remw = "b10101".U 3843b739f49SXuan Hu def remuw = "b10111".U 3853b739f49SXuan Hu 3863b739f49SXuan Hu def isSign(op: UInt) = !op(1) 3873b739f49SXuan Hu def isW(op: UInt) = op(2) 3883b739f49SXuan Hu def isH(op: UInt) = op(0) 3893b739f49SXuan Hu } 3903b739f49SXuan Hu 3912225d46eSJiawei Lin object MDUOpType { 3922225d46eSJiawei Lin // mul 3932225d46eSJiawei Lin // bit encoding: | type (2bit) | isWord(1bit) | opcode(2bit) | 3942225d46eSJiawei Lin def mul = "b00000".U 3952225d46eSJiawei Lin def mulh = "b00001".U 3962225d46eSJiawei Lin def mulhsu = "b00010".U 3972225d46eSJiawei Lin def mulhu = "b00011".U 3982225d46eSJiawei Lin def mulw = "b00100".U 3992225d46eSJiawei Lin 40088825c5cSYinan Xu def mulw7 = "b01100".U 40188825c5cSYinan Xu 4022225d46eSJiawei Lin // div 4032225d46eSJiawei Lin // bit encoding: | type (2bit) | isWord(1bit) | isSign(1bit) | opcode(1bit) | 40488825c5cSYinan Xu def div = "b10000".U 40588825c5cSYinan Xu def divu = "b10010".U 40688825c5cSYinan Xu def rem = "b10001".U 40788825c5cSYinan Xu def remu = "b10011".U 4082225d46eSJiawei Lin 40988825c5cSYinan Xu def divw = "b10100".U 41088825c5cSYinan Xu def divuw = "b10110".U 41188825c5cSYinan Xu def remw = "b10101".U 41288825c5cSYinan Xu def remuw = "b10111".U 4132225d46eSJiawei Lin 41488825c5cSYinan Xu def isMul(op: UInt) = !op(4) 41588825c5cSYinan Xu def isDiv(op: UInt) = op(4) 4162225d46eSJiawei Lin 4172225d46eSJiawei Lin def isDivSign(op: UInt) = isDiv(op) && !op(1) 4182225d46eSJiawei Lin def isW(op: UInt) = op(2) 4192225d46eSJiawei Lin def isH(op: UInt) = (isDiv(op) && op(0)) || (isMul(op) && op(1, 0) =/= 0.U) 4202225d46eSJiawei Lin def getMulOp(op: UInt) = op(1, 0) 4212225d46eSJiawei Lin } 4222225d46eSJiawei Lin 4232225d46eSJiawei Lin object LSUOpType { 424d200f594SWilliam Wang // load pipeline 4252225d46eSJiawei Lin 426d200f594SWilliam Wang // normal load 427d200f594SWilliam Wang // Note: bit(1, 0) are size, DO NOT CHANGE 428d200f594SWilliam Wang // bit encoding: | load 0 | is unsigned(1bit) | size(2bit) | 429d200f594SWilliam Wang def lb = "b0000".U 430d200f594SWilliam Wang def lh = "b0001".U 431d200f594SWilliam Wang def lw = "b0010".U 432d200f594SWilliam Wang def ld = "b0011".U 433d200f594SWilliam Wang def lbu = "b0100".U 434d200f594SWilliam Wang def lhu = "b0101".U 435d200f594SWilliam Wang def lwu = "b0110".U 436ca18a0b4SWilliam Wang 437d200f594SWilliam Wang // Zicbop software prefetch 438d200f594SWilliam Wang // bit encoding: | prefetch 1 | 0 | prefetch type (2bit) | 439d200f594SWilliam Wang def prefetch_i = "b1000".U // TODO 440d200f594SWilliam Wang def prefetch_r = "b1001".U 441d200f594SWilliam Wang def prefetch_w = "b1010".U 442ca18a0b4SWilliam Wang 443d200f594SWilliam Wang def isPrefetch(op: UInt): Bool = op(3) 444d200f594SWilliam Wang 445d200f594SWilliam Wang // store pipeline 446d200f594SWilliam Wang // normal store 447d200f594SWilliam Wang // bit encoding: | store 00 | size(2bit) | 448d200f594SWilliam Wang def sb = "b0000".U 449d200f594SWilliam Wang def sh = "b0001".U 450d200f594SWilliam Wang def sw = "b0010".U 451d200f594SWilliam Wang def sd = "b0011".U 452d200f594SWilliam Wang 453d200f594SWilliam Wang // l1 cache op 454d200f594SWilliam Wang // bit encoding: | cbo_zero 01 | size(2bit) 11 | 455d200f594SWilliam Wang def cbo_zero = "b0111".U 456d200f594SWilliam Wang 457d200f594SWilliam Wang // llc op 458d200f594SWilliam Wang // bit encoding: | prefetch 11 | suboptype(2bit) | 459d200f594SWilliam Wang def cbo_clean = "b1100".U 460d200f594SWilliam Wang def cbo_flush = "b1101".U 461d200f594SWilliam Wang def cbo_inval = "b1110".U 462d200f594SWilliam Wang 463d200f594SWilliam Wang def isCbo(op: UInt): Bool = op(3, 2) === "b11".U 4642225d46eSJiawei Lin 4652225d46eSJiawei Lin // atomics 4662225d46eSJiawei Lin // bit(1, 0) are size 4672225d46eSJiawei Lin // since atomics use a different fu type 4682225d46eSJiawei Lin // so we can safely reuse other load/store's encodings 469d200f594SWilliam Wang // bit encoding: | optype(4bit) | size (2bit) | 4702225d46eSJiawei Lin def lr_w = "b000010".U 4712225d46eSJiawei Lin def sc_w = "b000110".U 4722225d46eSJiawei Lin def amoswap_w = "b001010".U 4732225d46eSJiawei Lin def amoadd_w = "b001110".U 4742225d46eSJiawei Lin def amoxor_w = "b010010".U 4752225d46eSJiawei Lin def amoand_w = "b010110".U 4762225d46eSJiawei Lin def amoor_w = "b011010".U 4772225d46eSJiawei Lin def amomin_w = "b011110".U 4782225d46eSJiawei Lin def amomax_w = "b100010".U 4792225d46eSJiawei Lin def amominu_w = "b100110".U 4802225d46eSJiawei Lin def amomaxu_w = "b101010".U 4812225d46eSJiawei Lin 4822225d46eSJiawei Lin def lr_d = "b000011".U 4832225d46eSJiawei Lin def sc_d = "b000111".U 4842225d46eSJiawei Lin def amoswap_d = "b001011".U 4852225d46eSJiawei Lin def amoadd_d = "b001111".U 4862225d46eSJiawei Lin def amoxor_d = "b010011".U 4872225d46eSJiawei Lin def amoand_d = "b010111".U 4882225d46eSJiawei Lin def amoor_d = "b011011".U 4892225d46eSJiawei Lin def amomin_d = "b011111".U 4902225d46eSJiawei Lin def amomax_d = "b100011".U 4912225d46eSJiawei Lin def amominu_d = "b100111".U 4922225d46eSJiawei Lin def amomaxu_d = "b101011".U 493b6982e83SLemover 494b6982e83SLemover def size(op: UInt) = op(1,0) 4952225d46eSJiawei Lin } 4962225d46eSJiawei Lin 4973feeca58Szfw object BKUOpType { 498ee8ff153Szfw 4993feeca58Szfw def clmul = "b000000".U 5003feeca58Szfw def clmulh = "b000001".U 5013feeca58Szfw def clmulr = "b000010".U 5023feeca58Szfw def xpermn = "b000100".U 5033feeca58Szfw def xpermb = "b000101".U 504ee8ff153Szfw 5053feeca58Szfw def clz = "b001000".U 5063feeca58Szfw def clzw = "b001001".U 5073feeca58Szfw def ctz = "b001010".U 5083feeca58Szfw def ctzw = "b001011".U 5093feeca58Szfw def cpop = "b001100".U 5103feeca58Szfw def cpopw = "b001101".U 51107596dc6Szfw 5123feeca58Szfw // 01xxxx is reserve 5133feeca58Szfw def aes64es = "b100000".U 5143feeca58Szfw def aes64esm = "b100001".U 5153feeca58Szfw def aes64ds = "b100010".U 5163feeca58Szfw def aes64dsm = "b100011".U 5173feeca58Szfw def aes64im = "b100100".U 5183feeca58Szfw def aes64ks1i = "b100101".U 5193feeca58Szfw def aes64ks2 = "b100110".U 5203feeca58Szfw 5213feeca58Szfw // merge to two instruction sm4ks & sm4ed 52219bcce38SFawang Zhang def sm4ed0 = "b101000".U 52319bcce38SFawang Zhang def sm4ed1 = "b101001".U 52419bcce38SFawang Zhang def sm4ed2 = "b101010".U 52519bcce38SFawang Zhang def sm4ed3 = "b101011".U 52619bcce38SFawang Zhang def sm4ks0 = "b101100".U 52719bcce38SFawang Zhang def sm4ks1 = "b101101".U 52819bcce38SFawang Zhang def sm4ks2 = "b101110".U 52919bcce38SFawang Zhang def sm4ks3 = "b101111".U 5303feeca58Szfw 5313feeca58Szfw def sha256sum0 = "b110000".U 5323feeca58Szfw def sha256sum1 = "b110001".U 5333feeca58Szfw def sha256sig0 = "b110010".U 5343feeca58Szfw def sha256sig1 = "b110011".U 5353feeca58Szfw def sha512sum0 = "b110100".U 5363feeca58Szfw def sha512sum1 = "b110101".U 5373feeca58Szfw def sha512sig0 = "b110110".U 5383feeca58Szfw def sha512sig1 = "b110111".U 5393feeca58Szfw 5403feeca58Szfw def sm3p0 = "b111000".U 5413feeca58Szfw def sm3p1 = "b111001".U 542ee8ff153Szfw } 543ee8ff153Szfw 5442225d46eSJiawei Lin object BTBtype { 5452225d46eSJiawei Lin def B = "b00".U // branch 5462225d46eSJiawei Lin def J = "b01".U // jump 5472225d46eSJiawei Lin def I = "b10".U // indirect 5482225d46eSJiawei Lin def R = "b11".U // return 5492225d46eSJiawei Lin 5502225d46eSJiawei Lin def apply() = UInt(2.W) 5512225d46eSJiawei Lin } 5522225d46eSJiawei Lin 5532225d46eSJiawei Lin object SelImm { 554ee8ff153Szfw def IMM_X = "b0111".U 555d91483a6Sfdy def IMM_S = "b1110".U 556ee8ff153Szfw def IMM_SB = "b0001".U 557ee8ff153Szfw def IMM_U = "b0010".U 558ee8ff153Szfw def IMM_UJ = "b0011".U 559ee8ff153Szfw def IMM_I = "b0100".U 560ee8ff153Szfw def IMM_Z = "b0101".U 561ee8ff153Szfw def INVALID_INSTR = "b0110".U 562ee8ff153Szfw def IMM_B6 = "b1000".U 5632225d46eSJiawei Lin 56458c35d23Shuxuan0307 def IMM_OPIVIS = "b1001".U 56558c35d23Shuxuan0307 def IMM_OPIVIU = "b1010".U 566912e2179SXuan Hu def IMM_VSETVLI = "b1100".U 567912e2179SXuan Hu def IMM_VSETIVLI = "b1101".U 568fe528fd6Ssinsanction def IMM_LUI32 = "b1011".U 56958c35d23Shuxuan0307 57057a10886SXuan Hu def X = BitPat("b0000") 5716e7c9679Shuxuan0307 572ee8ff153Szfw def apply() = UInt(4.W) 5730655b1a0SXuan Hu 5740655b1a0SXuan Hu def mkString(immType: UInt) : String = { 5750655b1a0SXuan Hu val strMap = Map( 5760655b1a0SXuan Hu IMM_S.litValue -> "S", 5770655b1a0SXuan Hu IMM_SB.litValue -> "SB", 5780655b1a0SXuan Hu IMM_U.litValue -> "U", 5790655b1a0SXuan Hu IMM_UJ.litValue -> "UJ", 5800655b1a0SXuan Hu IMM_I.litValue -> "I", 5810655b1a0SXuan Hu IMM_Z.litValue -> "Z", 5820655b1a0SXuan Hu IMM_B6.litValue -> "B6", 5830655b1a0SXuan Hu IMM_OPIVIS.litValue -> "VIS", 5840655b1a0SXuan Hu IMM_OPIVIU.litValue -> "VIU", 5850655b1a0SXuan Hu IMM_VSETVLI.litValue -> "VSETVLI", 5860655b1a0SXuan Hu IMM_VSETIVLI.litValue -> "VSETIVLI", 587fe528fd6Ssinsanction IMM_LUI32.litValue -> "LUI32", 5880655b1a0SXuan Hu INVALID_INSTR.litValue -> "INVALID", 5890655b1a0SXuan Hu ) 5900655b1a0SXuan Hu strMap(immType.litValue) 5910655b1a0SXuan Hu } 5922225d46eSJiawei Lin } 5932225d46eSJiawei Lin 594e2695e90SzhanglyGit object UopSplitType { 595d91483a6Sfdy def SCA_SIM = "b000000".U // 596d91483a6Sfdy def DIR = "b010001".U // dirty: vset 597d91483a6Sfdy def VEC_VVV = "b010010".U // VEC_VVV 598d91483a6Sfdy def VEC_VXV = "b010011".U // VEC_VXV 599d91483a6Sfdy def VEC_0XV = "b010100".U // VEC_0XV 600d91483a6Sfdy def VEC_VVW = "b010101".U // VEC_VVW 601d91483a6Sfdy def VEC_WVW = "b010110".U // VEC_WVW 602d91483a6Sfdy def VEC_VXW = "b010111".U // VEC_VXW 603d91483a6Sfdy def VEC_WXW = "b011000".U // VEC_WXW 604d91483a6Sfdy def VEC_WVV = "b011001".U // VEC_WVV 605d91483a6Sfdy def VEC_WXV = "b011010".U // VEC_WXV 606d91483a6Sfdy def VEC_EXT2 = "b011011".U // VF2 0 -> V 607d91483a6Sfdy def VEC_EXT4 = "b011100".U // VF4 0 -> V 608d91483a6Sfdy def VEC_EXT8 = "b011101".U // VF8 0 -> V 609d91483a6Sfdy def VEC_VVM = "b011110".U // VEC_VVM 610d91483a6Sfdy def VEC_VXM = "b011111".U // VEC_VXM 611d91483a6Sfdy def VEC_SLIDE1UP = "b100000".U // vslide1up.vx 612d91483a6Sfdy def VEC_FSLIDE1UP = "b100001".U // vfslide1up.vf 613d91483a6Sfdy def VEC_SLIDE1DOWN = "b100010".U // vslide1down.vx 614d91483a6Sfdy def VEC_FSLIDE1DOWN = "b100011".U // vfslide1down.vf 615d91483a6Sfdy def VEC_VRED = "b100100".U // VEC_VRED 616d91483a6Sfdy def VEC_SLIDEUP = "b100101".U // VEC_SLIDEUP 617d91483a6Sfdy def VEC_ISLIDEUP = "b100110".U // VEC_ISLIDEUP 618d91483a6Sfdy def VEC_SLIDEDOWN = "b100111".U // VEC_SLIDEDOWN 619d91483a6Sfdy def VEC_ISLIDEDOWN = "b101000".U // VEC_ISLIDEDOWN 620d91483a6Sfdy def VEC_M0X = "b101001".U // VEC_M0X 0MV 621d91483a6Sfdy def VEC_MVV = "b101010".U // VEC_MVV VMV 622d91483a6Sfdy def VEC_M0X_VFIRST = "b101011".U // 62384260280Sczw def VEC_VWW = "b101100".U // 62465df1368Sczw def VEC_RGATHER = "b101101".U // vrgather.vv, vrgather.vi 62565df1368Sczw def VEC_RGATHER_VX = "b101110".U // vrgather.vx 62665df1368Sczw def VEC_RGATHEREI16 = "b101111".U // vrgatherei16.vv 627adf68ff3Sczw def VEC_COMPRESS = "b110000".U // vcompress.vm 6284ee69032SzhanglyGit def VEC_US_LD = "b110001".U // vector unit strided load 629684d7aceSxiaofeibao-xjtu def VEC_VFV = "b111000".U // VEC_VFV 6303748ec56Sxiaofeibao-xjtu def VEC_VFW = "b111001".U // VEC_VFW 6313748ec56Sxiaofeibao-xjtu def VEC_WFW = "b111010".U // VEC_WVW 632f06d6d60Sxiaofeibao-xjtu def VEC_VFM = "b111011".U // VEC_VFM 633582849ffSxiaofeibao-xjtu def VEC_VFRED = "b111100".U // VEC_VFRED 634b94b1889Sxiaofeibao-xjtu def VEC_VFREDOSUM = "b111101".U // VEC_VFREDOSUM 635d91483a6Sfdy def VEC_M0M = "b000000".U // VEC_M0M 636d91483a6Sfdy def VEC_MMM = "b000000".U // VEC_MMM 637d91483a6Sfdy def dummy = "b111111".U 638d91483a6Sfdy 639d91483a6Sfdy def X = BitPat("b000000") 640d91483a6Sfdy 641d91483a6Sfdy def apply() = UInt(6.W) 642e2695e90SzhanglyGit def needSplit(UopSplitType: UInt) = UopSplitType(4) || UopSplitType(5) 643d91483a6Sfdy } 644d91483a6Sfdy 6456ab6918fSYinan Xu object ExceptionNO { 6466ab6918fSYinan Xu def instrAddrMisaligned = 0 6476ab6918fSYinan Xu def instrAccessFault = 1 6486ab6918fSYinan Xu def illegalInstr = 2 6496ab6918fSYinan Xu def breakPoint = 3 6506ab6918fSYinan Xu def loadAddrMisaligned = 4 6516ab6918fSYinan Xu def loadAccessFault = 5 6526ab6918fSYinan Xu def storeAddrMisaligned = 6 6536ab6918fSYinan Xu def storeAccessFault = 7 6546ab6918fSYinan Xu def ecallU = 8 6556ab6918fSYinan Xu def ecallS = 9 6566ab6918fSYinan Xu def ecallM = 11 6576ab6918fSYinan Xu def instrPageFault = 12 6586ab6918fSYinan Xu def loadPageFault = 13 6596ab6918fSYinan Xu // def singleStep = 14 6606ab6918fSYinan Xu def storePageFault = 15 6616ab6918fSYinan Xu def priorities = Seq( 6626ab6918fSYinan Xu breakPoint, // TODO: different BP has different priority 6636ab6918fSYinan Xu instrPageFault, 6646ab6918fSYinan Xu instrAccessFault, 6656ab6918fSYinan Xu illegalInstr, 6666ab6918fSYinan Xu instrAddrMisaligned, 6676ab6918fSYinan Xu ecallM, ecallS, ecallU, 668d880177dSYinan Xu storeAddrMisaligned, 669d880177dSYinan Xu loadAddrMisaligned, 6706ab6918fSYinan Xu storePageFault, 6716ab6918fSYinan Xu loadPageFault, 6726ab6918fSYinan Xu storeAccessFault, 673d880177dSYinan Xu loadAccessFault 6746ab6918fSYinan Xu ) 6756ab6918fSYinan Xu def all = priorities.distinct.sorted 6766ab6918fSYinan Xu def frontendSet = Seq( 6776ab6918fSYinan Xu instrAddrMisaligned, 6786ab6918fSYinan Xu instrAccessFault, 6796ab6918fSYinan Xu illegalInstr, 6806ab6918fSYinan Xu instrPageFault 6816ab6918fSYinan Xu ) 6826ab6918fSYinan Xu def partialSelect(vec: Vec[Bool], select: Seq[Int]): Vec[Bool] = { 6836ab6918fSYinan Xu val new_vec = Wire(ExceptionVec()) 6846ab6918fSYinan Xu new_vec.foreach(_ := false.B) 6856ab6918fSYinan Xu select.foreach(i => new_vec(i) := vec(i)) 6866ab6918fSYinan Xu new_vec 6876ab6918fSYinan Xu } 6886ab6918fSYinan Xu def selectFrontend(vec: Vec[Bool]): Vec[Bool] = partialSelect(vec, frontendSet) 6896ab6918fSYinan Xu def selectAll(vec: Vec[Bool]): Vec[Bool] = partialSelect(vec, ExceptionNO.all) 6906ab6918fSYinan Xu def selectByFu(vec:Vec[Bool], fuConfig: FuConfig): Vec[Bool] = 6916ab6918fSYinan Xu partialSelect(vec, fuConfig.exceptionOut) 6926ab6918fSYinan Xu } 6936ab6918fSYinan Xu 694d2b20d1aSTang Haojin // indicates where the memory access request comes from 695d2b20d1aSTang Haojin // a dupliacte of this is in HuanCun.common and CoupledL2.common 696d2b20d1aSTang Haojin // TODO: consider moving it to Utility, so that they could share the same definition 697d2b20d1aSTang Haojin object MemReqSource extends Enumeration { 698d2b20d1aSTang Haojin val NoWhere = Value("NoWhere") 699d2b20d1aSTang Haojin 700d2b20d1aSTang Haojin val CPUInst = Value("CPUInst") 701d2b20d1aSTang Haojin val CPULoadData = Value("CPULoadData") 702d2b20d1aSTang Haojin val CPUStoreData = Value("CPUStoreData") 703d2b20d1aSTang Haojin val CPUAtomicData = Value("CPUAtomicData") 704d2b20d1aSTang Haojin val L1InstPrefetch = Value("L1InstPrefetch") 705d2b20d1aSTang Haojin val L1DataPrefetch = Value("L1DataPrefetch") 706d2b20d1aSTang Haojin val PTW = Value("PTW") 707d2b20d1aSTang Haojin val L2Prefetch = Value("L2Prefetch") 708d2b20d1aSTang Haojin val ReqSourceCount = Value("ReqSourceCount") 709d2b20d1aSTang Haojin 710d2b20d1aSTang Haojin val reqSourceBits = log2Ceil(ReqSourceCount.id) 711d2b20d1aSTang Haojin } 712d2b20d1aSTang Haojin 713d2b20d1aSTang Haojin object TopDownCounters extends Enumeration { 714d2b20d1aSTang Haojin val NoStall = Value("NoStall") // Base 715d2b20d1aSTang Haojin // frontend 716d2b20d1aSTang Haojin val OverrideBubble = Value("OverrideBubble") 717d2b20d1aSTang Haojin val FtqUpdateBubble = Value("FtqUpdateBubble") 718d2b20d1aSTang Haojin // val ControlRedirectBubble = Value("ControlRedirectBubble") 719d2b20d1aSTang Haojin val TAGEMissBubble = Value("TAGEMissBubble") 720d2b20d1aSTang Haojin val SCMissBubble = Value("SCMissBubble") 721d2b20d1aSTang Haojin val ITTAGEMissBubble = Value("ITTAGEMissBubble") 722d2b20d1aSTang Haojin val RASMissBubble = Value("RASMissBubble") 723d2b20d1aSTang Haojin val MemVioRedirectBubble = Value("MemVioRedirectBubble") 724d2b20d1aSTang Haojin val OtherRedirectBubble = Value("OtherRedirectBubble") 725d2b20d1aSTang Haojin val FtqFullStall = Value("FtqFullStall") 726d2b20d1aSTang Haojin 727d2b20d1aSTang Haojin val ICacheMissBubble = Value("ICacheMissBubble") 728d2b20d1aSTang Haojin val ITLBMissBubble = Value("ITLBMissBubble") 729d2b20d1aSTang Haojin val BTBMissBubble = Value("BTBMissBubble") 730d2b20d1aSTang Haojin val FetchFragBubble = Value("FetchFragBubble") 731d2b20d1aSTang Haojin 732d2b20d1aSTang Haojin // backend 733d2b20d1aSTang Haojin // long inst stall at rob head 734d2b20d1aSTang Haojin val DivStall = Value("DivStall") // int div, float div/sqrt 735d2b20d1aSTang Haojin val IntNotReadyStall = Value("IntNotReadyStall") // int-inst at rob head not issue 736d2b20d1aSTang Haojin val FPNotReadyStall = Value("FPNotReadyStall") // fp-inst at rob head not issue 737d2b20d1aSTang Haojin val MemNotReadyStall = Value("MemNotReadyStall") // mem-inst at rob head not issue 738d2b20d1aSTang Haojin // freelist full 739d2b20d1aSTang Haojin val IntFlStall = Value("IntFlStall") 740d2b20d1aSTang Haojin val FpFlStall = Value("FpFlStall") 741d2b20d1aSTang Haojin // dispatch queue full 742d2b20d1aSTang Haojin val IntDqStall = Value("IntDqStall") 743d2b20d1aSTang Haojin val FpDqStall = Value("FpDqStall") 744d2b20d1aSTang Haojin val LsDqStall = Value("LsDqStall") 745d2b20d1aSTang Haojin 746d2b20d1aSTang Haojin // memblock 747d2b20d1aSTang Haojin val LoadTLBStall = Value("LoadTLBStall") 748d2b20d1aSTang Haojin val LoadL1Stall = Value("LoadL1Stall") 749d2b20d1aSTang Haojin val LoadL2Stall = Value("LoadL2Stall") 750d2b20d1aSTang Haojin val LoadL3Stall = Value("LoadL3Stall") 751d2b20d1aSTang Haojin val LoadMemStall = Value("LoadMemStall") 752d2b20d1aSTang Haojin val StoreStall = Value("StoreStall") // include store tlb miss 753d2b20d1aSTang Haojin val AtomicStall = Value("AtomicStall") // atomic, load reserved, store conditional 754d2b20d1aSTang Haojin 755d2b20d1aSTang Haojin // xs replay (different to gem5) 756d2b20d1aSTang Haojin val LoadVioReplayStall = Value("LoadVioReplayStall") 757d2b20d1aSTang Haojin val LoadMSHRReplayStall = Value("LoadMSHRReplayStall") 758d2b20d1aSTang Haojin 759d2b20d1aSTang Haojin // bad speculation 760d2b20d1aSTang Haojin val ControlRecoveryStall = Value("ControlRecoveryStall") 761d2b20d1aSTang Haojin val MemVioRecoveryStall = Value("MemVioRecoveryStall") 762d2b20d1aSTang Haojin val OtherRecoveryStall = Value("OtherRecoveryStall") 763d2b20d1aSTang Haojin 764d2b20d1aSTang Haojin val FlushedInsts = Value("FlushedInsts") // control flushed, memvio flushed, others 765d2b20d1aSTang Haojin 766d2b20d1aSTang Haojin val OtherCoreStall = Value("OtherCoreStall") 767d2b20d1aSTang Haojin 768d2b20d1aSTang Haojin val NumStallReasons = Value("NumStallReasons") 769d2b20d1aSTang Haojin } 7709a2e6b8aSLinJiawei} 771