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._ 198891a219SYinan Xuimport org.chipsalliance.cde.config.Parameters 202225d46eSJiawei Linimport freechips.rocketchip.tile.XLen 216ab6918fSYinan Xuimport xiangshan.ExceptionNO._ 222225d46eSJiawei Linimport xiangshan.backend.fu._ 232225d46eSJiawei Linimport xiangshan.backend.fu.fpu._ 246827759bSZhangZifeiimport xiangshan.backend.fu.vector._ 258f3b164bSXuan Huimport xiangshan.backend.issue._ 26730cfbc0SXuan Huimport xiangshan.backend.fu.FuConfig 272225d46eSJiawei Lin 289a2e6b8aSLinJiaweipackage object xiangshan { 299ee9f926SYikeZhou object SrcType { 301285b047SXuan Hu def imm = "b000".U 311285b047SXuan Hu def pc = "b000".U 321285b047SXuan Hu def xp = "b001".U 331285b047SXuan Hu def fp = "b010".U 341285b047SXuan Hu def vp = "b100".U 3572d67441SXuan Hu def no = "b000".U // this src read no reg but cannot be Any value 3604b56283SZhangZifei 371285b047SXuan Hu // alias 381285b047SXuan Hu def reg = this.xp 391a3df1feSYikeZhou def DC = imm // Don't Care 4057a10886SXuan Hu def X = BitPat("b000") 414d24c305SYikeZhou 4204b56283SZhangZifei def isPc(srcType: UInt) = srcType===pc 4304b56283SZhangZifei def isImm(srcType: UInt) = srcType===imm 441285b047SXuan Hu def isReg(srcType: UInt) = srcType(0) 459ca09953SXuan Hu def isXp(srcType: UInt) = srcType(0) 462b4e8253SYinan Xu def isFp(srcType: UInt) = srcType(1) 471285b047SXuan Hu def isVp(srcType: UInt) = srcType(2) 481285b047SXuan Hu def isPcOrImm(srcType: UInt) = isPc(srcType) || isImm(srcType) 499ca09953SXuan Hu def isNotReg(srcType: UInt): Bool = !srcType.orR 50351e22f2SXuan Hu def isVfp(srcType: UInt) = isVp(srcType) || isFp(srcType) 511285b047SXuan Hu def apply() = UInt(3.W) 529a2e6b8aSLinJiawei } 539a2e6b8aSLinJiawei 549a2e6b8aSLinJiawei object SrcState { 55100aa93cSYinan Xu def busy = "b0".U 56100aa93cSYinan Xu def rdy = "b1".U 57100aa93cSYinan Xu // def specRdy = "b10".U // speculative ready, for future use 58100aa93cSYinan Xu def apply() = UInt(1.W) 599ca09953SXuan Hu 609ca09953SXuan Hu def isReady(state: UInt): Bool = state === this.rdy 619ca09953SXuan Hu def isBusy(state: UInt): Bool = state === this.busy 629a2e6b8aSLinJiawei } 639a2e6b8aSLinJiawei 649019e3efSXuan Hu def FuOpTypeWidth = 9 652225d46eSJiawei Lin object FuOpType { 6657a10886SXuan Hu def apply() = UInt(FuOpTypeWidth.W) 6757a10886SXuan Hu def X = BitPat("b00000000") 68ebd97ecbSzhanglinjuan } 69518d8658SYinan Xu 707f2b7720SXuan Hu object VlduType { 7157a10886SXuan Hu def dummy = 0.U 727f2b7720SXuan Hu } 737f2b7720SXuan Hu 747f2b7720SXuan Hu object VstuType { 7557a10886SXuan Hu def dummy = 0.U 767f2b7720SXuan Hu } 777f2b7720SXuan Hu 78*d6059658SZiyue Zhang object IF2VectorType { 79*d6059658SZiyue Zhang // use last 3 bits for vsew 80*d6059658SZiyue Zhang def i2vector = "b00_00".U 81*d6059658SZiyue Zhang def f2vector = "b00_01".U 82*d6059658SZiyue Zhang def imm2vector = "b00_10".U 83*d6059658SZiyue Zhang def permImm2vector = "b00_11".U 84*d6059658SZiyue Zhang } 85*d6059658SZiyue Zhang 86a3edac52SYinan Xu object CommitType { 87c3abb8b6SYinan Xu def NORMAL = "b000".U // int/fp 88c3abb8b6SYinan Xu def BRANCH = "b001".U // branch 89c3abb8b6SYinan Xu def LOAD = "b010".U // load 90c3abb8b6SYinan Xu def STORE = "b011".U // store 91518d8658SYinan Xu 92c3abb8b6SYinan Xu def apply() = UInt(3.W) 93c3abb8b6SYinan Xu def isFused(commitType: UInt): Bool = commitType(2) 94c3abb8b6SYinan Xu def isLoadStore(commitType: UInt): Bool = !isFused(commitType) && commitType(1) 95c3abb8b6SYinan Xu def lsInstIsStore(commitType: UInt): Bool = commitType(0) 96c3abb8b6SYinan Xu def isStore(commitType: UInt): Bool = isLoadStore(commitType) && lsInstIsStore(commitType) 97c3abb8b6SYinan Xu def isBranch(commitType: UInt): Bool = commitType(0) && !commitType(1) && !isFused(commitType) 98518d8658SYinan Xu } 99bfb958a3SYinan Xu 100bfb958a3SYinan Xu object RedirectLevel { 1012d7c7105SYinan Xu def flushAfter = "b0".U 1022d7c7105SYinan Xu def flush = "b1".U 103bfb958a3SYinan Xu 1042d7c7105SYinan Xu def apply() = UInt(1.W) 1052d7c7105SYinan Xu // def isUnconditional(level: UInt) = level(1) 106bfb958a3SYinan Xu def flushItself(level: UInt) = level(0) 1072d7c7105SYinan Xu // def isException(level: UInt) = level(1) && level(0) 108bfb958a3SYinan Xu } 109baf8def6SYinan Xu 110baf8def6SYinan Xu object ExceptionVec { 111da3bf434SMaxpicca-Li val ExceptionVecSize = 16 112da3bf434SMaxpicca-Li def apply() = Vec(ExceptionVecSize, Bool()) 113baf8def6SYinan Xu } 114a8e04b1dSYinan Xu 115c60c1ab4SWilliam Wang object PMAMode { 1168d9a04fcSWilliam Wang def R = "b1".U << 0 //readable 1178d9a04fcSWilliam Wang def W = "b1".U << 1 //writeable 1188d9a04fcSWilliam Wang def X = "b1".U << 2 //executable 1198d9a04fcSWilliam Wang def I = "b1".U << 3 //cacheable: icache 1208d9a04fcSWilliam Wang def D = "b1".U << 4 //cacheable: dcache 1218d9a04fcSWilliam Wang def S = "b1".U << 5 //enable speculative access 122cff68e26SWilliam Wang def A = "b1".U << 6 //enable atomic operation, A imply R & W 1238d9a04fcSWilliam Wang def C = "b1".U << 7 //if it is cacheable is configable 124c60c1ab4SWilliam Wang def Reserved = "b0".U 125c60c1ab4SWilliam Wang 126c60c1ab4SWilliam Wang def apply() = UInt(7.W) 127c60c1ab4SWilliam Wang 128c60c1ab4SWilliam Wang def read(mode: UInt) = mode(0) 129c60c1ab4SWilliam Wang def write(mode: UInt) = mode(1) 130c60c1ab4SWilliam Wang def execute(mode: UInt) = mode(2) 131c60c1ab4SWilliam Wang def icache(mode: UInt) = mode(3) 132c60c1ab4SWilliam Wang def dcache(mode: UInt) = mode(4) 133c60c1ab4SWilliam Wang def speculate(mode: UInt) = mode(5) 134c60c1ab4SWilliam Wang def atomic(mode: UInt) = mode(6) 135c60c1ab4SWilliam Wang def configable_cache(mode: UInt) = mode(7) 136c60c1ab4SWilliam Wang 137c60c1ab4SWilliam Wang def strToMode(s: String) = { 138423b9255SWilliam Wang var result = 0.U(8.W) 139c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("R") >= 0) result = result + R 140c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("W") >= 0) result = result + W 141c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("X") >= 0) result = result + X 142c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("I") >= 0) result = result + I 143c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("D") >= 0) result = result + D 144c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("S") >= 0) result = result + S 145c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("A") >= 0) result = result + A 146c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("C") >= 0) result = result + C 147c60c1ab4SWilliam Wang result 148c60c1ab4SWilliam Wang } 149c60c1ab4SWilliam Wang } 1502225d46eSJiawei Lin 1512225d46eSJiawei Lin 1522225d46eSJiawei Lin object CSROpType { 1532225d46eSJiawei Lin def jmp = "b000".U 1542225d46eSJiawei Lin def wrt = "b001".U 1552225d46eSJiawei Lin def set = "b010".U 1562225d46eSJiawei Lin def clr = "b011".U 157b6900d94SYinan Xu def wfi = "b100".U 1582225d46eSJiawei Lin def wrti = "b101".U 1592225d46eSJiawei Lin def seti = "b110".U 1602225d46eSJiawei Lin def clri = "b111".U 1615d669833SYinan Xu def needAccess(op: UInt): Bool = op(1, 0) =/= 0.U 1622225d46eSJiawei Lin } 1632225d46eSJiawei Lin 1642225d46eSJiawei Lin // jump 1652225d46eSJiawei Lin object JumpOpType { 1662225d46eSJiawei Lin def jal = "b00".U 1672225d46eSJiawei Lin def jalr = "b01".U 1682225d46eSJiawei Lin def auipc = "b10".U 1692225d46eSJiawei Lin// def call = "b11_011".U 1702225d46eSJiawei Lin// def ret = "b11_100".U 1712225d46eSJiawei Lin def jumpOpisJalr(op: UInt) = op(0) 1722225d46eSJiawei Lin def jumpOpisAuipc(op: UInt) = op(1) 1732225d46eSJiawei Lin } 1742225d46eSJiawei Lin 1752225d46eSJiawei Lin object FenceOpType { 1762225d46eSJiawei Lin def fence = "b10000".U 1772225d46eSJiawei Lin def sfence = "b10001".U 1782225d46eSJiawei Lin def fencei = "b10010".U 179af2f7849Shappy-lx def nofence= "b00000".U 1802225d46eSJiawei Lin } 1812225d46eSJiawei Lin 1822225d46eSJiawei Lin object ALUOpType { 183ee8ff153Szfw // shift optype 184675acc68SYinan Xu def slliuw = "b000_0000".U // slliuw: ZEXT(src1[31:0]) << shamt 185675acc68SYinan Xu def sll = "b000_0001".U // sll: src1 << src2 186ee8ff153Szfw 187675acc68SYinan Xu def bclr = "b000_0010".U // bclr: src1 & ~(1 << src2[5:0]) 188675acc68SYinan Xu def bset = "b000_0011".U // bset: src1 | (1 << src2[5:0]) 189675acc68SYinan Xu def binv = "b000_0100".U // binv: src1 ^ ~(1 << src2[5:0]) 190ee8ff153Szfw 191675acc68SYinan Xu def srl = "b000_0101".U // srl: src1 >> src2 192675acc68SYinan Xu def bext = "b000_0110".U // bext: (src1 >> src2)[0] 193675acc68SYinan Xu def sra = "b000_0111".U // sra: src1 >> src2 (arithmetic) 194ee8ff153Szfw 1957b441e5eSYinan Xu def rol = "b000_1001".U // rol: (src1 << src2) | (src1 >> (xlen - src2)) 1967b441e5eSYinan Xu def ror = "b000_1011".U // ror: (src1 >> src2) | (src1 << (xlen - src2)) 197184a1958Szfw 198ee8ff153Szfw // RV64 32bit optype 199675acc68SYinan Xu def addw = "b001_0000".U // addw: SEXT((src1 + src2)[31:0]) 200675acc68SYinan Xu def oddaddw = "b001_0001".U // oddaddw: SEXT((src1[0] + src2)[31:0]) 201675acc68SYinan Xu def subw = "b001_0010".U // subw: SEXT((src1 - src2)[31:0]) 20254711376Ssinsanction def lui32addw = "b001_0011".U // lui32addw: SEXT(SEXT(src2[11:0], 32) + {src2[31:12], 12'b0}, 64) 203ee8ff153Szfw 204675acc68SYinan Xu def addwbit = "b001_0100".U // addwbit: (src1 + src2)[0] 205675acc68SYinan Xu def addwbyte = "b001_0101".U // addwbyte: (src1 + src2)[7:0] 206675acc68SYinan Xu def addwzexth = "b001_0110".U // addwzexth: ZEXT((src1 + src2)[15:0]) 207675acc68SYinan Xu def addwsexth = "b001_0111".U // addwsexth: SEXT((src1 + src2)[15:0]) 208ee8ff153Szfw 209675acc68SYinan Xu def sllw = "b001_1000".U // sllw: SEXT((src1 << src2)[31:0]) 210675acc68SYinan Xu def srlw = "b001_1001".U // srlw: SEXT((src1[31:0] >> src2)[31:0]) 211675acc68SYinan Xu def sraw = "b001_1010".U // sraw: SEXT((src1[31:0] >> src2)[31:0]) 212675acc68SYinan Xu def rolw = "b001_1100".U 213675acc68SYinan Xu def rorw = "b001_1101".U 214675acc68SYinan Xu 215675acc68SYinan Xu // ADD-op 216675acc68SYinan Xu def adduw = "b010_0000".U // adduw: src1[31:0] + src2 217675acc68SYinan Xu def add = "b010_0001".U // add: src1 + src2 218675acc68SYinan Xu def oddadd = "b010_0010".U // oddadd: src1[0] + src2 219fe528fd6Ssinsanction def lui32add = "b010_0011".U // lui32add: SEXT(src2[11:0]) + {src2[63:12], 12'b0} 220675acc68SYinan Xu 221675acc68SYinan Xu def sr29add = "b010_0100".U // sr29add: src1[63:29] + src2 222675acc68SYinan Xu def sr30add = "b010_0101".U // sr30add: src1[63:30] + src2 223675acc68SYinan Xu def sr31add = "b010_0110".U // sr31add: src1[63:31] + src2 224675acc68SYinan Xu def sr32add = "b010_0111".U // sr32add: src1[63:32] + src2 225675acc68SYinan Xu 226675acc68SYinan Xu def sh1adduw = "b010_1000".U // sh1adduw: {src1[31:0], 1'b0} + src2 227675acc68SYinan Xu def sh1add = "b010_1001".U // sh1add: {src1[62:0], 1'b0} + src2 228675acc68SYinan Xu def sh2adduw = "b010_1010".U // sh2add_uw: {src1[31:0], 2'b0} + src2 229675acc68SYinan Xu def sh2add = "b010_1011".U // sh2add: {src1[61:0], 2'b0} + src2 230675acc68SYinan Xu def sh3adduw = "b010_1100".U // sh3add_uw: {src1[31:0], 3'b0} + src2 231675acc68SYinan Xu def sh3add = "b010_1101".U // sh3add: {src1[60:0], 3'b0} + src2 232675acc68SYinan Xu def sh4add = "b010_1111".U // sh4add: {src1[59:0], 4'b0} + src2 233675acc68SYinan Xu 234675acc68SYinan Xu // SUB-op: src1 - src2 235675acc68SYinan Xu def sub = "b011_0000".U 236675acc68SYinan Xu def sltu = "b011_0001".U 237675acc68SYinan Xu def slt = "b011_0010".U 238675acc68SYinan Xu def maxu = "b011_0100".U 239675acc68SYinan Xu def minu = "b011_0101".U 240675acc68SYinan Xu def max = "b011_0110".U 241675acc68SYinan Xu def min = "b011_0111".U 242675acc68SYinan Xu 243675acc68SYinan Xu // branch 244675acc68SYinan Xu def beq = "b111_0000".U 245675acc68SYinan Xu def bne = "b111_0010".U 246675acc68SYinan Xu def blt = "b111_1000".U 247675acc68SYinan Xu def bge = "b111_1010".U 248675acc68SYinan Xu def bltu = "b111_1100".U 249675acc68SYinan Xu def bgeu = "b111_1110".U 250675acc68SYinan Xu 251675acc68SYinan Xu // misc optype 252675acc68SYinan Xu def and = "b100_0000".U 253675acc68SYinan Xu def andn = "b100_0001".U 254675acc68SYinan Xu def or = "b100_0010".U 255675acc68SYinan Xu def orn = "b100_0011".U 256675acc68SYinan Xu def xor = "b100_0100".U 257675acc68SYinan Xu def xnor = "b100_0101".U 258675acc68SYinan Xu def orcb = "b100_0110".U 259675acc68SYinan Xu 260675acc68SYinan Xu def sextb = "b100_1000".U 261675acc68SYinan Xu def packh = "b100_1001".U 262675acc68SYinan Xu def sexth = "b100_1010".U 263675acc68SYinan Xu def packw = "b100_1011".U 264675acc68SYinan Xu 265675acc68SYinan Xu def revb = "b101_0000".U 266675acc68SYinan Xu def rev8 = "b101_0001".U 267675acc68SYinan Xu def pack = "b101_0010".U 268675acc68SYinan Xu def orh48 = "b101_0011".U 269675acc68SYinan Xu 270675acc68SYinan Xu def szewl1 = "b101_1000".U 271675acc68SYinan Xu def szewl2 = "b101_1001".U 272675acc68SYinan Xu def szewl3 = "b101_1010".U 273675acc68SYinan Xu def byte2 = "b101_1011".U 274675acc68SYinan Xu 275675acc68SYinan Xu def andlsb = "b110_0000".U 276675acc68SYinan Xu def andzexth = "b110_0001".U 277675acc68SYinan Xu def orlsb = "b110_0010".U 278675acc68SYinan Xu def orzexth = "b110_0011".U 279675acc68SYinan Xu def xorlsb = "b110_0100".U 280675acc68SYinan Xu def xorzexth = "b110_0101".U 281675acc68SYinan Xu def orcblsb = "b110_0110".U 282675acc68SYinan Xu def orcbzexth = "b110_0111".U 283675acc68SYinan Xu 284675acc68SYinan Xu def isAddw(func: UInt) = func(6, 4) === "b001".U && !func(3) && !func(1) 285675acc68SYinan Xu def isSimpleLogic(func: UInt) = func(6, 4) === "b100".U && !func(0) 286675acc68SYinan Xu def logicToLsb(func: UInt) = Cat("b110".U(3.W), func(3, 1), 0.U(1.W)) 287675acc68SYinan Xu def logicToZexth(func: UInt) = Cat("b110".U(3.W), func(3, 1), 1.U(1.W)) 288675acc68SYinan Xu 28957a10886SXuan Hu def apply() = UInt(FuOpTypeWidth.W) 2902225d46eSJiawei Lin } 2912225d46eSJiawei Lin 292d91483a6Sfdy object VSETOpType { 293a8db15d8Sfdy val setVlmaxBit = 0 294a8db15d8Sfdy val keepVlBit = 1 295a8db15d8Sfdy // destTypeBit == 0: write vl to rd 296a8db15d8Sfdy // destTypeBit == 1: write vconfig 297a8db15d8Sfdy val destTypeBit = 5 298a8db15d8Sfdy 299a32c56f4SXuan Hu // vsetvli's uop 300a32c56f4SXuan Hu // rs1!=x0, normal 301a32c56f4SXuan Hu // uop0: r(rs1), w(vconfig) | x[rs1],vtypei -> vconfig 302a32c56f4SXuan Hu // uop1: r(rs1), w(rd) | x[rs1],vtypei -> x[rd] 303a32c56f4SXuan Hu def uvsetvcfg_xi = "b1010_0000".U 304a32c56f4SXuan Hu def uvsetrd_xi = "b1000_0000".U 305a32c56f4SXuan Hu // rs1==x0, rd!=x0, set vl to vlmax, set rd to vlmax, set vtype 306a32c56f4SXuan Hu // uop0: w(vconfig) | vlmax, vtypei -> vconfig 307a32c56f4SXuan Hu // uop1: w(rd) | vlmax, vtypei -> x[rd] 308a32c56f4SXuan Hu def uvsetvcfg_vlmax_i = "b1010_0001".U 309a32c56f4SXuan Hu def uvsetrd_vlmax_i = "b1000_0001".U 310a32c56f4SXuan Hu // rs1==x0, rd==x0, keep vl, set vtype 311a32c56f4SXuan Hu // uop0: r(vconfig), w(vconfig) | ld_vconfig.vl, vtypei -> vconfig 312a32c56f4SXuan Hu def uvsetvcfg_keep_v = "b1010_0010".U 313d91483a6Sfdy 314a32c56f4SXuan Hu // vsetvl's uop 315a32c56f4SXuan Hu // rs1!=x0, normal 316a32c56f4SXuan Hu // uop0: r(rs1,rs2), w(vconfig) | x[rs1],x[rs2] -> vconfig 317a32c56f4SXuan Hu // uop1: r(rs1,rs2), w(rd) | x[rs1],x[rs2] -> x[rd] 318a32c56f4SXuan Hu def uvsetvcfg_xx = "b0110_0000".U 319a32c56f4SXuan Hu def uvsetrd_xx = "b0100_0000".U 320a32c56f4SXuan Hu // rs1==x0, rd!=x0, set vl to vlmax, set rd to vlmax, set vtype 321a32c56f4SXuan Hu // uop0: r(rs2), w(vconfig) | vlmax, vtypei -> vconfig 322a32c56f4SXuan Hu // uop1: r(rs2), w(rd) | vlmax, vtypei -> x[rd] 323a32c56f4SXuan Hu def uvsetvcfg_vlmax_x = "b0110_0001".U 324a32c56f4SXuan Hu def uvsetrd_vlmax_x = "b0100_0001".U 325a32c56f4SXuan Hu // rs1==x0, rd==x0, keep vl, set vtype 326a32c56f4SXuan Hu // uop0: r(rs2), w(vtmp) | x[rs2] -> vtmp 327a32c56f4SXuan Hu // uop0: r(vconfig,vtmp), w(vconfig) | old_vconfig.vl, vtmp -> vconfig 328a32c56f4SXuan Hu def uvmv_v_x = "b0110_0010".U 329a32c56f4SXuan Hu def uvsetvcfg_vv = "b0111_0010".U 330a32c56f4SXuan Hu 331a32c56f4SXuan Hu // vsetivli's uop 332a32c56f4SXuan Hu // uop0: w(vconfig) | vli, vtypei -> vconfig 333a32c56f4SXuan Hu // uop1: w(rd) | vli, vtypei -> x[rd] 334a32c56f4SXuan Hu def uvsetvcfg_ii = "b0010_0000".U 335a32c56f4SXuan Hu def uvsetrd_ii = "b0000_0000".U 336a32c56f4SXuan Hu 337a32c56f4SXuan Hu def isVsetvl (func: UInt) = func(6) 338a32c56f4SXuan Hu def isVsetvli (func: UInt) = func(7) 339a32c56f4SXuan Hu def isVsetivli(func: UInt) = func(7, 6) === 0.U 340a32c56f4SXuan Hu def isNormal (func: UInt) = func(1, 0) === 0.U 341a8db15d8Sfdy def isSetVlmax(func: UInt) = func(setVlmaxBit) 342a8db15d8Sfdy def isKeepVl (func: UInt) = func(keepVlBit) 343a32c56f4SXuan Hu // RG: region 344a32c56f4SXuan Hu def writeIntRG(func: UInt) = !func(5) 345a32c56f4SXuan Hu def writeVecRG(func: UInt) = func(5) 346a32c56f4SXuan Hu def readIntRG (func: UInt) = !func(4) 347a32c56f4SXuan Hu def readVecRG (func: UInt) = func(4) 348a8db15d8Sfdy // modify fuOpType 349a8db15d8Sfdy def switchDest(func: UInt) = func ^ (1 << destTypeBit).U 350a8db15d8Sfdy def keepVl(func: UInt) = func | (1 << keepVlBit).U 351a8db15d8Sfdy def setVlmax(func: UInt) = func | (1 << setVlmaxBit).U 352d91483a6Sfdy } 353d91483a6Sfdy 3543b739f49SXuan Hu object BRUOpType { 3553b739f49SXuan Hu // branch 3563b739f49SXuan Hu def beq = "b000_000".U 3573b739f49SXuan Hu def bne = "b000_001".U 3583b739f49SXuan Hu def blt = "b000_100".U 3593b739f49SXuan Hu def bge = "b000_101".U 3603b739f49SXuan Hu def bltu = "b001_000".U 3613b739f49SXuan Hu def bgeu = "b001_001".U 3623b739f49SXuan Hu 3633b739f49SXuan Hu def getBranchType(func: UInt) = func(3, 1) 3643b739f49SXuan Hu def isBranchInvert(func: UInt) = func(0) 3653b739f49SXuan Hu } 3663b739f49SXuan Hu 3673b739f49SXuan Hu object MULOpType { 3683b739f49SXuan Hu // mul 3693b739f49SXuan Hu // bit encoding: | type (2bit) | isWord(1bit) | opcode(2bit) | 3703b739f49SXuan Hu def mul = "b00000".U 3713b739f49SXuan Hu def mulh = "b00001".U 3723b739f49SXuan Hu def mulhsu = "b00010".U 3733b739f49SXuan Hu def mulhu = "b00011".U 3743b739f49SXuan Hu def mulw = "b00100".U 3753b739f49SXuan Hu 3763b739f49SXuan Hu def mulw7 = "b01100".U 3773b739f49SXuan Hu def isSign(op: UInt) = !op(1) 3783b739f49SXuan Hu def isW(op: UInt) = op(2) 3793b739f49SXuan Hu def isH(op: UInt) = op(1, 0) =/= 0.U 3803b739f49SXuan Hu def getOp(op: UInt) = Cat(op(3), op(1, 0)) 3813b739f49SXuan Hu } 3823b739f49SXuan Hu 3833b739f49SXuan Hu object DIVOpType { 3843b739f49SXuan Hu // div 3853b739f49SXuan Hu // bit encoding: | type (2bit) | isWord(1bit) | isSign(1bit) | opcode(1bit) | 3863b739f49SXuan Hu def div = "b10000".U 3873b739f49SXuan Hu def divu = "b10010".U 3883b739f49SXuan Hu def rem = "b10001".U 3893b739f49SXuan Hu def remu = "b10011".U 3903b739f49SXuan Hu 3913b739f49SXuan Hu def divw = "b10100".U 3923b739f49SXuan Hu def divuw = "b10110".U 3933b739f49SXuan Hu def remw = "b10101".U 3943b739f49SXuan Hu def remuw = "b10111".U 3953b739f49SXuan Hu 3963b739f49SXuan Hu def isSign(op: UInt) = !op(1) 3973b739f49SXuan Hu def isW(op: UInt) = op(2) 3983b739f49SXuan Hu def isH(op: UInt) = op(0) 3993b739f49SXuan Hu } 4003b739f49SXuan Hu 4012225d46eSJiawei Lin object MDUOpType { 4022225d46eSJiawei Lin // mul 4032225d46eSJiawei Lin // bit encoding: | type (2bit) | isWord(1bit) | opcode(2bit) | 4042225d46eSJiawei Lin def mul = "b00000".U 4052225d46eSJiawei Lin def mulh = "b00001".U 4062225d46eSJiawei Lin def mulhsu = "b00010".U 4072225d46eSJiawei Lin def mulhu = "b00011".U 4082225d46eSJiawei Lin def mulw = "b00100".U 4092225d46eSJiawei Lin 41088825c5cSYinan Xu def mulw7 = "b01100".U 41188825c5cSYinan Xu 4122225d46eSJiawei Lin // div 4132225d46eSJiawei Lin // bit encoding: | type (2bit) | isWord(1bit) | isSign(1bit) | opcode(1bit) | 41488825c5cSYinan Xu def div = "b10000".U 41588825c5cSYinan Xu def divu = "b10010".U 41688825c5cSYinan Xu def rem = "b10001".U 41788825c5cSYinan Xu def remu = "b10011".U 4182225d46eSJiawei Lin 41988825c5cSYinan Xu def divw = "b10100".U 42088825c5cSYinan Xu def divuw = "b10110".U 42188825c5cSYinan Xu def remw = "b10101".U 42288825c5cSYinan Xu def remuw = "b10111".U 4232225d46eSJiawei Lin 42488825c5cSYinan Xu def isMul(op: UInt) = !op(4) 42588825c5cSYinan Xu def isDiv(op: UInt) = op(4) 4262225d46eSJiawei Lin 4272225d46eSJiawei Lin def isDivSign(op: UInt) = isDiv(op) && !op(1) 4282225d46eSJiawei Lin def isW(op: UInt) = op(2) 4292225d46eSJiawei Lin def isH(op: UInt) = (isDiv(op) && op(0)) || (isMul(op) && op(1, 0) =/= 0.U) 4302225d46eSJiawei Lin def getMulOp(op: UInt) = op(1, 0) 4312225d46eSJiawei Lin } 4322225d46eSJiawei Lin 4332225d46eSJiawei Lin object LSUOpType { 434d200f594SWilliam Wang // load pipeline 4352225d46eSJiawei Lin 436d200f594SWilliam Wang // normal load 437d200f594SWilliam Wang // Note: bit(1, 0) are size, DO NOT CHANGE 438d200f594SWilliam Wang // bit encoding: | load 0 | is unsigned(1bit) | size(2bit) | 439d200f594SWilliam Wang def lb = "b0000".U 440d200f594SWilliam Wang def lh = "b0001".U 441d200f594SWilliam Wang def lw = "b0010".U 442d200f594SWilliam Wang def ld = "b0011".U 443d200f594SWilliam Wang def lbu = "b0100".U 444d200f594SWilliam Wang def lhu = "b0101".U 445d200f594SWilliam Wang def lwu = "b0110".U 446ca18a0b4SWilliam Wang 447d200f594SWilliam Wang // Zicbop software prefetch 448d200f594SWilliam Wang // bit encoding: | prefetch 1 | 0 | prefetch type (2bit) | 449d200f594SWilliam Wang def prefetch_i = "b1000".U // TODO 450d200f594SWilliam Wang def prefetch_r = "b1001".U 451d200f594SWilliam Wang def prefetch_w = "b1010".U 452ca18a0b4SWilliam Wang 453d200f594SWilliam Wang def isPrefetch(op: UInt): Bool = op(3) 454d200f594SWilliam Wang 455d200f594SWilliam Wang // store pipeline 456d200f594SWilliam Wang // normal store 457d200f594SWilliam Wang // bit encoding: | store 00 | size(2bit) | 458d200f594SWilliam Wang def sb = "b0000".U 459d200f594SWilliam Wang def sh = "b0001".U 460d200f594SWilliam Wang def sw = "b0010".U 461d200f594SWilliam Wang def sd = "b0011".U 462d200f594SWilliam Wang 463d200f594SWilliam Wang // l1 cache op 464d200f594SWilliam Wang // bit encoding: | cbo_zero 01 | size(2bit) 11 | 465d200f594SWilliam Wang def cbo_zero = "b0111".U 466d200f594SWilliam Wang 467d200f594SWilliam Wang // llc op 468d200f594SWilliam Wang // bit encoding: | prefetch 11 | suboptype(2bit) | 469d200f594SWilliam Wang def cbo_clean = "b1100".U 470d200f594SWilliam Wang def cbo_flush = "b1101".U 471d200f594SWilliam Wang def cbo_inval = "b1110".U 472d200f594SWilliam Wang 473d200f594SWilliam Wang def isCbo(op: UInt): Bool = op(3, 2) === "b11".U 4742225d46eSJiawei Lin 4752225d46eSJiawei Lin // atomics 4762225d46eSJiawei Lin // bit(1, 0) are size 4772225d46eSJiawei Lin // since atomics use a different fu type 4782225d46eSJiawei Lin // so we can safely reuse other load/store's encodings 479d200f594SWilliam Wang // bit encoding: | optype(4bit) | size (2bit) | 4802225d46eSJiawei Lin def lr_w = "b000010".U 4812225d46eSJiawei Lin def sc_w = "b000110".U 4822225d46eSJiawei Lin def amoswap_w = "b001010".U 4832225d46eSJiawei Lin def amoadd_w = "b001110".U 4842225d46eSJiawei Lin def amoxor_w = "b010010".U 4852225d46eSJiawei Lin def amoand_w = "b010110".U 4862225d46eSJiawei Lin def amoor_w = "b011010".U 4872225d46eSJiawei Lin def amomin_w = "b011110".U 4882225d46eSJiawei Lin def amomax_w = "b100010".U 4892225d46eSJiawei Lin def amominu_w = "b100110".U 4902225d46eSJiawei Lin def amomaxu_w = "b101010".U 4912225d46eSJiawei Lin 4922225d46eSJiawei Lin def lr_d = "b000011".U 4932225d46eSJiawei Lin def sc_d = "b000111".U 4942225d46eSJiawei Lin def amoswap_d = "b001011".U 4952225d46eSJiawei Lin def amoadd_d = "b001111".U 4962225d46eSJiawei Lin def amoxor_d = "b010011".U 4972225d46eSJiawei Lin def amoand_d = "b010111".U 4982225d46eSJiawei Lin def amoor_d = "b011011".U 4992225d46eSJiawei Lin def amomin_d = "b011111".U 5002225d46eSJiawei Lin def amomax_d = "b100011".U 5012225d46eSJiawei Lin def amominu_d = "b100111".U 5022225d46eSJiawei Lin def amomaxu_d = "b101011".U 503b6982e83SLemover 504b6982e83SLemover def size(op: UInt) = op(1,0) 5052225d46eSJiawei Lin } 5062225d46eSJiawei Lin 5073feeca58Szfw object BKUOpType { 508ee8ff153Szfw 5093feeca58Szfw def clmul = "b000000".U 5103feeca58Szfw def clmulh = "b000001".U 5113feeca58Szfw def clmulr = "b000010".U 5123feeca58Szfw def xpermn = "b000100".U 5133feeca58Szfw def xpermb = "b000101".U 514ee8ff153Szfw 5153feeca58Szfw def clz = "b001000".U 5163feeca58Szfw def clzw = "b001001".U 5173feeca58Szfw def ctz = "b001010".U 5183feeca58Szfw def ctzw = "b001011".U 5193feeca58Szfw def cpop = "b001100".U 5203feeca58Szfw def cpopw = "b001101".U 52107596dc6Szfw 5223feeca58Szfw // 01xxxx is reserve 5233feeca58Szfw def aes64es = "b100000".U 5243feeca58Szfw def aes64esm = "b100001".U 5253feeca58Szfw def aes64ds = "b100010".U 5263feeca58Szfw def aes64dsm = "b100011".U 5273feeca58Szfw def aes64im = "b100100".U 5283feeca58Szfw def aes64ks1i = "b100101".U 5293feeca58Szfw def aes64ks2 = "b100110".U 5303feeca58Szfw 5313feeca58Szfw // merge to two instruction sm4ks & sm4ed 53219bcce38SFawang Zhang def sm4ed0 = "b101000".U 53319bcce38SFawang Zhang def sm4ed1 = "b101001".U 53419bcce38SFawang Zhang def sm4ed2 = "b101010".U 53519bcce38SFawang Zhang def sm4ed3 = "b101011".U 53619bcce38SFawang Zhang def sm4ks0 = "b101100".U 53719bcce38SFawang Zhang def sm4ks1 = "b101101".U 53819bcce38SFawang Zhang def sm4ks2 = "b101110".U 53919bcce38SFawang Zhang def sm4ks3 = "b101111".U 5403feeca58Szfw 5413feeca58Szfw def sha256sum0 = "b110000".U 5423feeca58Szfw def sha256sum1 = "b110001".U 5433feeca58Szfw def sha256sig0 = "b110010".U 5443feeca58Szfw def sha256sig1 = "b110011".U 5453feeca58Szfw def sha512sum0 = "b110100".U 5463feeca58Szfw def sha512sum1 = "b110101".U 5473feeca58Szfw def sha512sig0 = "b110110".U 5483feeca58Szfw def sha512sig1 = "b110111".U 5493feeca58Szfw 5503feeca58Szfw def sm3p0 = "b111000".U 5513feeca58Szfw def sm3p1 = "b111001".U 552ee8ff153Szfw } 553ee8ff153Szfw 5542225d46eSJiawei Lin object BTBtype { 5552225d46eSJiawei Lin def B = "b00".U // branch 5562225d46eSJiawei Lin def J = "b01".U // jump 5572225d46eSJiawei Lin def I = "b10".U // indirect 5582225d46eSJiawei Lin def R = "b11".U // return 5592225d46eSJiawei Lin 5602225d46eSJiawei Lin def apply() = UInt(2.W) 5612225d46eSJiawei Lin } 5622225d46eSJiawei Lin 5632225d46eSJiawei Lin object SelImm { 564ee8ff153Szfw def IMM_X = "b0111".U 565d91483a6Sfdy def IMM_S = "b1110".U 566ee8ff153Szfw def IMM_SB = "b0001".U 567ee8ff153Szfw def IMM_U = "b0010".U 568ee8ff153Szfw def IMM_UJ = "b0011".U 569ee8ff153Szfw def IMM_I = "b0100".U 570ee8ff153Szfw def IMM_Z = "b0101".U 571ee8ff153Szfw def INVALID_INSTR = "b0110".U 572ee8ff153Szfw def IMM_B6 = "b1000".U 5732225d46eSJiawei Lin 57458c35d23Shuxuan0307 def IMM_OPIVIS = "b1001".U 57558c35d23Shuxuan0307 def IMM_OPIVIU = "b1010".U 576912e2179SXuan Hu def IMM_VSETVLI = "b1100".U 577912e2179SXuan Hu def IMM_VSETIVLI = "b1101".U 578fe528fd6Ssinsanction def IMM_LUI32 = "b1011".U 57958c35d23Shuxuan0307 58057a10886SXuan Hu def X = BitPat("b0000") 5816e7c9679Shuxuan0307 582ee8ff153Szfw def apply() = UInt(4.W) 5830655b1a0SXuan Hu 5840655b1a0SXuan Hu def mkString(immType: UInt) : String = { 5850655b1a0SXuan Hu val strMap = Map( 5860655b1a0SXuan Hu IMM_S.litValue -> "S", 5870655b1a0SXuan Hu IMM_SB.litValue -> "SB", 5880655b1a0SXuan Hu IMM_U.litValue -> "U", 5890655b1a0SXuan Hu IMM_UJ.litValue -> "UJ", 5900655b1a0SXuan Hu IMM_I.litValue -> "I", 5910655b1a0SXuan Hu IMM_Z.litValue -> "Z", 5920655b1a0SXuan Hu IMM_B6.litValue -> "B6", 5930655b1a0SXuan Hu IMM_OPIVIS.litValue -> "VIS", 5940655b1a0SXuan Hu IMM_OPIVIU.litValue -> "VIU", 5950655b1a0SXuan Hu IMM_VSETVLI.litValue -> "VSETVLI", 5960655b1a0SXuan Hu IMM_VSETIVLI.litValue -> "VSETIVLI", 597fe528fd6Ssinsanction IMM_LUI32.litValue -> "LUI32", 5980655b1a0SXuan Hu INVALID_INSTR.litValue -> "INVALID", 5990655b1a0SXuan Hu ) 6000655b1a0SXuan Hu strMap(immType.litValue) 6010655b1a0SXuan Hu } 6022225d46eSJiawei Lin } 6032225d46eSJiawei Lin 604e2695e90SzhanglyGit object UopSplitType { 605d91483a6Sfdy def SCA_SIM = "b000000".U // 606d91483a6Sfdy def DIR = "b010001".U // dirty: vset 607d91483a6Sfdy def VEC_VVV = "b010010".U // VEC_VVV 608d91483a6Sfdy def VEC_VXV = "b010011".U // VEC_VXV 609d91483a6Sfdy def VEC_0XV = "b010100".U // VEC_0XV 610d91483a6Sfdy def VEC_VVW = "b010101".U // VEC_VVW 611d91483a6Sfdy def VEC_WVW = "b010110".U // VEC_WVW 612d91483a6Sfdy def VEC_VXW = "b010111".U // VEC_VXW 613d91483a6Sfdy def VEC_WXW = "b011000".U // VEC_WXW 614d91483a6Sfdy def VEC_WVV = "b011001".U // VEC_WVV 615d91483a6Sfdy def VEC_WXV = "b011010".U // VEC_WXV 616d91483a6Sfdy def VEC_EXT2 = "b011011".U // VF2 0 -> V 617d91483a6Sfdy def VEC_EXT4 = "b011100".U // VF4 0 -> V 618d91483a6Sfdy def VEC_EXT8 = "b011101".U // VF8 0 -> V 619d91483a6Sfdy def VEC_VVM = "b011110".U // VEC_VVM 620d91483a6Sfdy def VEC_VXM = "b011111".U // VEC_VXM 621d91483a6Sfdy def VEC_SLIDE1UP = "b100000".U // vslide1up.vx 622d91483a6Sfdy def VEC_FSLIDE1UP = "b100001".U // vfslide1up.vf 623d91483a6Sfdy def VEC_SLIDE1DOWN = "b100010".U // vslide1down.vx 624d91483a6Sfdy def VEC_FSLIDE1DOWN = "b100011".U // vfslide1down.vf 625d91483a6Sfdy def VEC_VRED = "b100100".U // VEC_VRED 626d91483a6Sfdy def VEC_SLIDEUP = "b100101".U // VEC_SLIDEUP 627d91483a6Sfdy def VEC_SLIDEDOWN = "b100111".U // VEC_SLIDEDOWN 628d91483a6Sfdy def VEC_M0X = "b101001".U // VEC_M0X 0MV 629d91483a6Sfdy def VEC_MVV = "b101010".U // VEC_MVV VMV 630d91483a6Sfdy def VEC_M0X_VFIRST = "b101011".U // 63184260280Sczw def VEC_VWW = "b101100".U // 63265df1368Sczw def VEC_RGATHER = "b101101".U // vrgather.vv, vrgather.vi 63365df1368Sczw def VEC_RGATHER_VX = "b101110".U // vrgather.vx 63465df1368Sczw def VEC_RGATHEREI16 = "b101111".U // vrgatherei16.vv 635adf68ff3Sczw def VEC_COMPRESS = "b110000".U // vcompress.vm 6364ee69032SzhanglyGit def VEC_US_LD = "b110001".U // vector unit strided load 637684d7aceSxiaofeibao-xjtu def VEC_VFV = "b111000".U // VEC_VFV 6383748ec56Sxiaofeibao-xjtu def VEC_VFW = "b111001".U // VEC_VFW 6393748ec56Sxiaofeibao-xjtu def VEC_WFW = "b111010".U // VEC_WVW 640f06d6d60Sxiaofeibao-xjtu def VEC_VFM = "b111011".U // VEC_VFM 641582849ffSxiaofeibao-xjtu def VEC_VFRED = "b111100".U // VEC_VFRED 642b94b1889Sxiaofeibao-xjtu def VEC_VFREDOSUM = "b111101".U // VEC_VFREDOSUM 643d91483a6Sfdy def VEC_M0M = "b000000".U // VEC_M0M 644d91483a6Sfdy def VEC_MMM = "b000000".U // VEC_MMM 6450a34fc22SZiyue Zhang def VEC_MVNR = "b000100".U // vmvnr 646d91483a6Sfdy def dummy = "b111111".U 647d91483a6Sfdy 648d91483a6Sfdy def X = BitPat("b000000") 649d91483a6Sfdy 650d91483a6Sfdy def apply() = UInt(6.W) 651e2695e90SzhanglyGit def needSplit(UopSplitType: UInt) = UopSplitType(4) || UopSplitType(5) 652d91483a6Sfdy } 653d91483a6Sfdy 6546ab6918fSYinan Xu object ExceptionNO { 6556ab6918fSYinan Xu def instrAddrMisaligned = 0 6566ab6918fSYinan Xu def instrAccessFault = 1 6576ab6918fSYinan Xu def illegalInstr = 2 6586ab6918fSYinan Xu def breakPoint = 3 6596ab6918fSYinan Xu def loadAddrMisaligned = 4 6606ab6918fSYinan Xu def loadAccessFault = 5 6616ab6918fSYinan Xu def storeAddrMisaligned = 6 6626ab6918fSYinan Xu def storeAccessFault = 7 6636ab6918fSYinan Xu def ecallU = 8 6646ab6918fSYinan Xu def ecallS = 9 6656ab6918fSYinan Xu def ecallM = 11 6666ab6918fSYinan Xu def instrPageFault = 12 6676ab6918fSYinan Xu def loadPageFault = 13 6686ab6918fSYinan Xu // def singleStep = 14 6696ab6918fSYinan Xu def storePageFault = 15 6706ab6918fSYinan Xu def priorities = Seq( 6716ab6918fSYinan Xu breakPoint, // TODO: different BP has different priority 6726ab6918fSYinan Xu instrPageFault, 6736ab6918fSYinan Xu instrAccessFault, 6746ab6918fSYinan Xu illegalInstr, 6756ab6918fSYinan Xu instrAddrMisaligned, 6766ab6918fSYinan Xu ecallM, ecallS, ecallU, 677d880177dSYinan Xu storeAddrMisaligned, 678d880177dSYinan Xu loadAddrMisaligned, 6796ab6918fSYinan Xu storePageFault, 6806ab6918fSYinan Xu loadPageFault, 6816ab6918fSYinan Xu storeAccessFault, 682d880177dSYinan Xu loadAccessFault 6836ab6918fSYinan Xu ) 6846ab6918fSYinan Xu def all = priorities.distinct.sorted 6856ab6918fSYinan Xu def frontendSet = Seq( 6866ab6918fSYinan Xu instrAddrMisaligned, 6876ab6918fSYinan Xu instrAccessFault, 6886ab6918fSYinan Xu illegalInstr, 6896ab6918fSYinan Xu instrPageFault 6906ab6918fSYinan Xu ) 6916ab6918fSYinan Xu def partialSelect(vec: Vec[Bool], select: Seq[Int]): Vec[Bool] = { 6926ab6918fSYinan Xu val new_vec = Wire(ExceptionVec()) 6936ab6918fSYinan Xu new_vec.foreach(_ := false.B) 6946ab6918fSYinan Xu select.foreach(i => new_vec(i) := vec(i)) 6956ab6918fSYinan Xu new_vec 6966ab6918fSYinan Xu } 6976ab6918fSYinan Xu def selectFrontend(vec: Vec[Bool]): Vec[Bool] = partialSelect(vec, frontendSet) 6986ab6918fSYinan Xu def selectAll(vec: Vec[Bool]): Vec[Bool] = partialSelect(vec, ExceptionNO.all) 6996ab6918fSYinan Xu def selectByFu(vec:Vec[Bool], fuConfig: FuConfig): Vec[Bool] = 7006ab6918fSYinan Xu partialSelect(vec, fuConfig.exceptionOut) 7016ab6918fSYinan Xu } 7026ab6918fSYinan Xu 703d2b20d1aSTang Haojin object TopDownCounters extends Enumeration { 704d2b20d1aSTang Haojin val NoStall = Value("NoStall") // Base 705d2b20d1aSTang Haojin // frontend 706d2b20d1aSTang Haojin val OverrideBubble = Value("OverrideBubble") 707d2b20d1aSTang Haojin val FtqUpdateBubble = Value("FtqUpdateBubble") 708d2b20d1aSTang Haojin // val ControlRedirectBubble = Value("ControlRedirectBubble") 709d2b20d1aSTang Haojin val TAGEMissBubble = Value("TAGEMissBubble") 710d2b20d1aSTang Haojin val SCMissBubble = Value("SCMissBubble") 711d2b20d1aSTang Haojin val ITTAGEMissBubble = Value("ITTAGEMissBubble") 712d2b20d1aSTang Haojin val RASMissBubble = Value("RASMissBubble") 713d2b20d1aSTang Haojin val MemVioRedirectBubble = Value("MemVioRedirectBubble") 714d2b20d1aSTang Haojin val OtherRedirectBubble = Value("OtherRedirectBubble") 715d2b20d1aSTang Haojin val FtqFullStall = Value("FtqFullStall") 716d2b20d1aSTang Haojin 717d2b20d1aSTang Haojin val ICacheMissBubble = Value("ICacheMissBubble") 718d2b20d1aSTang Haojin val ITLBMissBubble = Value("ITLBMissBubble") 719d2b20d1aSTang Haojin val BTBMissBubble = Value("BTBMissBubble") 720d2b20d1aSTang Haojin val FetchFragBubble = Value("FetchFragBubble") 721d2b20d1aSTang Haojin 722d2b20d1aSTang Haojin // backend 723d2b20d1aSTang Haojin // long inst stall at rob head 724d2b20d1aSTang Haojin val DivStall = Value("DivStall") // int div, float div/sqrt 725d2b20d1aSTang Haojin val IntNotReadyStall = Value("IntNotReadyStall") // int-inst at rob head not issue 726d2b20d1aSTang Haojin val FPNotReadyStall = Value("FPNotReadyStall") // fp-inst at rob head not issue 727d2b20d1aSTang Haojin val MemNotReadyStall = Value("MemNotReadyStall") // mem-inst at rob head not issue 728d2b20d1aSTang Haojin // freelist full 729d2b20d1aSTang Haojin val IntFlStall = Value("IntFlStall") 730d2b20d1aSTang Haojin val FpFlStall = Value("FpFlStall") 731d2b20d1aSTang Haojin // dispatch queue full 732d2b20d1aSTang Haojin val IntDqStall = Value("IntDqStall") 733d2b20d1aSTang Haojin val FpDqStall = Value("FpDqStall") 734d2b20d1aSTang Haojin val LsDqStall = Value("LsDqStall") 735d2b20d1aSTang Haojin 736d2b20d1aSTang Haojin // memblock 737d2b20d1aSTang Haojin val LoadTLBStall = Value("LoadTLBStall") 738d2b20d1aSTang Haojin val LoadL1Stall = Value("LoadL1Stall") 739d2b20d1aSTang Haojin val LoadL2Stall = Value("LoadL2Stall") 740d2b20d1aSTang Haojin val LoadL3Stall = Value("LoadL3Stall") 741d2b20d1aSTang Haojin val LoadMemStall = Value("LoadMemStall") 742d2b20d1aSTang Haojin val StoreStall = Value("StoreStall") // include store tlb miss 743d2b20d1aSTang Haojin val AtomicStall = Value("AtomicStall") // atomic, load reserved, store conditional 744d2b20d1aSTang Haojin 745d2b20d1aSTang Haojin // xs replay (different to gem5) 746d2b20d1aSTang Haojin val LoadVioReplayStall = Value("LoadVioReplayStall") 747d2b20d1aSTang Haojin val LoadMSHRReplayStall = Value("LoadMSHRReplayStall") 748d2b20d1aSTang Haojin 749d2b20d1aSTang Haojin // bad speculation 750d2b20d1aSTang Haojin val ControlRecoveryStall = Value("ControlRecoveryStall") 751d2b20d1aSTang Haojin val MemVioRecoveryStall = Value("MemVioRecoveryStall") 752d2b20d1aSTang Haojin val OtherRecoveryStall = Value("OtherRecoveryStall") 753d2b20d1aSTang Haojin 754d2b20d1aSTang Haojin val FlushedInsts = Value("FlushedInsts") // control flushed, memvio flushed, others 755d2b20d1aSTang Haojin 756d2b20d1aSTang Haojin val OtherCoreStall = Value("OtherCoreStall") 757d2b20d1aSTang Haojin 758d2b20d1aSTang Haojin val NumStallReasons = Value("NumStallReasons") 759d2b20d1aSTang Haojin } 7609a2e6b8aSLinJiawei} 761