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]) 19154711376Ssinsanction def lui32addw = "b001_0011".U // lui32addw: SEXT(SEXT(src2[11:0], 32) + {src2[31:12], 12'b0}, 64) 192ee8ff153Szfw 193675acc68SYinan Xu def addwbit = "b001_0100".U // addwbit: (src1 + src2)[0] 194675acc68SYinan Xu def addwbyte = "b001_0101".U // addwbyte: (src1 + src2)[7:0] 195675acc68SYinan Xu def addwzexth = "b001_0110".U // addwzexth: ZEXT((src1 + src2)[15:0]) 196675acc68SYinan Xu def addwsexth = "b001_0111".U // addwsexth: SEXT((src1 + src2)[15:0]) 197ee8ff153Szfw 198675acc68SYinan Xu def sllw = "b001_1000".U // sllw: SEXT((src1 << src2)[31:0]) 199675acc68SYinan Xu def srlw = "b001_1001".U // srlw: SEXT((src1[31:0] >> src2)[31:0]) 200675acc68SYinan Xu def sraw = "b001_1010".U // sraw: SEXT((src1[31:0] >> src2)[31:0]) 201675acc68SYinan Xu def rolw = "b001_1100".U 202675acc68SYinan Xu def rorw = "b001_1101".U 203675acc68SYinan Xu 204675acc68SYinan Xu // ADD-op 205675acc68SYinan Xu def adduw = "b010_0000".U // adduw: src1[31:0] + src2 206675acc68SYinan Xu def add = "b010_0001".U // add: src1 + src2 207675acc68SYinan Xu def oddadd = "b010_0010".U // oddadd: src1[0] + src2 208fe528fd6Ssinsanction def lui32add = "b010_0011".U // lui32add: SEXT(src2[11:0]) + {src2[63:12], 12'b0} 209675acc68SYinan Xu 210675acc68SYinan Xu def sr29add = "b010_0100".U // sr29add: src1[63:29] + src2 211675acc68SYinan Xu def sr30add = "b010_0101".U // sr30add: src1[63:30] + src2 212675acc68SYinan Xu def sr31add = "b010_0110".U // sr31add: src1[63:31] + src2 213675acc68SYinan Xu def sr32add = "b010_0111".U // sr32add: src1[63:32] + src2 214675acc68SYinan Xu 215675acc68SYinan Xu def sh1adduw = "b010_1000".U // sh1adduw: {src1[31:0], 1'b0} + src2 216675acc68SYinan Xu def sh1add = "b010_1001".U // sh1add: {src1[62:0], 1'b0} + src2 217675acc68SYinan Xu def sh2adduw = "b010_1010".U // sh2add_uw: {src1[31:0], 2'b0} + src2 218675acc68SYinan Xu def sh2add = "b010_1011".U // sh2add: {src1[61:0], 2'b0} + src2 219675acc68SYinan Xu def sh3adduw = "b010_1100".U // sh3add_uw: {src1[31:0], 3'b0} + src2 220675acc68SYinan Xu def sh3add = "b010_1101".U // sh3add: {src1[60:0], 3'b0} + src2 221675acc68SYinan Xu def sh4add = "b010_1111".U // sh4add: {src1[59:0], 4'b0} + src2 222675acc68SYinan Xu 223675acc68SYinan Xu // SUB-op: src1 - src2 224675acc68SYinan Xu def sub = "b011_0000".U 225675acc68SYinan Xu def sltu = "b011_0001".U 226675acc68SYinan Xu def slt = "b011_0010".U 227675acc68SYinan Xu def maxu = "b011_0100".U 228675acc68SYinan Xu def minu = "b011_0101".U 229675acc68SYinan Xu def max = "b011_0110".U 230675acc68SYinan Xu def min = "b011_0111".U 231675acc68SYinan Xu 232675acc68SYinan Xu // branch 233675acc68SYinan Xu def beq = "b111_0000".U 234675acc68SYinan Xu def bne = "b111_0010".U 235675acc68SYinan Xu def blt = "b111_1000".U 236675acc68SYinan Xu def bge = "b111_1010".U 237675acc68SYinan Xu def bltu = "b111_1100".U 238675acc68SYinan Xu def bgeu = "b111_1110".U 239675acc68SYinan Xu 240675acc68SYinan Xu // misc optype 241675acc68SYinan Xu def and = "b100_0000".U 242675acc68SYinan Xu def andn = "b100_0001".U 243675acc68SYinan Xu def or = "b100_0010".U 244675acc68SYinan Xu def orn = "b100_0011".U 245675acc68SYinan Xu def xor = "b100_0100".U 246675acc68SYinan Xu def xnor = "b100_0101".U 247675acc68SYinan Xu def orcb = "b100_0110".U 248675acc68SYinan Xu 249675acc68SYinan Xu def sextb = "b100_1000".U 250675acc68SYinan Xu def packh = "b100_1001".U 251675acc68SYinan Xu def sexth = "b100_1010".U 252675acc68SYinan Xu def packw = "b100_1011".U 253675acc68SYinan Xu 254675acc68SYinan Xu def revb = "b101_0000".U 255675acc68SYinan Xu def rev8 = "b101_0001".U 256675acc68SYinan Xu def pack = "b101_0010".U 257675acc68SYinan Xu def orh48 = "b101_0011".U 258675acc68SYinan Xu 259675acc68SYinan Xu def szewl1 = "b101_1000".U 260675acc68SYinan Xu def szewl2 = "b101_1001".U 261675acc68SYinan Xu def szewl3 = "b101_1010".U 262675acc68SYinan Xu def byte2 = "b101_1011".U 263675acc68SYinan Xu 264675acc68SYinan Xu def andlsb = "b110_0000".U 265675acc68SYinan Xu def andzexth = "b110_0001".U 266675acc68SYinan Xu def orlsb = "b110_0010".U 267675acc68SYinan Xu def orzexth = "b110_0011".U 268675acc68SYinan Xu def xorlsb = "b110_0100".U 269675acc68SYinan Xu def xorzexth = "b110_0101".U 270675acc68SYinan Xu def orcblsb = "b110_0110".U 271675acc68SYinan Xu def orcbzexth = "b110_0111".U 272675acc68SYinan Xu 273675acc68SYinan Xu def isAddw(func: UInt) = func(6, 4) === "b001".U && !func(3) && !func(1) 274675acc68SYinan Xu def isSimpleLogic(func: UInt) = func(6, 4) === "b100".U && !func(0) 275675acc68SYinan Xu def logicToLsb(func: UInt) = Cat("b110".U(3.W), func(3, 1), 0.U(1.W)) 276675acc68SYinan Xu def logicToZexth(func: UInt) = Cat("b110".U(3.W), func(3, 1), 1.U(1.W)) 277675acc68SYinan Xu 27857a10886SXuan Hu def apply() = UInt(FuOpTypeWidth.W) 2792225d46eSJiawei Lin } 2802225d46eSJiawei Lin 281d91483a6Sfdy object VSETOpType { 282a8db15d8Sfdy val setVlmaxBit = 0 283a8db15d8Sfdy val keepVlBit = 1 284a8db15d8Sfdy // destTypeBit == 0: write vl to rd 285a8db15d8Sfdy // destTypeBit == 1: write vconfig 286a8db15d8Sfdy val destTypeBit = 5 287a8db15d8Sfdy 288a32c56f4SXuan Hu // vsetvli's uop 289a32c56f4SXuan Hu // rs1!=x0, normal 290a32c56f4SXuan Hu // uop0: r(rs1), w(vconfig) | x[rs1],vtypei -> vconfig 291a32c56f4SXuan Hu // uop1: r(rs1), w(rd) | x[rs1],vtypei -> x[rd] 292a32c56f4SXuan Hu def uvsetvcfg_xi = "b1010_0000".U 293a32c56f4SXuan Hu def uvsetrd_xi = "b1000_0000".U 294a32c56f4SXuan Hu // rs1==x0, rd!=x0, set vl to vlmax, set rd to vlmax, set vtype 295a32c56f4SXuan Hu // uop0: w(vconfig) | vlmax, vtypei -> vconfig 296a32c56f4SXuan Hu // uop1: w(rd) | vlmax, vtypei -> x[rd] 297a32c56f4SXuan Hu def uvsetvcfg_vlmax_i = "b1010_0001".U 298a32c56f4SXuan Hu def uvsetrd_vlmax_i = "b1000_0001".U 299a32c56f4SXuan Hu // rs1==x0, rd==x0, keep vl, set vtype 300a32c56f4SXuan Hu // uop0: r(vconfig), w(vconfig) | ld_vconfig.vl, vtypei -> vconfig 301a32c56f4SXuan Hu def uvsetvcfg_keep_v = "b1010_0010".U 302d91483a6Sfdy 303a32c56f4SXuan Hu // vsetvl's uop 304a32c56f4SXuan Hu // rs1!=x0, normal 305a32c56f4SXuan Hu // uop0: r(rs1,rs2), w(vconfig) | x[rs1],x[rs2] -> vconfig 306a32c56f4SXuan Hu // uop1: r(rs1,rs2), w(rd) | x[rs1],x[rs2] -> x[rd] 307a32c56f4SXuan Hu def uvsetvcfg_xx = "b0110_0000".U 308a32c56f4SXuan Hu def uvsetrd_xx = "b0100_0000".U 309a32c56f4SXuan Hu // rs1==x0, rd!=x0, set vl to vlmax, set rd to vlmax, set vtype 310a32c56f4SXuan Hu // uop0: r(rs2), w(vconfig) | vlmax, vtypei -> vconfig 311a32c56f4SXuan Hu // uop1: r(rs2), w(rd) | vlmax, vtypei -> x[rd] 312a32c56f4SXuan Hu def uvsetvcfg_vlmax_x = "b0110_0001".U 313a32c56f4SXuan Hu def uvsetrd_vlmax_x = "b0100_0001".U 314a32c56f4SXuan Hu // rs1==x0, rd==x0, keep vl, set vtype 315a32c56f4SXuan Hu // uop0: r(rs2), w(vtmp) | x[rs2] -> vtmp 316a32c56f4SXuan Hu // uop0: r(vconfig,vtmp), w(vconfig) | old_vconfig.vl, vtmp -> vconfig 317a32c56f4SXuan Hu def uvmv_v_x = "b0110_0010".U 318a32c56f4SXuan Hu def uvsetvcfg_vv = "b0111_0010".U 319a32c56f4SXuan Hu 320a32c56f4SXuan Hu // vsetivli's uop 321a32c56f4SXuan Hu // uop0: w(vconfig) | vli, vtypei -> vconfig 322a32c56f4SXuan Hu // uop1: w(rd) | vli, vtypei -> x[rd] 323a32c56f4SXuan Hu def uvsetvcfg_ii = "b0010_0000".U 324a32c56f4SXuan Hu def uvsetrd_ii = "b0000_0000".U 325a32c56f4SXuan Hu 326a32c56f4SXuan Hu def isVsetvl (func: UInt) = func(6) 327a32c56f4SXuan Hu def isVsetvli (func: UInt) = func(7) 328a32c56f4SXuan Hu def isVsetivli(func: UInt) = func(7, 6) === 0.U 329a32c56f4SXuan Hu def isNormal (func: UInt) = func(1, 0) === 0.U 330a8db15d8Sfdy def isSetVlmax(func: UInt) = func(setVlmaxBit) 331a8db15d8Sfdy def isKeepVl (func: UInt) = func(keepVlBit) 332a32c56f4SXuan Hu // RG: region 333a32c56f4SXuan Hu def writeIntRG(func: UInt) = !func(5) 334a32c56f4SXuan Hu def writeVecRG(func: UInt) = func(5) 335a32c56f4SXuan Hu def readIntRG (func: UInt) = !func(4) 336a32c56f4SXuan Hu def readVecRG (func: UInt) = func(4) 337a8db15d8Sfdy // modify fuOpType 338a8db15d8Sfdy def switchDest(func: UInt) = func ^ (1 << destTypeBit).U 339a8db15d8Sfdy def keepVl(func: UInt) = func | (1 << keepVlBit).U 340a8db15d8Sfdy def setVlmax(func: UInt) = func | (1 << setVlmaxBit).U 341d91483a6Sfdy } 342d91483a6Sfdy 3433b739f49SXuan Hu object BRUOpType { 3443b739f49SXuan Hu // branch 3453b739f49SXuan Hu def beq = "b000_000".U 3463b739f49SXuan Hu def bne = "b000_001".U 3473b739f49SXuan Hu def blt = "b000_100".U 3483b739f49SXuan Hu def bge = "b000_101".U 3493b739f49SXuan Hu def bltu = "b001_000".U 3503b739f49SXuan Hu def bgeu = "b001_001".U 3513b739f49SXuan Hu 3523b739f49SXuan Hu def getBranchType(func: UInt) = func(3, 1) 3533b739f49SXuan Hu def isBranchInvert(func: UInt) = func(0) 3543b739f49SXuan Hu } 3553b739f49SXuan Hu 3563b739f49SXuan Hu object MULOpType { 3573b739f49SXuan Hu // mul 3583b739f49SXuan Hu // bit encoding: | type (2bit) | isWord(1bit) | opcode(2bit) | 3593b739f49SXuan Hu def mul = "b00000".U 3603b739f49SXuan Hu def mulh = "b00001".U 3613b739f49SXuan Hu def mulhsu = "b00010".U 3623b739f49SXuan Hu def mulhu = "b00011".U 3633b739f49SXuan Hu def mulw = "b00100".U 3643b739f49SXuan Hu 3653b739f49SXuan Hu def mulw7 = "b01100".U 3663b739f49SXuan Hu def isSign(op: UInt) = !op(1) 3673b739f49SXuan Hu def isW(op: UInt) = op(2) 3683b739f49SXuan Hu def isH(op: UInt) = op(1, 0) =/= 0.U 3693b739f49SXuan Hu def getOp(op: UInt) = Cat(op(3), op(1, 0)) 3703b739f49SXuan Hu } 3713b739f49SXuan Hu 3723b739f49SXuan Hu object DIVOpType { 3733b739f49SXuan Hu // div 3743b739f49SXuan Hu // bit encoding: | type (2bit) | isWord(1bit) | isSign(1bit) | opcode(1bit) | 3753b739f49SXuan Hu def div = "b10000".U 3763b739f49SXuan Hu def divu = "b10010".U 3773b739f49SXuan Hu def rem = "b10001".U 3783b739f49SXuan Hu def remu = "b10011".U 3793b739f49SXuan Hu 3803b739f49SXuan Hu def divw = "b10100".U 3813b739f49SXuan Hu def divuw = "b10110".U 3823b739f49SXuan Hu def remw = "b10101".U 3833b739f49SXuan Hu def remuw = "b10111".U 3843b739f49SXuan Hu 3853b739f49SXuan Hu def isSign(op: UInt) = !op(1) 3863b739f49SXuan Hu def isW(op: UInt) = op(2) 3873b739f49SXuan Hu def isH(op: UInt) = op(0) 3883b739f49SXuan Hu } 3893b739f49SXuan Hu 3902225d46eSJiawei Lin object MDUOpType { 3912225d46eSJiawei Lin // mul 3922225d46eSJiawei Lin // bit encoding: | type (2bit) | isWord(1bit) | opcode(2bit) | 3932225d46eSJiawei Lin def mul = "b00000".U 3942225d46eSJiawei Lin def mulh = "b00001".U 3952225d46eSJiawei Lin def mulhsu = "b00010".U 3962225d46eSJiawei Lin def mulhu = "b00011".U 3972225d46eSJiawei Lin def mulw = "b00100".U 3982225d46eSJiawei Lin 39988825c5cSYinan Xu def mulw7 = "b01100".U 40088825c5cSYinan Xu 4012225d46eSJiawei Lin // div 4022225d46eSJiawei Lin // bit encoding: | type (2bit) | isWord(1bit) | isSign(1bit) | opcode(1bit) | 40388825c5cSYinan Xu def div = "b10000".U 40488825c5cSYinan Xu def divu = "b10010".U 40588825c5cSYinan Xu def rem = "b10001".U 40688825c5cSYinan Xu def remu = "b10011".U 4072225d46eSJiawei Lin 40888825c5cSYinan Xu def divw = "b10100".U 40988825c5cSYinan Xu def divuw = "b10110".U 41088825c5cSYinan Xu def remw = "b10101".U 41188825c5cSYinan Xu def remuw = "b10111".U 4122225d46eSJiawei Lin 41388825c5cSYinan Xu def isMul(op: UInt) = !op(4) 41488825c5cSYinan Xu def isDiv(op: UInt) = op(4) 4152225d46eSJiawei Lin 4162225d46eSJiawei Lin def isDivSign(op: UInt) = isDiv(op) && !op(1) 4172225d46eSJiawei Lin def isW(op: UInt) = op(2) 4182225d46eSJiawei Lin def isH(op: UInt) = (isDiv(op) && op(0)) || (isMul(op) && op(1, 0) =/= 0.U) 4192225d46eSJiawei Lin def getMulOp(op: UInt) = op(1, 0) 4202225d46eSJiawei Lin } 4212225d46eSJiawei Lin 4222225d46eSJiawei Lin object LSUOpType { 423d200f594SWilliam Wang // load pipeline 4242225d46eSJiawei Lin 425d200f594SWilliam Wang // normal load 426d200f594SWilliam Wang // Note: bit(1, 0) are size, DO NOT CHANGE 427d200f594SWilliam Wang // bit encoding: | load 0 | is unsigned(1bit) | size(2bit) | 428d200f594SWilliam Wang def lb = "b0000".U 429d200f594SWilliam Wang def lh = "b0001".U 430d200f594SWilliam Wang def lw = "b0010".U 431d200f594SWilliam Wang def ld = "b0011".U 432d200f594SWilliam Wang def lbu = "b0100".U 433d200f594SWilliam Wang def lhu = "b0101".U 434d200f594SWilliam Wang def lwu = "b0110".U 435ca18a0b4SWilliam Wang 436d200f594SWilliam Wang // Zicbop software prefetch 437d200f594SWilliam Wang // bit encoding: | prefetch 1 | 0 | prefetch type (2bit) | 438d200f594SWilliam Wang def prefetch_i = "b1000".U // TODO 439d200f594SWilliam Wang def prefetch_r = "b1001".U 440d200f594SWilliam Wang def prefetch_w = "b1010".U 441ca18a0b4SWilliam Wang 442d200f594SWilliam Wang def isPrefetch(op: UInt): Bool = op(3) 443d200f594SWilliam Wang 444d200f594SWilliam Wang // store pipeline 445d200f594SWilliam Wang // normal store 446d200f594SWilliam Wang // bit encoding: | store 00 | size(2bit) | 447d200f594SWilliam Wang def sb = "b0000".U 448d200f594SWilliam Wang def sh = "b0001".U 449d200f594SWilliam Wang def sw = "b0010".U 450d200f594SWilliam Wang def sd = "b0011".U 451d200f594SWilliam Wang 452d200f594SWilliam Wang // l1 cache op 453d200f594SWilliam Wang // bit encoding: | cbo_zero 01 | size(2bit) 11 | 454d200f594SWilliam Wang def cbo_zero = "b0111".U 455d200f594SWilliam Wang 456d200f594SWilliam Wang // llc op 457d200f594SWilliam Wang // bit encoding: | prefetch 11 | suboptype(2bit) | 458d200f594SWilliam Wang def cbo_clean = "b1100".U 459d200f594SWilliam Wang def cbo_flush = "b1101".U 460d200f594SWilliam Wang def cbo_inval = "b1110".U 461d200f594SWilliam Wang 462d200f594SWilliam Wang def isCbo(op: UInt): Bool = op(3, 2) === "b11".U 4632225d46eSJiawei Lin 4642225d46eSJiawei Lin // atomics 4652225d46eSJiawei Lin // bit(1, 0) are size 4662225d46eSJiawei Lin // since atomics use a different fu type 4672225d46eSJiawei Lin // so we can safely reuse other load/store's encodings 468d200f594SWilliam Wang // bit encoding: | optype(4bit) | size (2bit) | 4692225d46eSJiawei Lin def lr_w = "b000010".U 4702225d46eSJiawei Lin def sc_w = "b000110".U 4712225d46eSJiawei Lin def amoswap_w = "b001010".U 4722225d46eSJiawei Lin def amoadd_w = "b001110".U 4732225d46eSJiawei Lin def amoxor_w = "b010010".U 4742225d46eSJiawei Lin def amoand_w = "b010110".U 4752225d46eSJiawei Lin def amoor_w = "b011010".U 4762225d46eSJiawei Lin def amomin_w = "b011110".U 4772225d46eSJiawei Lin def amomax_w = "b100010".U 4782225d46eSJiawei Lin def amominu_w = "b100110".U 4792225d46eSJiawei Lin def amomaxu_w = "b101010".U 4802225d46eSJiawei Lin 4812225d46eSJiawei Lin def lr_d = "b000011".U 4822225d46eSJiawei Lin def sc_d = "b000111".U 4832225d46eSJiawei Lin def amoswap_d = "b001011".U 4842225d46eSJiawei Lin def amoadd_d = "b001111".U 4852225d46eSJiawei Lin def amoxor_d = "b010011".U 4862225d46eSJiawei Lin def amoand_d = "b010111".U 4872225d46eSJiawei Lin def amoor_d = "b011011".U 4882225d46eSJiawei Lin def amomin_d = "b011111".U 4892225d46eSJiawei Lin def amomax_d = "b100011".U 4902225d46eSJiawei Lin def amominu_d = "b100111".U 4912225d46eSJiawei Lin def amomaxu_d = "b101011".U 492b6982e83SLemover 493b6982e83SLemover def size(op: UInt) = op(1,0) 4942225d46eSJiawei Lin } 4952225d46eSJiawei Lin 4963feeca58Szfw object BKUOpType { 497ee8ff153Szfw 4983feeca58Szfw def clmul = "b000000".U 4993feeca58Szfw def clmulh = "b000001".U 5003feeca58Szfw def clmulr = "b000010".U 5013feeca58Szfw def xpermn = "b000100".U 5023feeca58Szfw def xpermb = "b000101".U 503ee8ff153Szfw 5043feeca58Szfw def clz = "b001000".U 5053feeca58Szfw def clzw = "b001001".U 5063feeca58Szfw def ctz = "b001010".U 5073feeca58Szfw def ctzw = "b001011".U 5083feeca58Szfw def cpop = "b001100".U 5093feeca58Szfw def cpopw = "b001101".U 51007596dc6Szfw 5113feeca58Szfw // 01xxxx is reserve 5123feeca58Szfw def aes64es = "b100000".U 5133feeca58Szfw def aes64esm = "b100001".U 5143feeca58Szfw def aes64ds = "b100010".U 5153feeca58Szfw def aes64dsm = "b100011".U 5163feeca58Szfw def aes64im = "b100100".U 5173feeca58Szfw def aes64ks1i = "b100101".U 5183feeca58Szfw def aes64ks2 = "b100110".U 5193feeca58Szfw 5203feeca58Szfw // merge to two instruction sm4ks & sm4ed 52119bcce38SFawang Zhang def sm4ed0 = "b101000".U 52219bcce38SFawang Zhang def sm4ed1 = "b101001".U 52319bcce38SFawang Zhang def sm4ed2 = "b101010".U 52419bcce38SFawang Zhang def sm4ed3 = "b101011".U 52519bcce38SFawang Zhang def sm4ks0 = "b101100".U 52619bcce38SFawang Zhang def sm4ks1 = "b101101".U 52719bcce38SFawang Zhang def sm4ks2 = "b101110".U 52819bcce38SFawang Zhang def sm4ks3 = "b101111".U 5293feeca58Szfw 5303feeca58Szfw def sha256sum0 = "b110000".U 5313feeca58Szfw def sha256sum1 = "b110001".U 5323feeca58Szfw def sha256sig0 = "b110010".U 5333feeca58Szfw def sha256sig1 = "b110011".U 5343feeca58Szfw def sha512sum0 = "b110100".U 5353feeca58Szfw def sha512sum1 = "b110101".U 5363feeca58Szfw def sha512sig0 = "b110110".U 5373feeca58Szfw def sha512sig1 = "b110111".U 5383feeca58Szfw 5393feeca58Szfw def sm3p0 = "b111000".U 5403feeca58Szfw def sm3p1 = "b111001".U 541ee8ff153Szfw } 542ee8ff153Szfw 5432225d46eSJiawei Lin object BTBtype { 5442225d46eSJiawei Lin def B = "b00".U // branch 5452225d46eSJiawei Lin def J = "b01".U // jump 5462225d46eSJiawei Lin def I = "b10".U // indirect 5472225d46eSJiawei Lin def R = "b11".U // return 5482225d46eSJiawei Lin 5492225d46eSJiawei Lin def apply() = UInt(2.W) 5502225d46eSJiawei Lin } 5512225d46eSJiawei Lin 5522225d46eSJiawei Lin object SelImm { 553ee8ff153Szfw def IMM_X = "b0111".U 554d91483a6Sfdy def IMM_S = "b1110".U 555ee8ff153Szfw def IMM_SB = "b0001".U 556ee8ff153Szfw def IMM_U = "b0010".U 557ee8ff153Szfw def IMM_UJ = "b0011".U 558ee8ff153Szfw def IMM_I = "b0100".U 559ee8ff153Szfw def IMM_Z = "b0101".U 560ee8ff153Szfw def INVALID_INSTR = "b0110".U 561ee8ff153Szfw def IMM_B6 = "b1000".U 5622225d46eSJiawei Lin 56358c35d23Shuxuan0307 def IMM_OPIVIS = "b1001".U 56458c35d23Shuxuan0307 def IMM_OPIVIU = "b1010".U 565912e2179SXuan Hu def IMM_VSETVLI = "b1100".U 566912e2179SXuan Hu def IMM_VSETIVLI = "b1101".U 567fe528fd6Ssinsanction def IMM_LUI32 = "b1011".U 56858c35d23Shuxuan0307 56957a10886SXuan Hu def X = BitPat("b0000") 5706e7c9679Shuxuan0307 571ee8ff153Szfw def apply() = UInt(4.W) 5720655b1a0SXuan Hu 5730655b1a0SXuan Hu def mkString(immType: UInt) : String = { 5740655b1a0SXuan Hu val strMap = Map( 5750655b1a0SXuan Hu IMM_S.litValue -> "S", 5760655b1a0SXuan Hu IMM_SB.litValue -> "SB", 5770655b1a0SXuan Hu IMM_U.litValue -> "U", 5780655b1a0SXuan Hu IMM_UJ.litValue -> "UJ", 5790655b1a0SXuan Hu IMM_I.litValue -> "I", 5800655b1a0SXuan Hu IMM_Z.litValue -> "Z", 5810655b1a0SXuan Hu IMM_B6.litValue -> "B6", 5820655b1a0SXuan Hu IMM_OPIVIS.litValue -> "VIS", 5830655b1a0SXuan Hu IMM_OPIVIU.litValue -> "VIU", 5840655b1a0SXuan Hu IMM_VSETVLI.litValue -> "VSETVLI", 5850655b1a0SXuan Hu IMM_VSETIVLI.litValue -> "VSETIVLI", 586fe528fd6Ssinsanction IMM_LUI32.litValue -> "LUI32", 5870655b1a0SXuan Hu INVALID_INSTR.litValue -> "INVALID", 5880655b1a0SXuan Hu ) 5890655b1a0SXuan Hu strMap(immType.litValue) 5900655b1a0SXuan Hu } 5912225d46eSJiawei Lin } 5922225d46eSJiawei Lin 593e2695e90SzhanglyGit object UopSplitType { 594d91483a6Sfdy def SCA_SIM = "b000000".U // 595d91483a6Sfdy def DIR = "b010001".U // dirty: vset 596d91483a6Sfdy def VEC_VVV = "b010010".U // VEC_VVV 597d91483a6Sfdy def VEC_VXV = "b010011".U // VEC_VXV 598d91483a6Sfdy def VEC_0XV = "b010100".U // VEC_0XV 599d91483a6Sfdy def VEC_VVW = "b010101".U // VEC_VVW 600d91483a6Sfdy def VEC_WVW = "b010110".U // VEC_WVW 601d91483a6Sfdy def VEC_VXW = "b010111".U // VEC_VXW 602d91483a6Sfdy def VEC_WXW = "b011000".U // VEC_WXW 603d91483a6Sfdy def VEC_WVV = "b011001".U // VEC_WVV 604d91483a6Sfdy def VEC_WXV = "b011010".U // VEC_WXV 605d91483a6Sfdy def VEC_EXT2 = "b011011".U // VF2 0 -> V 606d91483a6Sfdy def VEC_EXT4 = "b011100".U // VF4 0 -> V 607d91483a6Sfdy def VEC_EXT8 = "b011101".U // VF8 0 -> V 608d91483a6Sfdy def VEC_VVM = "b011110".U // VEC_VVM 609d91483a6Sfdy def VEC_VXM = "b011111".U // VEC_VXM 610d91483a6Sfdy def VEC_SLIDE1UP = "b100000".U // vslide1up.vx 611d91483a6Sfdy def VEC_FSLIDE1UP = "b100001".U // vfslide1up.vf 612d91483a6Sfdy def VEC_SLIDE1DOWN = "b100010".U // vslide1down.vx 613d91483a6Sfdy def VEC_FSLIDE1DOWN = "b100011".U // vfslide1down.vf 614d91483a6Sfdy def VEC_VRED = "b100100".U // VEC_VRED 615d91483a6Sfdy def VEC_SLIDEUP = "b100101".U // VEC_SLIDEUP 616d91483a6Sfdy def VEC_ISLIDEUP = "b100110".U // VEC_ISLIDEUP 617d91483a6Sfdy def VEC_SLIDEDOWN = "b100111".U // VEC_SLIDEDOWN 618d91483a6Sfdy def VEC_ISLIDEDOWN = "b101000".U // VEC_ISLIDEDOWN 619d91483a6Sfdy def VEC_M0X = "b101001".U // VEC_M0X 0MV 620d91483a6Sfdy def VEC_MVV = "b101010".U // VEC_MVV VMV 621d91483a6Sfdy def VEC_M0X_VFIRST = "b101011".U // 62284260280Sczw def VEC_VWW = "b101100".U // 62365df1368Sczw def VEC_RGATHER = "b101101".U // vrgather.vv, vrgather.vi 62465df1368Sczw def VEC_RGATHER_VX = "b101110".U // vrgather.vx 62565df1368Sczw def VEC_RGATHEREI16 = "b101111".U // vrgatherei16.vv 626adf68ff3Sczw def VEC_COMPRESS = "b110000".U // vcompress.vm 6274ee69032SzhanglyGit def VEC_US_LD = "b110001".U // vector unit strided load 628684d7aceSxiaofeibao-xjtu def VEC_VFV = "b111000".U // VEC_VFV 6293748ec56Sxiaofeibao-xjtu def VEC_VFW = "b111001".U // VEC_VFW 6303748ec56Sxiaofeibao-xjtu def VEC_WFW = "b111010".U // VEC_WVW 631f06d6d60Sxiaofeibao-xjtu def VEC_VFM = "b111011".U // VEC_VFM 632582849ffSxiaofeibao-xjtu def VEC_VFRED = "b111100".U // VEC_VFRED 633*b94b1889Sxiaofeibao-xjtu def VEC_VFREDOSUM = "b111101".U // VEC_VFREDOSUM 634d91483a6Sfdy def VEC_M0M = "b000000".U // VEC_M0M 635d91483a6Sfdy def VEC_MMM = "b000000".U // VEC_MMM 636d91483a6Sfdy def dummy = "b111111".U 637d91483a6Sfdy 638d91483a6Sfdy def X = BitPat("b000000") 639d91483a6Sfdy 640d91483a6Sfdy def apply() = UInt(6.W) 641e2695e90SzhanglyGit def needSplit(UopSplitType: UInt) = UopSplitType(4) || UopSplitType(5) 642d91483a6Sfdy } 643d91483a6Sfdy 6446ab6918fSYinan Xu object ExceptionNO { 6456ab6918fSYinan Xu def instrAddrMisaligned = 0 6466ab6918fSYinan Xu def instrAccessFault = 1 6476ab6918fSYinan Xu def illegalInstr = 2 6486ab6918fSYinan Xu def breakPoint = 3 6496ab6918fSYinan Xu def loadAddrMisaligned = 4 6506ab6918fSYinan Xu def loadAccessFault = 5 6516ab6918fSYinan Xu def storeAddrMisaligned = 6 6526ab6918fSYinan Xu def storeAccessFault = 7 6536ab6918fSYinan Xu def ecallU = 8 6546ab6918fSYinan Xu def ecallS = 9 6556ab6918fSYinan Xu def ecallM = 11 6566ab6918fSYinan Xu def instrPageFault = 12 6576ab6918fSYinan Xu def loadPageFault = 13 6586ab6918fSYinan Xu // def singleStep = 14 6596ab6918fSYinan Xu def storePageFault = 15 6606ab6918fSYinan Xu def priorities = Seq( 6616ab6918fSYinan Xu breakPoint, // TODO: different BP has different priority 6626ab6918fSYinan Xu instrPageFault, 6636ab6918fSYinan Xu instrAccessFault, 6646ab6918fSYinan Xu illegalInstr, 6656ab6918fSYinan Xu instrAddrMisaligned, 6666ab6918fSYinan Xu ecallM, ecallS, ecallU, 667d880177dSYinan Xu storeAddrMisaligned, 668d880177dSYinan Xu loadAddrMisaligned, 6696ab6918fSYinan Xu storePageFault, 6706ab6918fSYinan Xu loadPageFault, 6716ab6918fSYinan Xu storeAccessFault, 672d880177dSYinan Xu loadAccessFault 6736ab6918fSYinan Xu ) 6746ab6918fSYinan Xu def all = priorities.distinct.sorted 6756ab6918fSYinan Xu def frontendSet = Seq( 6766ab6918fSYinan Xu instrAddrMisaligned, 6776ab6918fSYinan Xu instrAccessFault, 6786ab6918fSYinan Xu illegalInstr, 6796ab6918fSYinan Xu instrPageFault 6806ab6918fSYinan Xu ) 6816ab6918fSYinan Xu def partialSelect(vec: Vec[Bool], select: Seq[Int]): Vec[Bool] = { 6826ab6918fSYinan Xu val new_vec = Wire(ExceptionVec()) 6836ab6918fSYinan Xu new_vec.foreach(_ := false.B) 6846ab6918fSYinan Xu select.foreach(i => new_vec(i) := vec(i)) 6856ab6918fSYinan Xu new_vec 6866ab6918fSYinan Xu } 6876ab6918fSYinan Xu def selectFrontend(vec: Vec[Bool]): Vec[Bool] = partialSelect(vec, frontendSet) 6886ab6918fSYinan Xu def selectAll(vec: Vec[Bool]): Vec[Bool] = partialSelect(vec, ExceptionNO.all) 6896ab6918fSYinan Xu def selectByFu(vec:Vec[Bool], fuConfig: FuConfig): Vec[Bool] = 6906ab6918fSYinan Xu partialSelect(vec, fuConfig.exceptionOut) 6916ab6918fSYinan Xu } 6926ab6918fSYinan Xu 693d2b20d1aSTang Haojin // indicates where the memory access request comes from 694d2b20d1aSTang Haojin // a dupliacte of this is in HuanCun.common and CoupledL2.common 695d2b20d1aSTang Haojin // TODO: consider moving it to Utility, so that they could share the same definition 696d2b20d1aSTang Haojin object MemReqSource extends Enumeration { 697d2b20d1aSTang Haojin val NoWhere = Value("NoWhere") 698d2b20d1aSTang Haojin 699d2b20d1aSTang Haojin val CPUInst = Value("CPUInst") 700d2b20d1aSTang Haojin val CPULoadData = Value("CPULoadData") 701d2b20d1aSTang Haojin val CPUStoreData = Value("CPUStoreData") 702d2b20d1aSTang Haojin val CPUAtomicData = Value("CPUAtomicData") 703d2b20d1aSTang Haojin val L1InstPrefetch = Value("L1InstPrefetch") 704d2b20d1aSTang Haojin val L1DataPrefetch = Value("L1DataPrefetch") 705d2b20d1aSTang Haojin val PTW = Value("PTW") 706d2b20d1aSTang Haojin val L2Prefetch = Value("L2Prefetch") 707d2b20d1aSTang Haojin val ReqSourceCount = Value("ReqSourceCount") 708d2b20d1aSTang Haojin 709d2b20d1aSTang Haojin val reqSourceBits = log2Ceil(ReqSourceCount.id) 710d2b20d1aSTang Haojin } 711d2b20d1aSTang Haojin 712d2b20d1aSTang Haojin object TopDownCounters extends Enumeration { 713d2b20d1aSTang Haojin val NoStall = Value("NoStall") // Base 714d2b20d1aSTang Haojin // frontend 715d2b20d1aSTang Haojin val OverrideBubble = Value("OverrideBubble") 716d2b20d1aSTang Haojin val FtqUpdateBubble = Value("FtqUpdateBubble") 717d2b20d1aSTang Haojin // val ControlRedirectBubble = Value("ControlRedirectBubble") 718d2b20d1aSTang Haojin val TAGEMissBubble = Value("TAGEMissBubble") 719d2b20d1aSTang Haojin val SCMissBubble = Value("SCMissBubble") 720d2b20d1aSTang Haojin val ITTAGEMissBubble = Value("ITTAGEMissBubble") 721d2b20d1aSTang Haojin val RASMissBubble = Value("RASMissBubble") 722d2b20d1aSTang Haojin val MemVioRedirectBubble = Value("MemVioRedirectBubble") 723d2b20d1aSTang Haojin val OtherRedirectBubble = Value("OtherRedirectBubble") 724d2b20d1aSTang Haojin val FtqFullStall = Value("FtqFullStall") 725d2b20d1aSTang Haojin 726d2b20d1aSTang Haojin val ICacheMissBubble = Value("ICacheMissBubble") 727d2b20d1aSTang Haojin val ITLBMissBubble = Value("ITLBMissBubble") 728d2b20d1aSTang Haojin val BTBMissBubble = Value("BTBMissBubble") 729d2b20d1aSTang Haojin val FetchFragBubble = Value("FetchFragBubble") 730d2b20d1aSTang Haojin 731d2b20d1aSTang Haojin // backend 732d2b20d1aSTang Haojin // long inst stall at rob head 733d2b20d1aSTang Haojin val DivStall = Value("DivStall") // int div, float div/sqrt 734d2b20d1aSTang Haojin val IntNotReadyStall = Value("IntNotReadyStall") // int-inst at rob head not issue 735d2b20d1aSTang Haojin val FPNotReadyStall = Value("FPNotReadyStall") // fp-inst at rob head not issue 736d2b20d1aSTang Haojin val MemNotReadyStall = Value("MemNotReadyStall") // mem-inst at rob head not issue 737d2b20d1aSTang Haojin // freelist full 738d2b20d1aSTang Haojin val IntFlStall = Value("IntFlStall") 739d2b20d1aSTang Haojin val FpFlStall = Value("FpFlStall") 740d2b20d1aSTang Haojin // dispatch queue full 741d2b20d1aSTang Haojin val IntDqStall = Value("IntDqStall") 742d2b20d1aSTang Haojin val FpDqStall = Value("FpDqStall") 743d2b20d1aSTang Haojin val LsDqStall = Value("LsDqStall") 744d2b20d1aSTang Haojin 745d2b20d1aSTang Haojin // memblock 746d2b20d1aSTang Haojin val LoadTLBStall = Value("LoadTLBStall") 747d2b20d1aSTang Haojin val LoadL1Stall = Value("LoadL1Stall") 748d2b20d1aSTang Haojin val LoadL2Stall = Value("LoadL2Stall") 749d2b20d1aSTang Haojin val LoadL3Stall = Value("LoadL3Stall") 750d2b20d1aSTang Haojin val LoadMemStall = Value("LoadMemStall") 751d2b20d1aSTang Haojin val StoreStall = Value("StoreStall") // include store tlb miss 752d2b20d1aSTang Haojin val AtomicStall = Value("AtomicStall") // atomic, load reserved, store conditional 753d2b20d1aSTang Haojin 754d2b20d1aSTang Haojin // xs replay (different to gem5) 755d2b20d1aSTang Haojin val LoadVioReplayStall = Value("LoadVioReplayStall") 756d2b20d1aSTang Haojin val LoadMSHRReplayStall = Value("LoadMSHRReplayStall") 757d2b20d1aSTang Haojin 758d2b20d1aSTang Haojin // bad speculation 759d2b20d1aSTang Haojin val ControlRecoveryStall = Value("ControlRecoveryStall") 760d2b20d1aSTang Haojin val MemVioRecoveryStall = Value("MemVioRecoveryStall") 761d2b20d1aSTang Haojin val OtherRecoveryStall = Value("OtherRecoveryStall") 762d2b20d1aSTang Haojin 763d2b20d1aSTang Haojin val FlushedInsts = Value("FlushedInsts") // control flushed, memvio flushed, others 764d2b20d1aSTang Haojin 765d2b20d1aSTang Haojin val OtherCoreStall = Value("OtherCoreStall") 766d2b20d1aSTang Haojin 767d2b20d1aSTang Haojin val NumStallReasons = Value("NumStallReasons") 768d2b20d1aSTang Haojin } 7699a2e6b8aSLinJiawei} 770