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