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 78a3edac52SYinan Xu object CommitType { 79c3abb8b6SYinan Xu def NORMAL = "b000".U // int/fp 80c3abb8b6SYinan Xu def BRANCH = "b001".U // branch 81c3abb8b6SYinan Xu def LOAD = "b010".U // load 82c3abb8b6SYinan Xu def STORE = "b011".U // store 83518d8658SYinan Xu 84c3abb8b6SYinan Xu def apply() = UInt(3.W) 85c3abb8b6SYinan Xu def isFused(commitType: UInt): Bool = commitType(2) 86c3abb8b6SYinan Xu def isLoadStore(commitType: UInt): Bool = !isFused(commitType) && commitType(1) 87c3abb8b6SYinan Xu def lsInstIsStore(commitType: UInt): Bool = commitType(0) 88c3abb8b6SYinan Xu def isStore(commitType: UInt): Bool = isLoadStore(commitType) && lsInstIsStore(commitType) 89c3abb8b6SYinan Xu def isBranch(commitType: UInt): Bool = commitType(0) && !commitType(1) && !isFused(commitType) 90518d8658SYinan Xu } 91bfb958a3SYinan Xu 92bfb958a3SYinan Xu object RedirectLevel { 932d7c7105SYinan Xu def flushAfter = "b0".U 942d7c7105SYinan Xu def flush = "b1".U 95bfb958a3SYinan Xu 962d7c7105SYinan Xu def apply() = UInt(1.W) 972d7c7105SYinan Xu // def isUnconditional(level: UInt) = level(1) 98bfb958a3SYinan Xu def flushItself(level: UInt) = level(0) 992d7c7105SYinan Xu // def isException(level: UInt) = level(1) && level(0) 100bfb958a3SYinan Xu } 101baf8def6SYinan Xu 102baf8def6SYinan Xu object ExceptionVec { 103da3bf434SMaxpicca-Li val ExceptionVecSize = 16 104da3bf434SMaxpicca-Li def apply() = Vec(ExceptionVecSize, Bool()) 105baf8def6SYinan Xu } 106a8e04b1dSYinan Xu 107c60c1ab4SWilliam Wang object PMAMode { 1088d9a04fcSWilliam Wang def R = "b1".U << 0 //readable 1098d9a04fcSWilliam Wang def W = "b1".U << 1 //writeable 1108d9a04fcSWilliam Wang def X = "b1".U << 2 //executable 1118d9a04fcSWilliam Wang def I = "b1".U << 3 //cacheable: icache 1128d9a04fcSWilliam Wang def D = "b1".U << 4 //cacheable: dcache 1138d9a04fcSWilliam Wang def S = "b1".U << 5 //enable speculative access 114cff68e26SWilliam Wang def A = "b1".U << 6 //enable atomic operation, A imply R & W 1158d9a04fcSWilliam Wang def C = "b1".U << 7 //if it is cacheable is configable 116c60c1ab4SWilliam Wang def Reserved = "b0".U 117c60c1ab4SWilliam Wang 118c60c1ab4SWilliam Wang def apply() = UInt(7.W) 119c60c1ab4SWilliam Wang 120c60c1ab4SWilliam Wang def read(mode: UInt) = mode(0) 121c60c1ab4SWilliam Wang def write(mode: UInt) = mode(1) 122c60c1ab4SWilliam Wang def execute(mode: UInt) = mode(2) 123c60c1ab4SWilliam Wang def icache(mode: UInt) = mode(3) 124c60c1ab4SWilliam Wang def dcache(mode: UInt) = mode(4) 125c60c1ab4SWilliam Wang def speculate(mode: UInt) = mode(5) 126c60c1ab4SWilliam Wang def atomic(mode: UInt) = mode(6) 127c60c1ab4SWilliam Wang def configable_cache(mode: UInt) = mode(7) 128c60c1ab4SWilliam Wang 129c60c1ab4SWilliam Wang def strToMode(s: String) = { 130423b9255SWilliam Wang var result = 0.U(8.W) 131c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("R") >= 0) result = result + R 132c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("W") >= 0) result = result + W 133c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("X") >= 0) result = result + X 134c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("I") >= 0) result = result + I 135c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("D") >= 0) result = result + D 136c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("S") >= 0) result = result + S 137c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("A") >= 0) result = result + A 138c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("C") >= 0) result = result + C 139c60c1ab4SWilliam Wang result 140c60c1ab4SWilliam Wang } 141c60c1ab4SWilliam Wang } 1422225d46eSJiawei Lin 1432225d46eSJiawei Lin 1442225d46eSJiawei Lin object CSROpType { 1452225d46eSJiawei Lin def jmp = "b000".U 1462225d46eSJiawei Lin def wrt = "b001".U 1472225d46eSJiawei Lin def set = "b010".U 1482225d46eSJiawei Lin def clr = "b011".U 149b6900d94SYinan Xu def wfi = "b100".U 1502225d46eSJiawei Lin def wrti = "b101".U 1512225d46eSJiawei Lin def seti = "b110".U 1522225d46eSJiawei Lin def clri = "b111".U 1535d669833SYinan Xu def needAccess(op: UInt): Bool = op(1, 0) =/= 0.U 1542225d46eSJiawei Lin } 1552225d46eSJiawei Lin 1562225d46eSJiawei Lin // jump 1572225d46eSJiawei Lin object JumpOpType { 1582225d46eSJiawei Lin def jal = "b00".U 1592225d46eSJiawei Lin def jalr = "b01".U 1602225d46eSJiawei Lin def auipc = "b10".U 1612225d46eSJiawei Lin// def call = "b11_011".U 1622225d46eSJiawei Lin// def ret = "b11_100".U 1632225d46eSJiawei Lin def jumpOpisJalr(op: UInt) = op(0) 1642225d46eSJiawei Lin def jumpOpisAuipc(op: UInt) = op(1) 1652225d46eSJiawei Lin } 1662225d46eSJiawei Lin 1672225d46eSJiawei Lin object FenceOpType { 1682225d46eSJiawei Lin def fence = "b10000".U 1692225d46eSJiawei Lin def sfence = "b10001".U 1702225d46eSJiawei Lin def fencei = "b10010".U 171af2f7849Shappy-lx def nofence= "b00000".U 1722225d46eSJiawei Lin } 1732225d46eSJiawei Lin 1742225d46eSJiawei Lin object ALUOpType { 175ee8ff153Szfw // shift optype 176675acc68SYinan Xu def slliuw = "b000_0000".U // slliuw: ZEXT(src1[31:0]) << shamt 177675acc68SYinan Xu def sll = "b000_0001".U // sll: src1 << src2 178ee8ff153Szfw 179675acc68SYinan Xu def bclr = "b000_0010".U // bclr: src1 & ~(1 << src2[5:0]) 180675acc68SYinan Xu def bset = "b000_0011".U // bset: src1 | (1 << src2[5:0]) 181675acc68SYinan Xu def binv = "b000_0100".U // binv: src1 ^ ~(1 << src2[5:0]) 182ee8ff153Szfw 183675acc68SYinan Xu def srl = "b000_0101".U // srl: src1 >> src2 184675acc68SYinan Xu def bext = "b000_0110".U // bext: (src1 >> src2)[0] 185675acc68SYinan Xu def sra = "b000_0111".U // sra: src1 >> src2 (arithmetic) 186ee8ff153Szfw 1877b441e5eSYinan Xu def rol = "b000_1001".U // rol: (src1 << src2) | (src1 >> (xlen - src2)) 1887b441e5eSYinan Xu def ror = "b000_1011".U // ror: (src1 >> src2) | (src1 << (xlen - src2)) 189184a1958Szfw 190ee8ff153Szfw // RV64 32bit optype 191675acc68SYinan Xu def addw = "b001_0000".U // addw: SEXT((src1 + src2)[31:0]) 192675acc68SYinan Xu def oddaddw = "b001_0001".U // oddaddw: SEXT((src1[0] + src2)[31:0]) 193675acc68SYinan Xu def subw = "b001_0010".U // subw: SEXT((src1 - src2)[31:0]) 19454711376Ssinsanction def lui32addw = "b001_0011".U // lui32addw: SEXT(SEXT(src2[11:0], 32) + {src2[31:12], 12'b0}, 64) 195ee8ff153Szfw 196675acc68SYinan Xu def addwbit = "b001_0100".U // addwbit: (src1 + src2)[0] 197675acc68SYinan Xu def addwbyte = "b001_0101".U // addwbyte: (src1 + src2)[7:0] 198675acc68SYinan Xu def addwzexth = "b001_0110".U // addwzexth: ZEXT((src1 + src2)[15:0]) 199675acc68SYinan Xu def addwsexth = "b001_0111".U // addwsexth: SEXT((src1 + src2)[15:0]) 200ee8ff153Szfw 201675acc68SYinan Xu def sllw = "b001_1000".U // sllw: SEXT((src1 << src2)[31:0]) 202675acc68SYinan Xu def srlw = "b001_1001".U // srlw: SEXT((src1[31:0] >> src2)[31:0]) 203675acc68SYinan Xu def sraw = "b001_1010".U // sraw: SEXT((src1[31:0] >> src2)[31:0]) 204675acc68SYinan Xu def rolw = "b001_1100".U 205675acc68SYinan Xu def rorw = "b001_1101".U 206675acc68SYinan Xu 207675acc68SYinan Xu // ADD-op 208675acc68SYinan Xu def adduw = "b010_0000".U // adduw: src1[31:0] + src2 209675acc68SYinan Xu def add = "b010_0001".U // add: src1 + src2 210675acc68SYinan Xu def oddadd = "b010_0010".U // oddadd: src1[0] + src2 211fe528fd6Ssinsanction def lui32add = "b010_0011".U // lui32add: SEXT(src2[11:0]) + {src2[63:12], 12'b0} 212675acc68SYinan Xu 213675acc68SYinan Xu def sr29add = "b010_0100".U // sr29add: src1[63:29] + src2 214675acc68SYinan Xu def sr30add = "b010_0101".U // sr30add: src1[63:30] + src2 215675acc68SYinan Xu def sr31add = "b010_0110".U // sr31add: src1[63:31] + src2 216675acc68SYinan Xu def sr32add = "b010_0111".U // sr32add: src1[63:32] + src2 217675acc68SYinan Xu 218675acc68SYinan Xu def sh1adduw = "b010_1000".U // sh1adduw: {src1[31:0], 1'b0} + src2 219675acc68SYinan Xu def sh1add = "b010_1001".U // sh1add: {src1[62:0], 1'b0} + src2 220675acc68SYinan Xu def sh2adduw = "b010_1010".U // sh2add_uw: {src1[31:0], 2'b0} + src2 221675acc68SYinan Xu def sh2add = "b010_1011".U // sh2add: {src1[61:0], 2'b0} + src2 222675acc68SYinan Xu def sh3adduw = "b010_1100".U // sh3add_uw: {src1[31:0], 3'b0} + src2 223675acc68SYinan Xu def sh3add = "b010_1101".U // sh3add: {src1[60:0], 3'b0} + src2 224675acc68SYinan Xu def sh4add = "b010_1111".U // sh4add: {src1[59:0], 4'b0} + src2 225675acc68SYinan Xu 226675acc68SYinan Xu // SUB-op: src1 - src2 227675acc68SYinan Xu def sub = "b011_0000".U 228675acc68SYinan Xu def sltu = "b011_0001".U 229675acc68SYinan Xu def slt = "b011_0010".U 230675acc68SYinan Xu def maxu = "b011_0100".U 231675acc68SYinan Xu def minu = "b011_0101".U 232675acc68SYinan Xu def max = "b011_0110".U 233675acc68SYinan Xu def min = "b011_0111".U 234675acc68SYinan Xu 235675acc68SYinan Xu // branch 236675acc68SYinan Xu def beq = "b111_0000".U 237675acc68SYinan Xu def bne = "b111_0010".U 238675acc68SYinan Xu def blt = "b111_1000".U 239675acc68SYinan Xu def bge = "b111_1010".U 240675acc68SYinan Xu def bltu = "b111_1100".U 241675acc68SYinan Xu def bgeu = "b111_1110".U 242675acc68SYinan Xu 243675acc68SYinan Xu // misc optype 244675acc68SYinan Xu def and = "b100_0000".U 245675acc68SYinan Xu def andn = "b100_0001".U 246675acc68SYinan Xu def or = "b100_0010".U 247675acc68SYinan Xu def orn = "b100_0011".U 248675acc68SYinan Xu def xor = "b100_0100".U 249675acc68SYinan Xu def xnor = "b100_0101".U 250675acc68SYinan Xu def orcb = "b100_0110".U 251675acc68SYinan Xu 252675acc68SYinan Xu def sextb = "b100_1000".U 253675acc68SYinan Xu def packh = "b100_1001".U 254675acc68SYinan Xu def sexth = "b100_1010".U 255675acc68SYinan Xu def packw = "b100_1011".U 256675acc68SYinan Xu 257675acc68SYinan Xu def revb = "b101_0000".U 258675acc68SYinan Xu def rev8 = "b101_0001".U 259675acc68SYinan Xu def pack = "b101_0010".U 260675acc68SYinan Xu def orh48 = "b101_0011".U 261675acc68SYinan Xu 262675acc68SYinan Xu def szewl1 = "b101_1000".U 263675acc68SYinan Xu def szewl2 = "b101_1001".U 264675acc68SYinan Xu def szewl3 = "b101_1010".U 265675acc68SYinan Xu def byte2 = "b101_1011".U 266675acc68SYinan Xu 267675acc68SYinan Xu def andlsb = "b110_0000".U 268675acc68SYinan Xu def andzexth = "b110_0001".U 269675acc68SYinan Xu def orlsb = "b110_0010".U 270675acc68SYinan Xu def orzexth = "b110_0011".U 271675acc68SYinan Xu def xorlsb = "b110_0100".U 272675acc68SYinan Xu def xorzexth = "b110_0101".U 273675acc68SYinan Xu def orcblsb = "b110_0110".U 274675acc68SYinan Xu def orcbzexth = "b110_0111".U 275675acc68SYinan Xu 276675acc68SYinan Xu def isAddw(func: UInt) = func(6, 4) === "b001".U && !func(3) && !func(1) 277675acc68SYinan Xu def isSimpleLogic(func: UInt) = func(6, 4) === "b100".U && !func(0) 278675acc68SYinan Xu def logicToLsb(func: UInt) = Cat("b110".U(3.W), func(3, 1), 0.U(1.W)) 279675acc68SYinan Xu def logicToZexth(func: UInt) = Cat("b110".U(3.W), func(3, 1), 1.U(1.W)) 280675acc68SYinan Xu 28157a10886SXuan Hu def apply() = UInt(FuOpTypeWidth.W) 2822225d46eSJiawei Lin } 2832225d46eSJiawei Lin 284d91483a6Sfdy object VSETOpType { 285a8db15d8Sfdy val setVlmaxBit = 0 286a8db15d8Sfdy val keepVlBit = 1 287a8db15d8Sfdy // destTypeBit == 0: write vl to rd 288a8db15d8Sfdy // destTypeBit == 1: write vconfig 289a8db15d8Sfdy val destTypeBit = 5 290a8db15d8Sfdy 291a32c56f4SXuan Hu // vsetvli's uop 292a32c56f4SXuan Hu // rs1!=x0, normal 293a32c56f4SXuan Hu // uop0: r(rs1), w(vconfig) | x[rs1],vtypei -> vconfig 294a32c56f4SXuan Hu // uop1: r(rs1), w(rd) | x[rs1],vtypei -> x[rd] 295a32c56f4SXuan Hu def uvsetvcfg_xi = "b1010_0000".U 296a32c56f4SXuan Hu def uvsetrd_xi = "b1000_0000".U 297a32c56f4SXuan Hu // rs1==x0, rd!=x0, set vl to vlmax, set rd to vlmax, set vtype 298a32c56f4SXuan Hu // uop0: w(vconfig) | vlmax, vtypei -> vconfig 299a32c56f4SXuan Hu // uop1: w(rd) | vlmax, vtypei -> x[rd] 300a32c56f4SXuan Hu def uvsetvcfg_vlmax_i = "b1010_0001".U 301a32c56f4SXuan Hu def uvsetrd_vlmax_i = "b1000_0001".U 302a32c56f4SXuan Hu // rs1==x0, rd==x0, keep vl, set vtype 303a32c56f4SXuan Hu // uop0: r(vconfig), w(vconfig) | ld_vconfig.vl, vtypei -> vconfig 304a32c56f4SXuan Hu def uvsetvcfg_keep_v = "b1010_0010".U 305d91483a6Sfdy 306a32c56f4SXuan Hu // vsetvl's uop 307a32c56f4SXuan Hu // rs1!=x0, normal 308a32c56f4SXuan Hu // uop0: r(rs1,rs2), w(vconfig) | x[rs1],x[rs2] -> vconfig 309a32c56f4SXuan Hu // uop1: r(rs1,rs2), w(rd) | x[rs1],x[rs2] -> x[rd] 310a32c56f4SXuan Hu def uvsetvcfg_xx = "b0110_0000".U 311a32c56f4SXuan Hu def uvsetrd_xx = "b0100_0000".U 312a32c56f4SXuan Hu // rs1==x0, rd!=x0, set vl to vlmax, set rd to vlmax, set vtype 313a32c56f4SXuan Hu // uop0: r(rs2), w(vconfig) | vlmax, vtypei -> vconfig 314a32c56f4SXuan Hu // uop1: r(rs2), w(rd) | vlmax, vtypei -> x[rd] 315a32c56f4SXuan Hu def uvsetvcfg_vlmax_x = "b0110_0001".U 316a32c56f4SXuan Hu def uvsetrd_vlmax_x = "b0100_0001".U 317a32c56f4SXuan Hu // rs1==x0, rd==x0, keep vl, set vtype 318a32c56f4SXuan Hu // uop0: r(rs2), w(vtmp) | x[rs2] -> vtmp 319a32c56f4SXuan Hu // uop0: r(vconfig,vtmp), w(vconfig) | old_vconfig.vl, vtmp -> vconfig 320a32c56f4SXuan Hu def uvmv_v_x = "b0110_0010".U 321a32c56f4SXuan Hu def uvsetvcfg_vv = "b0111_0010".U 322a32c56f4SXuan Hu 323a32c56f4SXuan Hu // vsetivli's uop 324a32c56f4SXuan Hu // uop0: w(vconfig) | vli, vtypei -> vconfig 325a32c56f4SXuan Hu // uop1: w(rd) | vli, vtypei -> x[rd] 326a32c56f4SXuan Hu def uvsetvcfg_ii = "b0010_0000".U 327a32c56f4SXuan Hu def uvsetrd_ii = "b0000_0000".U 328a32c56f4SXuan Hu 329a32c56f4SXuan Hu def isVsetvl (func: UInt) = func(6) 330a32c56f4SXuan Hu def isVsetvli (func: UInt) = func(7) 331a32c56f4SXuan Hu def isVsetivli(func: UInt) = func(7, 6) === 0.U 332a32c56f4SXuan Hu def isNormal (func: UInt) = func(1, 0) === 0.U 333a8db15d8Sfdy def isSetVlmax(func: UInt) = func(setVlmaxBit) 334a8db15d8Sfdy def isKeepVl (func: UInt) = func(keepVlBit) 335a32c56f4SXuan Hu // RG: region 336a32c56f4SXuan Hu def writeIntRG(func: UInt) = !func(5) 337a32c56f4SXuan Hu def writeVecRG(func: UInt) = func(5) 338a32c56f4SXuan Hu def readIntRG (func: UInt) = !func(4) 339a32c56f4SXuan Hu def readVecRG (func: UInt) = func(4) 340a8db15d8Sfdy // modify fuOpType 341a8db15d8Sfdy def switchDest(func: UInt) = func ^ (1 << destTypeBit).U 342a8db15d8Sfdy def keepVl(func: UInt) = func | (1 << keepVlBit).U 343a8db15d8Sfdy def setVlmax(func: UInt) = func | (1 << setVlmaxBit).U 344d91483a6Sfdy } 345d91483a6Sfdy 3463b739f49SXuan Hu object BRUOpType { 3473b739f49SXuan Hu // branch 3483b739f49SXuan Hu def beq = "b000_000".U 3493b739f49SXuan Hu def bne = "b000_001".U 3503b739f49SXuan Hu def blt = "b000_100".U 3513b739f49SXuan Hu def bge = "b000_101".U 3523b739f49SXuan Hu def bltu = "b001_000".U 3533b739f49SXuan Hu def bgeu = "b001_001".U 3543b739f49SXuan Hu 3553b739f49SXuan Hu def getBranchType(func: UInt) = func(3, 1) 3563b739f49SXuan Hu def isBranchInvert(func: UInt) = func(0) 3573b739f49SXuan Hu } 3583b739f49SXuan Hu 3593b739f49SXuan Hu object MULOpType { 3603b739f49SXuan Hu // mul 3613b739f49SXuan Hu // bit encoding: | type (2bit) | isWord(1bit) | opcode(2bit) | 3623b739f49SXuan Hu def mul = "b00000".U 3633b739f49SXuan Hu def mulh = "b00001".U 3643b739f49SXuan Hu def mulhsu = "b00010".U 3653b739f49SXuan Hu def mulhu = "b00011".U 3663b739f49SXuan Hu def mulw = "b00100".U 3673b739f49SXuan Hu 3683b739f49SXuan Hu def mulw7 = "b01100".U 3693b739f49SXuan Hu def isSign(op: UInt) = !op(1) 3703b739f49SXuan Hu def isW(op: UInt) = op(2) 3713b739f49SXuan Hu def isH(op: UInt) = op(1, 0) =/= 0.U 3723b739f49SXuan Hu def getOp(op: UInt) = Cat(op(3), op(1, 0)) 3733b739f49SXuan Hu } 3743b739f49SXuan Hu 3753b739f49SXuan Hu object DIVOpType { 3763b739f49SXuan Hu // div 3773b739f49SXuan Hu // bit encoding: | type (2bit) | isWord(1bit) | isSign(1bit) | opcode(1bit) | 3783b739f49SXuan Hu def div = "b10000".U 3793b739f49SXuan Hu def divu = "b10010".U 3803b739f49SXuan Hu def rem = "b10001".U 3813b739f49SXuan Hu def remu = "b10011".U 3823b739f49SXuan Hu 3833b739f49SXuan Hu def divw = "b10100".U 3843b739f49SXuan Hu def divuw = "b10110".U 3853b739f49SXuan Hu def remw = "b10101".U 3863b739f49SXuan Hu def remuw = "b10111".U 3873b739f49SXuan Hu 3883b739f49SXuan Hu def isSign(op: UInt) = !op(1) 3893b739f49SXuan Hu def isW(op: UInt) = op(2) 3903b739f49SXuan Hu def isH(op: UInt) = op(0) 3913b739f49SXuan Hu } 3923b739f49SXuan Hu 3932225d46eSJiawei Lin object MDUOpType { 3942225d46eSJiawei Lin // mul 3952225d46eSJiawei Lin // bit encoding: | type (2bit) | isWord(1bit) | opcode(2bit) | 3962225d46eSJiawei Lin def mul = "b00000".U 3972225d46eSJiawei Lin def mulh = "b00001".U 3982225d46eSJiawei Lin def mulhsu = "b00010".U 3992225d46eSJiawei Lin def mulhu = "b00011".U 4002225d46eSJiawei Lin def mulw = "b00100".U 4012225d46eSJiawei Lin 40288825c5cSYinan Xu def mulw7 = "b01100".U 40388825c5cSYinan Xu 4042225d46eSJiawei Lin // div 4052225d46eSJiawei Lin // bit encoding: | type (2bit) | isWord(1bit) | isSign(1bit) | opcode(1bit) | 40688825c5cSYinan Xu def div = "b10000".U 40788825c5cSYinan Xu def divu = "b10010".U 40888825c5cSYinan Xu def rem = "b10001".U 40988825c5cSYinan Xu def remu = "b10011".U 4102225d46eSJiawei Lin 41188825c5cSYinan Xu def divw = "b10100".U 41288825c5cSYinan Xu def divuw = "b10110".U 41388825c5cSYinan Xu def remw = "b10101".U 41488825c5cSYinan Xu def remuw = "b10111".U 4152225d46eSJiawei Lin 41688825c5cSYinan Xu def isMul(op: UInt) = !op(4) 41788825c5cSYinan Xu def isDiv(op: UInt) = op(4) 4182225d46eSJiawei Lin 4192225d46eSJiawei Lin def isDivSign(op: UInt) = isDiv(op) && !op(1) 4202225d46eSJiawei Lin def isW(op: UInt) = op(2) 4212225d46eSJiawei Lin def isH(op: UInt) = (isDiv(op) && op(0)) || (isMul(op) && op(1, 0) =/= 0.U) 4222225d46eSJiawei Lin def getMulOp(op: UInt) = op(1, 0) 4232225d46eSJiawei Lin } 4242225d46eSJiawei Lin 4252225d46eSJiawei Lin object LSUOpType { 426d200f594SWilliam Wang // load pipeline 4272225d46eSJiawei Lin 428d200f594SWilliam Wang // normal load 429d200f594SWilliam Wang // Note: bit(1, 0) are size, DO NOT CHANGE 430d200f594SWilliam Wang // bit encoding: | load 0 | is unsigned(1bit) | size(2bit) | 431d200f594SWilliam Wang def lb = "b0000".U 432d200f594SWilliam Wang def lh = "b0001".U 433d200f594SWilliam Wang def lw = "b0010".U 434d200f594SWilliam Wang def ld = "b0011".U 435d200f594SWilliam Wang def lbu = "b0100".U 436d200f594SWilliam Wang def lhu = "b0101".U 437d200f594SWilliam Wang def lwu = "b0110".U 438ca18a0b4SWilliam Wang 439d200f594SWilliam Wang // Zicbop software prefetch 440d200f594SWilliam Wang // bit encoding: | prefetch 1 | 0 | prefetch type (2bit) | 441d200f594SWilliam Wang def prefetch_i = "b1000".U // TODO 442d200f594SWilliam Wang def prefetch_r = "b1001".U 443d200f594SWilliam Wang def prefetch_w = "b1010".U 444ca18a0b4SWilliam Wang 445d200f594SWilliam Wang def isPrefetch(op: UInt): Bool = op(3) 446d200f594SWilliam Wang 447d200f594SWilliam Wang // store pipeline 448d200f594SWilliam Wang // normal store 449d200f594SWilliam Wang // bit encoding: | store 00 | size(2bit) | 450d200f594SWilliam Wang def sb = "b0000".U 451d200f594SWilliam Wang def sh = "b0001".U 452d200f594SWilliam Wang def sw = "b0010".U 453d200f594SWilliam Wang def sd = "b0011".U 454d200f594SWilliam Wang 455d200f594SWilliam Wang // l1 cache op 456d200f594SWilliam Wang // bit encoding: | cbo_zero 01 | size(2bit) 11 | 457d200f594SWilliam Wang def cbo_zero = "b0111".U 458d200f594SWilliam Wang 459d200f594SWilliam Wang // llc op 460d200f594SWilliam Wang // bit encoding: | prefetch 11 | suboptype(2bit) | 461d200f594SWilliam Wang def cbo_clean = "b1100".U 462d200f594SWilliam Wang def cbo_flush = "b1101".U 463d200f594SWilliam Wang def cbo_inval = "b1110".U 464d200f594SWilliam Wang 465d200f594SWilliam Wang def isCbo(op: UInt): Bool = op(3, 2) === "b11".U 4662225d46eSJiawei Lin 4672225d46eSJiawei Lin // atomics 4682225d46eSJiawei Lin // bit(1, 0) are size 4692225d46eSJiawei Lin // since atomics use a different fu type 4702225d46eSJiawei Lin // so we can safely reuse other load/store's encodings 471d200f594SWilliam Wang // bit encoding: | optype(4bit) | size (2bit) | 4722225d46eSJiawei Lin def lr_w = "b000010".U 4732225d46eSJiawei Lin def sc_w = "b000110".U 4742225d46eSJiawei Lin def amoswap_w = "b001010".U 4752225d46eSJiawei Lin def amoadd_w = "b001110".U 4762225d46eSJiawei Lin def amoxor_w = "b010010".U 4772225d46eSJiawei Lin def amoand_w = "b010110".U 4782225d46eSJiawei Lin def amoor_w = "b011010".U 4792225d46eSJiawei Lin def amomin_w = "b011110".U 4802225d46eSJiawei Lin def amomax_w = "b100010".U 4812225d46eSJiawei Lin def amominu_w = "b100110".U 4822225d46eSJiawei Lin def amomaxu_w = "b101010".U 4832225d46eSJiawei Lin 4842225d46eSJiawei Lin def lr_d = "b000011".U 4852225d46eSJiawei Lin def sc_d = "b000111".U 4862225d46eSJiawei Lin def amoswap_d = "b001011".U 4872225d46eSJiawei Lin def amoadd_d = "b001111".U 4882225d46eSJiawei Lin def amoxor_d = "b010011".U 4892225d46eSJiawei Lin def amoand_d = "b010111".U 4902225d46eSJiawei Lin def amoor_d = "b011011".U 4912225d46eSJiawei Lin def amomin_d = "b011111".U 4922225d46eSJiawei Lin def amomax_d = "b100011".U 4932225d46eSJiawei Lin def amominu_d = "b100111".U 4942225d46eSJiawei Lin def amomaxu_d = "b101011".U 495b6982e83SLemover 496b6982e83SLemover def size(op: UInt) = op(1,0) 4972225d46eSJiawei Lin } 4982225d46eSJiawei Lin 4993feeca58Szfw object BKUOpType { 500ee8ff153Szfw 5013feeca58Szfw def clmul = "b000000".U 5023feeca58Szfw def clmulh = "b000001".U 5033feeca58Szfw def clmulr = "b000010".U 5043feeca58Szfw def xpermn = "b000100".U 5053feeca58Szfw def xpermb = "b000101".U 506ee8ff153Szfw 5073feeca58Szfw def clz = "b001000".U 5083feeca58Szfw def clzw = "b001001".U 5093feeca58Szfw def ctz = "b001010".U 5103feeca58Szfw def ctzw = "b001011".U 5113feeca58Szfw def cpop = "b001100".U 5123feeca58Szfw def cpopw = "b001101".U 51307596dc6Szfw 5143feeca58Szfw // 01xxxx is reserve 5153feeca58Szfw def aes64es = "b100000".U 5163feeca58Szfw def aes64esm = "b100001".U 5173feeca58Szfw def aes64ds = "b100010".U 5183feeca58Szfw def aes64dsm = "b100011".U 5193feeca58Szfw def aes64im = "b100100".U 5203feeca58Szfw def aes64ks1i = "b100101".U 5213feeca58Szfw def aes64ks2 = "b100110".U 5223feeca58Szfw 5233feeca58Szfw // merge to two instruction sm4ks & sm4ed 52419bcce38SFawang Zhang def sm4ed0 = "b101000".U 52519bcce38SFawang Zhang def sm4ed1 = "b101001".U 52619bcce38SFawang Zhang def sm4ed2 = "b101010".U 52719bcce38SFawang Zhang def sm4ed3 = "b101011".U 52819bcce38SFawang Zhang def sm4ks0 = "b101100".U 52919bcce38SFawang Zhang def sm4ks1 = "b101101".U 53019bcce38SFawang Zhang def sm4ks2 = "b101110".U 53119bcce38SFawang Zhang def sm4ks3 = "b101111".U 5323feeca58Szfw 5333feeca58Szfw def sha256sum0 = "b110000".U 5343feeca58Szfw def sha256sum1 = "b110001".U 5353feeca58Szfw def sha256sig0 = "b110010".U 5363feeca58Szfw def sha256sig1 = "b110011".U 5373feeca58Szfw def sha512sum0 = "b110100".U 5383feeca58Szfw def sha512sum1 = "b110101".U 5393feeca58Szfw def sha512sig0 = "b110110".U 5403feeca58Szfw def sha512sig1 = "b110111".U 5413feeca58Szfw 5423feeca58Szfw def sm3p0 = "b111000".U 5433feeca58Szfw def sm3p1 = "b111001".U 544ee8ff153Szfw } 545ee8ff153Szfw 5462225d46eSJiawei Lin object BTBtype { 5472225d46eSJiawei Lin def B = "b00".U // branch 5482225d46eSJiawei Lin def J = "b01".U // jump 5492225d46eSJiawei Lin def I = "b10".U // indirect 5502225d46eSJiawei Lin def R = "b11".U // return 5512225d46eSJiawei Lin 5522225d46eSJiawei Lin def apply() = UInt(2.W) 5532225d46eSJiawei Lin } 5542225d46eSJiawei Lin 5552225d46eSJiawei Lin object SelImm { 556ee8ff153Szfw def IMM_X = "b0111".U 557d91483a6Sfdy def IMM_S = "b1110".U 558ee8ff153Szfw def IMM_SB = "b0001".U 559ee8ff153Szfw def IMM_U = "b0010".U 560ee8ff153Szfw def IMM_UJ = "b0011".U 561ee8ff153Szfw def IMM_I = "b0100".U 562ee8ff153Szfw def IMM_Z = "b0101".U 563ee8ff153Szfw def INVALID_INSTR = "b0110".U 564ee8ff153Szfw def IMM_B6 = "b1000".U 5652225d46eSJiawei Lin 56658c35d23Shuxuan0307 def IMM_OPIVIS = "b1001".U 56758c35d23Shuxuan0307 def IMM_OPIVIU = "b1010".U 568912e2179SXuan Hu def IMM_VSETVLI = "b1100".U 569912e2179SXuan Hu def IMM_VSETIVLI = "b1101".U 570fe528fd6Ssinsanction def IMM_LUI32 = "b1011".U 57158c35d23Shuxuan0307 57257a10886SXuan Hu def X = BitPat("b0000") 5736e7c9679Shuxuan0307 574ee8ff153Szfw def apply() = UInt(4.W) 5750655b1a0SXuan Hu 5760655b1a0SXuan Hu def mkString(immType: UInt) : String = { 5770655b1a0SXuan Hu val strMap = Map( 5780655b1a0SXuan Hu IMM_S.litValue -> "S", 5790655b1a0SXuan Hu IMM_SB.litValue -> "SB", 5800655b1a0SXuan Hu IMM_U.litValue -> "U", 5810655b1a0SXuan Hu IMM_UJ.litValue -> "UJ", 5820655b1a0SXuan Hu IMM_I.litValue -> "I", 5830655b1a0SXuan Hu IMM_Z.litValue -> "Z", 5840655b1a0SXuan Hu IMM_B6.litValue -> "B6", 5850655b1a0SXuan Hu IMM_OPIVIS.litValue -> "VIS", 5860655b1a0SXuan Hu IMM_OPIVIU.litValue -> "VIU", 5870655b1a0SXuan Hu IMM_VSETVLI.litValue -> "VSETVLI", 5880655b1a0SXuan Hu IMM_VSETIVLI.litValue -> "VSETIVLI", 589fe528fd6Ssinsanction IMM_LUI32.litValue -> "LUI32", 5900655b1a0SXuan Hu INVALID_INSTR.litValue -> "INVALID", 5910655b1a0SXuan Hu ) 5920655b1a0SXuan Hu strMap(immType.litValue) 5930655b1a0SXuan Hu } 5942225d46eSJiawei Lin } 5952225d46eSJiawei Lin 596e2695e90SzhanglyGit object UopSplitType { 597d91483a6Sfdy def SCA_SIM = "b000000".U // 598d91483a6Sfdy def DIR = "b010001".U // dirty: vset 599d91483a6Sfdy def VEC_VVV = "b010010".U // VEC_VVV 600d91483a6Sfdy def VEC_VXV = "b010011".U // VEC_VXV 601*fc85f18fSZiyue Zhang def VEC_VIV = "b000011".U // VEC_VXV 602d91483a6Sfdy def VEC_0XV = "b010100".U // VEC_0XV 603d91483a6Sfdy def VEC_VVW = "b010101".U // VEC_VVW 604d91483a6Sfdy def VEC_WVW = "b010110".U // VEC_WVW 605d91483a6Sfdy def VEC_VXW = "b010111".U // VEC_VXW 606d91483a6Sfdy def VEC_WXW = "b011000".U // VEC_WXW 607d91483a6Sfdy def VEC_WVV = "b011001".U // VEC_WVV 608d91483a6Sfdy def VEC_WXV = "b011010".U // VEC_WXV 609d91483a6Sfdy def VEC_EXT2 = "b011011".U // VF2 0 -> V 610d91483a6Sfdy def VEC_EXT4 = "b011100".U // VF4 0 -> V 611d91483a6Sfdy def VEC_EXT8 = "b011101".U // VF8 0 -> V 612d91483a6Sfdy def VEC_VVM = "b011110".U // VEC_VVM 613d91483a6Sfdy def VEC_VXM = "b011111".U // VEC_VXM 614d91483a6Sfdy def VEC_SLIDE1UP = "b100000".U // vslide1up.vx 615d91483a6Sfdy def VEC_FSLIDE1UP = "b100001".U // vfslide1up.vf 616d91483a6Sfdy def VEC_SLIDE1DOWN = "b100010".U // vslide1down.vx 617d91483a6Sfdy def VEC_FSLIDE1DOWN = "b100011".U // vfslide1down.vf 618d91483a6Sfdy def VEC_VRED = "b100100".U // VEC_VRED 619d91483a6Sfdy def VEC_SLIDEUP = "b100101".U // VEC_SLIDEUP 620d91483a6Sfdy def VEC_ISLIDEUP = "b100110".U // VEC_ISLIDEUP 621d91483a6Sfdy def VEC_SLIDEDOWN = "b100111".U // VEC_SLIDEDOWN 622d91483a6Sfdy def VEC_ISLIDEDOWN = "b101000".U // VEC_ISLIDEDOWN 623d91483a6Sfdy def VEC_M0X = "b101001".U // VEC_M0X 0MV 624d91483a6Sfdy def VEC_MVV = "b101010".U // VEC_MVV VMV 625d91483a6Sfdy def VEC_M0X_VFIRST = "b101011".U // 62684260280Sczw def VEC_VWW = "b101100".U // 62765df1368Sczw def VEC_RGATHER = "b101101".U // vrgather.vv, vrgather.vi 62865df1368Sczw def VEC_RGATHER_VX = "b101110".U // vrgather.vx 62965df1368Sczw def VEC_RGATHEREI16 = "b101111".U // vrgatherei16.vv 630adf68ff3Sczw def VEC_COMPRESS = "b110000".U // vcompress.vm 6314ee69032SzhanglyGit def VEC_US_LD = "b110001".U // vector unit strided load 632684d7aceSxiaofeibao-xjtu def VEC_VFV = "b111000".U // VEC_VFV 6333748ec56Sxiaofeibao-xjtu def VEC_VFW = "b111001".U // VEC_VFW 6343748ec56Sxiaofeibao-xjtu def VEC_WFW = "b111010".U // VEC_WVW 635f06d6d60Sxiaofeibao-xjtu def VEC_VFM = "b111011".U // VEC_VFM 636582849ffSxiaofeibao-xjtu def VEC_VFRED = "b111100".U // VEC_VFRED 637b94b1889Sxiaofeibao-xjtu def VEC_VFREDOSUM = "b111101".U // VEC_VFREDOSUM 638d91483a6Sfdy def VEC_M0M = "b000000".U // VEC_M0M 639d91483a6Sfdy def VEC_MMM = "b000000".U // VEC_MMM 640d91483a6Sfdy def dummy = "b111111".U 641d91483a6Sfdy 642d91483a6Sfdy def X = BitPat("b000000") 643d91483a6Sfdy 644d91483a6Sfdy def apply() = UInt(6.W) 645e2695e90SzhanglyGit def needSplit(UopSplitType: UInt) = UopSplitType(4) || UopSplitType(5) 646d91483a6Sfdy } 647d91483a6Sfdy 6486ab6918fSYinan Xu object ExceptionNO { 6496ab6918fSYinan Xu def instrAddrMisaligned = 0 6506ab6918fSYinan Xu def instrAccessFault = 1 6516ab6918fSYinan Xu def illegalInstr = 2 6526ab6918fSYinan Xu def breakPoint = 3 6536ab6918fSYinan Xu def loadAddrMisaligned = 4 6546ab6918fSYinan Xu def loadAccessFault = 5 6556ab6918fSYinan Xu def storeAddrMisaligned = 6 6566ab6918fSYinan Xu def storeAccessFault = 7 6576ab6918fSYinan Xu def ecallU = 8 6586ab6918fSYinan Xu def ecallS = 9 6596ab6918fSYinan Xu def ecallM = 11 6606ab6918fSYinan Xu def instrPageFault = 12 6616ab6918fSYinan Xu def loadPageFault = 13 6626ab6918fSYinan Xu // def singleStep = 14 6636ab6918fSYinan Xu def storePageFault = 15 6646ab6918fSYinan Xu def priorities = Seq( 6656ab6918fSYinan Xu breakPoint, // TODO: different BP has different priority 6666ab6918fSYinan Xu instrPageFault, 6676ab6918fSYinan Xu instrAccessFault, 6686ab6918fSYinan Xu illegalInstr, 6696ab6918fSYinan Xu instrAddrMisaligned, 6706ab6918fSYinan Xu ecallM, ecallS, ecallU, 671d880177dSYinan Xu storeAddrMisaligned, 672d880177dSYinan Xu loadAddrMisaligned, 6736ab6918fSYinan Xu storePageFault, 6746ab6918fSYinan Xu loadPageFault, 6756ab6918fSYinan Xu storeAccessFault, 676d880177dSYinan Xu loadAccessFault 6776ab6918fSYinan Xu ) 6786ab6918fSYinan Xu def all = priorities.distinct.sorted 6796ab6918fSYinan Xu def frontendSet = Seq( 6806ab6918fSYinan Xu instrAddrMisaligned, 6816ab6918fSYinan Xu instrAccessFault, 6826ab6918fSYinan Xu illegalInstr, 6836ab6918fSYinan Xu instrPageFault 6846ab6918fSYinan Xu ) 6856ab6918fSYinan Xu def partialSelect(vec: Vec[Bool], select: Seq[Int]): Vec[Bool] = { 6866ab6918fSYinan Xu val new_vec = Wire(ExceptionVec()) 6876ab6918fSYinan Xu new_vec.foreach(_ := false.B) 6886ab6918fSYinan Xu select.foreach(i => new_vec(i) := vec(i)) 6896ab6918fSYinan Xu new_vec 6906ab6918fSYinan Xu } 6916ab6918fSYinan Xu def selectFrontend(vec: Vec[Bool]): Vec[Bool] = partialSelect(vec, frontendSet) 6926ab6918fSYinan Xu def selectAll(vec: Vec[Bool]): Vec[Bool] = partialSelect(vec, ExceptionNO.all) 6936ab6918fSYinan Xu def selectByFu(vec:Vec[Bool], fuConfig: FuConfig): Vec[Bool] = 6946ab6918fSYinan Xu partialSelect(vec, fuConfig.exceptionOut) 6956ab6918fSYinan Xu } 6966ab6918fSYinan Xu 697d2b20d1aSTang Haojin object TopDownCounters extends Enumeration { 698d2b20d1aSTang Haojin val NoStall = Value("NoStall") // Base 699d2b20d1aSTang Haojin // frontend 700d2b20d1aSTang Haojin val OverrideBubble = Value("OverrideBubble") 701d2b20d1aSTang Haojin val FtqUpdateBubble = Value("FtqUpdateBubble") 702d2b20d1aSTang Haojin // val ControlRedirectBubble = Value("ControlRedirectBubble") 703d2b20d1aSTang Haojin val TAGEMissBubble = Value("TAGEMissBubble") 704d2b20d1aSTang Haojin val SCMissBubble = Value("SCMissBubble") 705d2b20d1aSTang Haojin val ITTAGEMissBubble = Value("ITTAGEMissBubble") 706d2b20d1aSTang Haojin val RASMissBubble = Value("RASMissBubble") 707d2b20d1aSTang Haojin val MemVioRedirectBubble = Value("MemVioRedirectBubble") 708d2b20d1aSTang Haojin val OtherRedirectBubble = Value("OtherRedirectBubble") 709d2b20d1aSTang Haojin val FtqFullStall = Value("FtqFullStall") 710d2b20d1aSTang Haojin 711d2b20d1aSTang Haojin val ICacheMissBubble = Value("ICacheMissBubble") 712d2b20d1aSTang Haojin val ITLBMissBubble = Value("ITLBMissBubble") 713d2b20d1aSTang Haojin val BTBMissBubble = Value("BTBMissBubble") 714d2b20d1aSTang Haojin val FetchFragBubble = Value("FetchFragBubble") 715d2b20d1aSTang Haojin 716d2b20d1aSTang Haojin // backend 717d2b20d1aSTang Haojin // long inst stall at rob head 718d2b20d1aSTang Haojin val DivStall = Value("DivStall") // int div, float div/sqrt 719d2b20d1aSTang Haojin val IntNotReadyStall = Value("IntNotReadyStall") // int-inst at rob head not issue 720d2b20d1aSTang Haojin val FPNotReadyStall = Value("FPNotReadyStall") // fp-inst at rob head not issue 721d2b20d1aSTang Haojin val MemNotReadyStall = Value("MemNotReadyStall") // mem-inst at rob head not issue 722d2b20d1aSTang Haojin // freelist full 723d2b20d1aSTang Haojin val IntFlStall = Value("IntFlStall") 724d2b20d1aSTang Haojin val FpFlStall = Value("FpFlStall") 725d2b20d1aSTang Haojin // dispatch queue full 726d2b20d1aSTang Haojin val IntDqStall = Value("IntDqStall") 727d2b20d1aSTang Haojin val FpDqStall = Value("FpDqStall") 728d2b20d1aSTang Haojin val LsDqStall = Value("LsDqStall") 729d2b20d1aSTang Haojin 730d2b20d1aSTang Haojin // memblock 731d2b20d1aSTang Haojin val LoadTLBStall = Value("LoadTLBStall") 732d2b20d1aSTang Haojin val LoadL1Stall = Value("LoadL1Stall") 733d2b20d1aSTang Haojin val LoadL2Stall = Value("LoadL2Stall") 734d2b20d1aSTang Haojin val LoadL3Stall = Value("LoadL3Stall") 735d2b20d1aSTang Haojin val LoadMemStall = Value("LoadMemStall") 736d2b20d1aSTang Haojin val StoreStall = Value("StoreStall") // include store tlb miss 737d2b20d1aSTang Haojin val AtomicStall = Value("AtomicStall") // atomic, load reserved, store conditional 738d2b20d1aSTang Haojin 739d2b20d1aSTang Haojin // xs replay (different to gem5) 740d2b20d1aSTang Haojin val LoadVioReplayStall = Value("LoadVioReplayStall") 741d2b20d1aSTang Haojin val LoadMSHRReplayStall = Value("LoadMSHRReplayStall") 742d2b20d1aSTang Haojin 743d2b20d1aSTang Haojin // bad speculation 744d2b20d1aSTang Haojin val ControlRecoveryStall = Value("ControlRecoveryStall") 745d2b20d1aSTang Haojin val MemVioRecoveryStall = Value("MemVioRecoveryStall") 746d2b20d1aSTang Haojin val OtherRecoveryStall = Value("OtherRecoveryStall") 747d2b20d1aSTang Haojin 748d2b20d1aSTang Haojin val FlushedInsts = Value("FlushedInsts") // control flushed, memvio flushed, others 749d2b20d1aSTang Haojin 750d2b20d1aSTang Haojin val OtherCoreStall = Value("OtherCoreStall") 751d2b20d1aSTang Haojin 752d2b20d1aSTang Haojin val NumStallReasons = Value("NumStallReasons") 753d2b20d1aSTang Haojin } 7549a2e6b8aSLinJiawei} 755