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 { 71*c4501a6fSZiyue-Zhang def dummy = "b0000".U 72*c4501a6fSZiyue-Zhang def vle = "b0001".U 73*c4501a6fSZiyue-Zhang def vlse = "b0010".U 74*c4501a6fSZiyue-Zhang def vluxe = "b0011".U 75*c4501a6fSZiyue-Zhang def vloxe = "b0100".U 76*c4501a6fSZiyue-Zhang def vleff = "b0101".U 77*c4501a6fSZiyue-Zhang def vlm = "b0110".U 78*c4501a6fSZiyue-Zhang def vlr = "b0111".U 797f2b7720SXuan Hu } 807f2b7720SXuan Hu 817f2b7720SXuan Hu object VstuType { 82*c4501a6fSZiyue-Zhang def dummy = "b0000".U 83*c4501a6fSZiyue-Zhang def vse = "b1001".U 84*c4501a6fSZiyue-Zhang def vsse = "b1010".U 85*c4501a6fSZiyue-Zhang def vsuxe = "b1011".U 86*c4501a6fSZiyue-Zhang def vsoxe = "b1100".U 87*c4501a6fSZiyue-Zhang def vseff = "b1101".U 88*c4501a6fSZiyue-Zhang def vsm = "b1110".U 89*c4501a6fSZiyue-Zhang def vsr = "b1111".U 907f2b7720SXuan Hu } 917f2b7720SXuan Hu 92d6059658SZiyue Zhang object IF2VectorType { 93d6059658SZiyue Zhang // use last 3 bits for vsew 94d6059658SZiyue Zhang def i2vector = "b00_00".U 95d6059658SZiyue Zhang def f2vector = "b00_01".U 96d6059658SZiyue Zhang def imm2vector = "b00_10".U 97d6059658SZiyue Zhang def permImm2vector = "b00_11".U 98d6059658SZiyue Zhang } 99d6059658SZiyue Zhang 100a3edac52SYinan Xu object CommitType { 101c3abb8b6SYinan Xu def NORMAL = "b000".U // int/fp 102c3abb8b6SYinan Xu def BRANCH = "b001".U // branch 103c3abb8b6SYinan Xu def LOAD = "b010".U // load 104c3abb8b6SYinan Xu def STORE = "b011".U // store 105518d8658SYinan Xu 106c3abb8b6SYinan Xu def apply() = UInt(3.W) 107c3abb8b6SYinan Xu def isFused(commitType: UInt): Bool = commitType(2) 108c3abb8b6SYinan Xu def isLoadStore(commitType: UInt): Bool = !isFused(commitType) && commitType(1) 109c3abb8b6SYinan Xu def lsInstIsStore(commitType: UInt): Bool = commitType(0) 110c3abb8b6SYinan Xu def isStore(commitType: UInt): Bool = isLoadStore(commitType) && lsInstIsStore(commitType) 111c3abb8b6SYinan Xu def isBranch(commitType: UInt): Bool = commitType(0) && !commitType(1) && !isFused(commitType) 112518d8658SYinan Xu } 113bfb958a3SYinan Xu 114bfb958a3SYinan Xu object RedirectLevel { 1152d7c7105SYinan Xu def flushAfter = "b0".U 1162d7c7105SYinan Xu def flush = "b1".U 117bfb958a3SYinan Xu 1182d7c7105SYinan Xu def apply() = UInt(1.W) 1192d7c7105SYinan Xu // def isUnconditional(level: UInt) = level(1) 120bfb958a3SYinan Xu def flushItself(level: UInt) = level(0) 1212d7c7105SYinan Xu // def isException(level: UInt) = level(1) && level(0) 122bfb958a3SYinan Xu } 123baf8def6SYinan Xu 124baf8def6SYinan Xu object ExceptionVec { 125da3bf434SMaxpicca-Li val ExceptionVecSize = 16 126da3bf434SMaxpicca-Li def apply() = Vec(ExceptionVecSize, Bool()) 127baf8def6SYinan Xu } 128a8e04b1dSYinan Xu 129c60c1ab4SWilliam Wang object PMAMode { 1308d9a04fcSWilliam Wang def R = "b1".U << 0 //readable 1318d9a04fcSWilliam Wang def W = "b1".U << 1 //writeable 1328d9a04fcSWilliam Wang def X = "b1".U << 2 //executable 1338d9a04fcSWilliam Wang def I = "b1".U << 3 //cacheable: icache 1348d9a04fcSWilliam Wang def D = "b1".U << 4 //cacheable: dcache 1358d9a04fcSWilliam Wang def S = "b1".U << 5 //enable speculative access 136cff68e26SWilliam Wang def A = "b1".U << 6 //enable atomic operation, A imply R & W 1378d9a04fcSWilliam Wang def C = "b1".U << 7 //if it is cacheable is configable 138c60c1ab4SWilliam Wang def Reserved = "b0".U 139c60c1ab4SWilliam Wang 140c60c1ab4SWilliam Wang def apply() = UInt(7.W) 141c60c1ab4SWilliam Wang 142c60c1ab4SWilliam Wang def read(mode: UInt) = mode(0) 143c60c1ab4SWilliam Wang def write(mode: UInt) = mode(1) 144c60c1ab4SWilliam Wang def execute(mode: UInt) = mode(2) 145c60c1ab4SWilliam Wang def icache(mode: UInt) = mode(3) 146c60c1ab4SWilliam Wang def dcache(mode: UInt) = mode(4) 147c60c1ab4SWilliam Wang def speculate(mode: UInt) = mode(5) 148c60c1ab4SWilliam Wang def atomic(mode: UInt) = mode(6) 149c60c1ab4SWilliam Wang def configable_cache(mode: UInt) = mode(7) 150c60c1ab4SWilliam Wang 151c60c1ab4SWilliam Wang def strToMode(s: String) = { 152423b9255SWilliam Wang var result = 0.U(8.W) 153c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("R") >= 0) result = result + R 154c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("W") >= 0) result = result + W 155c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("X") >= 0) result = result + X 156c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("I") >= 0) result = result + I 157c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("D") >= 0) result = result + D 158c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("S") >= 0) result = result + S 159c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("A") >= 0) result = result + A 160c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("C") >= 0) result = result + C 161c60c1ab4SWilliam Wang result 162c60c1ab4SWilliam Wang } 163c60c1ab4SWilliam Wang } 1642225d46eSJiawei Lin 1652225d46eSJiawei Lin 1662225d46eSJiawei Lin object CSROpType { 1672225d46eSJiawei Lin def jmp = "b000".U 1682225d46eSJiawei Lin def wrt = "b001".U 1692225d46eSJiawei Lin def set = "b010".U 1702225d46eSJiawei Lin def clr = "b011".U 171b6900d94SYinan Xu def wfi = "b100".U 1722225d46eSJiawei Lin def wrti = "b101".U 1732225d46eSJiawei Lin def seti = "b110".U 1742225d46eSJiawei Lin def clri = "b111".U 1755d669833SYinan Xu def needAccess(op: UInt): Bool = op(1, 0) =/= 0.U 1762225d46eSJiawei Lin } 1772225d46eSJiawei Lin 1782225d46eSJiawei Lin // jump 1792225d46eSJiawei Lin object JumpOpType { 1802225d46eSJiawei Lin def jal = "b00".U 1812225d46eSJiawei Lin def jalr = "b01".U 1822225d46eSJiawei Lin def auipc = "b10".U 1832225d46eSJiawei Lin// def call = "b11_011".U 1842225d46eSJiawei Lin// def ret = "b11_100".U 1852225d46eSJiawei Lin def jumpOpisJalr(op: UInt) = op(0) 1862225d46eSJiawei Lin def jumpOpisAuipc(op: UInt) = op(1) 1872225d46eSJiawei Lin } 1882225d46eSJiawei Lin 1892225d46eSJiawei Lin object FenceOpType { 1902225d46eSJiawei Lin def fence = "b10000".U 1912225d46eSJiawei Lin def sfence = "b10001".U 1922225d46eSJiawei Lin def fencei = "b10010".U 193af2f7849Shappy-lx def nofence= "b00000".U 1942225d46eSJiawei Lin } 1952225d46eSJiawei Lin 1962225d46eSJiawei Lin object ALUOpType { 197ee8ff153Szfw // shift optype 198675acc68SYinan Xu def slliuw = "b000_0000".U // slliuw: ZEXT(src1[31:0]) << shamt 199675acc68SYinan Xu def sll = "b000_0001".U // sll: src1 << src2 200ee8ff153Szfw 201675acc68SYinan Xu def bclr = "b000_0010".U // bclr: src1 & ~(1 << src2[5:0]) 202675acc68SYinan Xu def bset = "b000_0011".U // bset: src1 | (1 << src2[5:0]) 203675acc68SYinan Xu def binv = "b000_0100".U // binv: src1 ^ ~(1 << src2[5:0]) 204ee8ff153Szfw 205675acc68SYinan Xu def srl = "b000_0101".U // srl: src1 >> src2 206675acc68SYinan Xu def bext = "b000_0110".U // bext: (src1 >> src2)[0] 207675acc68SYinan Xu def sra = "b000_0111".U // sra: src1 >> src2 (arithmetic) 208ee8ff153Szfw 2097b441e5eSYinan Xu def rol = "b000_1001".U // rol: (src1 << src2) | (src1 >> (xlen - src2)) 2107b441e5eSYinan Xu def ror = "b000_1011".U // ror: (src1 >> src2) | (src1 << (xlen - src2)) 211184a1958Szfw 212ee8ff153Szfw // RV64 32bit optype 213675acc68SYinan Xu def addw = "b001_0000".U // addw: SEXT((src1 + src2)[31:0]) 214675acc68SYinan Xu def oddaddw = "b001_0001".U // oddaddw: SEXT((src1[0] + src2)[31:0]) 215675acc68SYinan Xu def subw = "b001_0010".U // subw: SEXT((src1 - src2)[31:0]) 21654711376Ssinsanction def lui32addw = "b001_0011".U // lui32addw: SEXT(SEXT(src2[11:0], 32) + {src2[31:12], 12'b0}, 64) 217ee8ff153Szfw 218675acc68SYinan Xu def addwbit = "b001_0100".U // addwbit: (src1 + src2)[0] 219675acc68SYinan Xu def addwbyte = "b001_0101".U // addwbyte: (src1 + src2)[7:0] 220675acc68SYinan Xu def addwzexth = "b001_0110".U // addwzexth: ZEXT((src1 + src2)[15:0]) 221675acc68SYinan Xu def addwsexth = "b001_0111".U // addwsexth: SEXT((src1 + src2)[15:0]) 222ee8ff153Szfw 223675acc68SYinan Xu def sllw = "b001_1000".U // sllw: SEXT((src1 << src2)[31:0]) 224675acc68SYinan Xu def srlw = "b001_1001".U // srlw: SEXT((src1[31:0] >> src2)[31:0]) 225675acc68SYinan Xu def sraw = "b001_1010".U // sraw: SEXT((src1[31:0] >> src2)[31:0]) 226675acc68SYinan Xu def rolw = "b001_1100".U 227675acc68SYinan Xu def rorw = "b001_1101".U 228675acc68SYinan Xu 229675acc68SYinan Xu // ADD-op 230675acc68SYinan Xu def adduw = "b010_0000".U // adduw: src1[31:0] + src2 231675acc68SYinan Xu def add = "b010_0001".U // add: src1 + src2 232675acc68SYinan Xu def oddadd = "b010_0010".U // oddadd: src1[0] + src2 233fe528fd6Ssinsanction def lui32add = "b010_0011".U // lui32add: SEXT(src2[11:0]) + {src2[63:12], 12'b0} 234675acc68SYinan Xu 235675acc68SYinan Xu def sr29add = "b010_0100".U // sr29add: src1[63:29] + src2 236675acc68SYinan Xu def sr30add = "b010_0101".U // sr30add: src1[63:30] + src2 237675acc68SYinan Xu def sr31add = "b010_0110".U // sr31add: src1[63:31] + src2 238675acc68SYinan Xu def sr32add = "b010_0111".U // sr32add: src1[63:32] + src2 239675acc68SYinan Xu 240675acc68SYinan Xu def sh1adduw = "b010_1000".U // sh1adduw: {src1[31:0], 1'b0} + src2 241675acc68SYinan Xu def sh1add = "b010_1001".U // sh1add: {src1[62:0], 1'b0} + src2 242675acc68SYinan Xu def sh2adduw = "b010_1010".U // sh2add_uw: {src1[31:0], 2'b0} + src2 243675acc68SYinan Xu def sh2add = "b010_1011".U // sh2add: {src1[61:0], 2'b0} + src2 244675acc68SYinan Xu def sh3adduw = "b010_1100".U // sh3add_uw: {src1[31:0], 3'b0} + src2 245675acc68SYinan Xu def sh3add = "b010_1101".U // sh3add: {src1[60:0], 3'b0} + src2 246675acc68SYinan Xu def sh4add = "b010_1111".U // sh4add: {src1[59:0], 4'b0} + src2 247675acc68SYinan Xu 248675acc68SYinan Xu // SUB-op: src1 - src2 249675acc68SYinan Xu def sub = "b011_0000".U 250675acc68SYinan Xu def sltu = "b011_0001".U 251675acc68SYinan Xu def slt = "b011_0010".U 252675acc68SYinan Xu def maxu = "b011_0100".U 253675acc68SYinan Xu def minu = "b011_0101".U 254675acc68SYinan Xu def max = "b011_0110".U 255675acc68SYinan Xu def min = "b011_0111".U 256675acc68SYinan Xu 257675acc68SYinan Xu // branch 258675acc68SYinan Xu def beq = "b111_0000".U 259675acc68SYinan Xu def bne = "b111_0010".U 260675acc68SYinan Xu def blt = "b111_1000".U 261675acc68SYinan Xu def bge = "b111_1010".U 262675acc68SYinan Xu def bltu = "b111_1100".U 263675acc68SYinan Xu def bgeu = "b111_1110".U 264675acc68SYinan Xu 265675acc68SYinan Xu // misc optype 266675acc68SYinan Xu def and = "b100_0000".U 267675acc68SYinan Xu def andn = "b100_0001".U 268675acc68SYinan Xu def or = "b100_0010".U 269675acc68SYinan Xu def orn = "b100_0011".U 270675acc68SYinan Xu def xor = "b100_0100".U 271675acc68SYinan Xu def xnor = "b100_0101".U 272675acc68SYinan Xu def orcb = "b100_0110".U 273675acc68SYinan Xu 274675acc68SYinan Xu def sextb = "b100_1000".U 275675acc68SYinan Xu def packh = "b100_1001".U 276675acc68SYinan Xu def sexth = "b100_1010".U 277675acc68SYinan Xu def packw = "b100_1011".U 278675acc68SYinan Xu 279675acc68SYinan Xu def revb = "b101_0000".U 280675acc68SYinan Xu def rev8 = "b101_0001".U 281675acc68SYinan Xu def pack = "b101_0010".U 282675acc68SYinan Xu def orh48 = "b101_0011".U 283675acc68SYinan Xu 284675acc68SYinan Xu def szewl1 = "b101_1000".U 285675acc68SYinan Xu def szewl2 = "b101_1001".U 286675acc68SYinan Xu def szewl3 = "b101_1010".U 287675acc68SYinan Xu def byte2 = "b101_1011".U 288675acc68SYinan Xu 289675acc68SYinan Xu def andlsb = "b110_0000".U 290675acc68SYinan Xu def andzexth = "b110_0001".U 291675acc68SYinan Xu def orlsb = "b110_0010".U 292675acc68SYinan Xu def orzexth = "b110_0011".U 293675acc68SYinan Xu def xorlsb = "b110_0100".U 294675acc68SYinan Xu def xorzexth = "b110_0101".U 295675acc68SYinan Xu def orcblsb = "b110_0110".U 296675acc68SYinan Xu def orcbzexth = "b110_0111".U 297675acc68SYinan Xu 298675acc68SYinan Xu def isAddw(func: UInt) = func(6, 4) === "b001".U && !func(3) && !func(1) 299675acc68SYinan Xu def isSimpleLogic(func: UInt) = func(6, 4) === "b100".U && !func(0) 300675acc68SYinan Xu def logicToLsb(func: UInt) = Cat("b110".U(3.W), func(3, 1), 0.U(1.W)) 301675acc68SYinan Xu def logicToZexth(func: UInt) = Cat("b110".U(3.W), func(3, 1), 1.U(1.W)) 302675acc68SYinan Xu 30357a10886SXuan Hu def apply() = UInt(FuOpTypeWidth.W) 3042225d46eSJiawei Lin } 3052225d46eSJiawei Lin 306d91483a6Sfdy object VSETOpType { 307a8db15d8Sfdy val setVlmaxBit = 0 308a8db15d8Sfdy val keepVlBit = 1 309a8db15d8Sfdy // destTypeBit == 0: write vl to rd 310a8db15d8Sfdy // destTypeBit == 1: write vconfig 311a8db15d8Sfdy val destTypeBit = 5 312a8db15d8Sfdy 313a32c56f4SXuan Hu // vsetvli's uop 314a32c56f4SXuan Hu // rs1!=x0, normal 315a32c56f4SXuan Hu // uop0: r(rs1), w(vconfig) | x[rs1],vtypei -> vconfig 316a32c56f4SXuan Hu // uop1: r(rs1), w(rd) | x[rs1],vtypei -> x[rd] 317a32c56f4SXuan Hu def uvsetvcfg_xi = "b1010_0000".U 318a32c56f4SXuan Hu def uvsetrd_xi = "b1000_0000".U 319a32c56f4SXuan Hu // rs1==x0, rd!=x0, set vl to vlmax, set rd to vlmax, set vtype 320a32c56f4SXuan Hu // uop0: w(vconfig) | vlmax, vtypei -> vconfig 321a32c56f4SXuan Hu // uop1: w(rd) | vlmax, vtypei -> x[rd] 322a32c56f4SXuan Hu def uvsetvcfg_vlmax_i = "b1010_0001".U 323a32c56f4SXuan Hu def uvsetrd_vlmax_i = "b1000_0001".U 324a32c56f4SXuan Hu // rs1==x0, rd==x0, keep vl, set vtype 325a32c56f4SXuan Hu // uop0: r(vconfig), w(vconfig) | ld_vconfig.vl, vtypei -> vconfig 326a32c56f4SXuan Hu def uvsetvcfg_keep_v = "b1010_0010".U 327d91483a6Sfdy 328a32c56f4SXuan Hu // vsetvl's uop 329a32c56f4SXuan Hu // rs1!=x0, normal 330a32c56f4SXuan Hu // uop0: r(rs1,rs2), w(vconfig) | x[rs1],x[rs2] -> vconfig 331a32c56f4SXuan Hu // uop1: r(rs1,rs2), w(rd) | x[rs1],x[rs2] -> x[rd] 332a32c56f4SXuan Hu def uvsetvcfg_xx = "b0110_0000".U 333a32c56f4SXuan Hu def uvsetrd_xx = "b0100_0000".U 334a32c56f4SXuan Hu // rs1==x0, rd!=x0, set vl to vlmax, set rd to vlmax, set vtype 335a32c56f4SXuan Hu // uop0: r(rs2), w(vconfig) | vlmax, vtypei -> vconfig 336a32c56f4SXuan Hu // uop1: r(rs2), w(rd) | vlmax, vtypei -> x[rd] 337a32c56f4SXuan Hu def uvsetvcfg_vlmax_x = "b0110_0001".U 338a32c56f4SXuan Hu def uvsetrd_vlmax_x = "b0100_0001".U 339a32c56f4SXuan Hu // rs1==x0, rd==x0, keep vl, set vtype 340a32c56f4SXuan Hu // uop0: r(rs2), w(vtmp) | x[rs2] -> vtmp 341a32c56f4SXuan Hu // uop0: r(vconfig,vtmp), w(vconfig) | old_vconfig.vl, vtmp -> vconfig 342a32c56f4SXuan Hu def uvmv_v_x = "b0110_0010".U 343a32c56f4SXuan Hu def uvsetvcfg_vv = "b0111_0010".U 344a32c56f4SXuan Hu 345a32c56f4SXuan Hu // vsetivli's uop 346a32c56f4SXuan Hu // uop0: w(vconfig) | vli, vtypei -> vconfig 347a32c56f4SXuan Hu // uop1: w(rd) | vli, vtypei -> x[rd] 348a32c56f4SXuan Hu def uvsetvcfg_ii = "b0010_0000".U 349a32c56f4SXuan Hu def uvsetrd_ii = "b0000_0000".U 350a32c56f4SXuan Hu 351a32c56f4SXuan Hu def isVsetvl (func: UInt) = func(6) 352a32c56f4SXuan Hu def isVsetvli (func: UInt) = func(7) 353a32c56f4SXuan Hu def isVsetivli(func: UInt) = func(7, 6) === 0.U 354a32c56f4SXuan Hu def isNormal (func: UInt) = func(1, 0) === 0.U 355a8db15d8Sfdy def isSetVlmax(func: UInt) = func(setVlmaxBit) 356a8db15d8Sfdy def isKeepVl (func: UInt) = func(keepVlBit) 357a32c56f4SXuan Hu // RG: region 358a32c56f4SXuan Hu def writeIntRG(func: UInt) = !func(5) 359a32c56f4SXuan Hu def writeVecRG(func: UInt) = func(5) 360a32c56f4SXuan Hu def readIntRG (func: UInt) = !func(4) 361a32c56f4SXuan Hu def readVecRG (func: UInt) = func(4) 362a8db15d8Sfdy // modify fuOpType 363a8db15d8Sfdy def switchDest(func: UInt) = func ^ (1 << destTypeBit).U 364a8db15d8Sfdy def keepVl(func: UInt) = func | (1 << keepVlBit).U 365a8db15d8Sfdy def setVlmax(func: UInt) = func | (1 << setVlmaxBit).U 366d91483a6Sfdy } 367d91483a6Sfdy 3683b739f49SXuan Hu object BRUOpType { 3693b739f49SXuan Hu // branch 3703b739f49SXuan Hu def beq = "b000_000".U 3713b739f49SXuan Hu def bne = "b000_001".U 3723b739f49SXuan Hu def blt = "b000_100".U 3733b739f49SXuan Hu def bge = "b000_101".U 3743b739f49SXuan Hu def bltu = "b001_000".U 3753b739f49SXuan Hu def bgeu = "b001_001".U 3763b739f49SXuan Hu 3773b739f49SXuan Hu def getBranchType(func: UInt) = func(3, 1) 3783b739f49SXuan Hu def isBranchInvert(func: UInt) = func(0) 3793b739f49SXuan Hu } 3803b739f49SXuan Hu 3813b739f49SXuan Hu object MULOpType { 3823b739f49SXuan Hu // mul 3833b739f49SXuan Hu // bit encoding: | type (2bit) | isWord(1bit) | opcode(2bit) | 3843b739f49SXuan Hu def mul = "b00000".U 3853b739f49SXuan Hu def mulh = "b00001".U 3863b739f49SXuan Hu def mulhsu = "b00010".U 3873b739f49SXuan Hu def mulhu = "b00011".U 3883b739f49SXuan Hu def mulw = "b00100".U 3893b739f49SXuan Hu 3903b739f49SXuan Hu def mulw7 = "b01100".U 3913b739f49SXuan Hu def isSign(op: UInt) = !op(1) 3923b739f49SXuan Hu def isW(op: UInt) = op(2) 3933b739f49SXuan Hu def isH(op: UInt) = op(1, 0) =/= 0.U 3943b739f49SXuan Hu def getOp(op: UInt) = Cat(op(3), op(1, 0)) 3953b739f49SXuan Hu } 3963b739f49SXuan Hu 3973b739f49SXuan Hu object DIVOpType { 3983b739f49SXuan Hu // div 3993b739f49SXuan Hu // bit encoding: | type (2bit) | isWord(1bit) | isSign(1bit) | opcode(1bit) | 4003b739f49SXuan Hu def div = "b10000".U 4013b739f49SXuan Hu def divu = "b10010".U 4023b739f49SXuan Hu def rem = "b10001".U 4033b739f49SXuan Hu def remu = "b10011".U 4043b739f49SXuan Hu 4053b739f49SXuan Hu def divw = "b10100".U 4063b739f49SXuan Hu def divuw = "b10110".U 4073b739f49SXuan Hu def remw = "b10101".U 4083b739f49SXuan Hu def remuw = "b10111".U 4093b739f49SXuan Hu 4103b739f49SXuan Hu def isSign(op: UInt) = !op(1) 4113b739f49SXuan Hu def isW(op: UInt) = op(2) 4123b739f49SXuan Hu def isH(op: UInt) = op(0) 4133b739f49SXuan Hu } 4143b739f49SXuan Hu 4152225d46eSJiawei Lin object MDUOpType { 4162225d46eSJiawei Lin // mul 4172225d46eSJiawei Lin // bit encoding: | type (2bit) | isWord(1bit) | opcode(2bit) | 4182225d46eSJiawei Lin def mul = "b00000".U 4192225d46eSJiawei Lin def mulh = "b00001".U 4202225d46eSJiawei Lin def mulhsu = "b00010".U 4212225d46eSJiawei Lin def mulhu = "b00011".U 4222225d46eSJiawei Lin def mulw = "b00100".U 4232225d46eSJiawei Lin 42488825c5cSYinan Xu def mulw7 = "b01100".U 42588825c5cSYinan Xu 4262225d46eSJiawei Lin // div 4272225d46eSJiawei Lin // bit encoding: | type (2bit) | isWord(1bit) | isSign(1bit) | opcode(1bit) | 42888825c5cSYinan Xu def div = "b10000".U 42988825c5cSYinan Xu def divu = "b10010".U 43088825c5cSYinan Xu def rem = "b10001".U 43188825c5cSYinan Xu def remu = "b10011".U 4322225d46eSJiawei Lin 43388825c5cSYinan Xu def divw = "b10100".U 43488825c5cSYinan Xu def divuw = "b10110".U 43588825c5cSYinan Xu def remw = "b10101".U 43688825c5cSYinan Xu def remuw = "b10111".U 4372225d46eSJiawei Lin 43888825c5cSYinan Xu def isMul(op: UInt) = !op(4) 43988825c5cSYinan Xu def isDiv(op: UInt) = op(4) 4402225d46eSJiawei Lin 4412225d46eSJiawei Lin def isDivSign(op: UInt) = isDiv(op) && !op(1) 4422225d46eSJiawei Lin def isW(op: UInt) = op(2) 4432225d46eSJiawei Lin def isH(op: UInt) = (isDiv(op) && op(0)) || (isMul(op) && op(1, 0) =/= 0.U) 4442225d46eSJiawei Lin def getMulOp(op: UInt) = op(1, 0) 4452225d46eSJiawei Lin } 4462225d46eSJiawei Lin 4472225d46eSJiawei Lin object LSUOpType { 448d200f594SWilliam Wang // load pipeline 4492225d46eSJiawei Lin 450d200f594SWilliam Wang // normal load 451d200f594SWilliam Wang // Note: bit(1, 0) are size, DO NOT CHANGE 452d200f594SWilliam Wang // bit encoding: | load 0 | is unsigned(1bit) | size(2bit) | 453d200f594SWilliam Wang def lb = "b0000".U 454d200f594SWilliam Wang def lh = "b0001".U 455d200f594SWilliam Wang def lw = "b0010".U 456d200f594SWilliam Wang def ld = "b0011".U 457d200f594SWilliam Wang def lbu = "b0100".U 458d200f594SWilliam Wang def lhu = "b0101".U 459d200f594SWilliam Wang def lwu = "b0110".U 460ca18a0b4SWilliam Wang 461d200f594SWilliam Wang // Zicbop software prefetch 462d200f594SWilliam Wang // bit encoding: | prefetch 1 | 0 | prefetch type (2bit) | 463d200f594SWilliam Wang def prefetch_i = "b1000".U // TODO 464d200f594SWilliam Wang def prefetch_r = "b1001".U 465d200f594SWilliam Wang def prefetch_w = "b1010".U 466ca18a0b4SWilliam Wang 467d200f594SWilliam Wang def isPrefetch(op: UInt): Bool = op(3) 468d200f594SWilliam Wang 469d200f594SWilliam Wang // store pipeline 470d200f594SWilliam Wang // normal store 471d200f594SWilliam Wang // bit encoding: | store 00 | size(2bit) | 472d200f594SWilliam Wang def sb = "b0000".U 473d200f594SWilliam Wang def sh = "b0001".U 474d200f594SWilliam Wang def sw = "b0010".U 475d200f594SWilliam Wang def sd = "b0011".U 476d200f594SWilliam Wang 477d200f594SWilliam Wang // l1 cache op 478d200f594SWilliam Wang // bit encoding: | cbo_zero 01 | size(2bit) 11 | 479d200f594SWilliam Wang def cbo_zero = "b0111".U 480d200f594SWilliam Wang 481d200f594SWilliam Wang // llc op 482d200f594SWilliam Wang // bit encoding: | prefetch 11 | suboptype(2bit) | 483d200f594SWilliam Wang def cbo_clean = "b1100".U 484d200f594SWilliam Wang def cbo_flush = "b1101".U 485d200f594SWilliam Wang def cbo_inval = "b1110".U 486d200f594SWilliam Wang 487d200f594SWilliam Wang def isCbo(op: UInt): Bool = op(3, 2) === "b11".U 4882225d46eSJiawei Lin 4892225d46eSJiawei Lin // atomics 4902225d46eSJiawei Lin // bit(1, 0) are size 4912225d46eSJiawei Lin // since atomics use a different fu type 4922225d46eSJiawei Lin // so we can safely reuse other load/store's encodings 493d200f594SWilliam Wang // bit encoding: | optype(4bit) | size (2bit) | 4942225d46eSJiawei Lin def lr_w = "b000010".U 4952225d46eSJiawei Lin def sc_w = "b000110".U 4962225d46eSJiawei Lin def amoswap_w = "b001010".U 4972225d46eSJiawei Lin def amoadd_w = "b001110".U 4982225d46eSJiawei Lin def amoxor_w = "b010010".U 4992225d46eSJiawei Lin def amoand_w = "b010110".U 5002225d46eSJiawei Lin def amoor_w = "b011010".U 5012225d46eSJiawei Lin def amomin_w = "b011110".U 5022225d46eSJiawei Lin def amomax_w = "b100010".U 5032225d46eSJiawei Lin def amominu_w = "b100110".U 5042225d46eSJiawei Lin def amomaxu_w = "b101010".U 5052225d46eSJiawei Lin 5062225d46eSJiawei Lin def lr_d = "b000011".U 5072225d46eSJiawei Lin def sc_d = "b000111".U 5082225d46eSJiawei Lin def amoswap_d = "b001011".U 5092225d46eSJiawei Lin def amoadd_d = "b001111".U 5102225d46eSJiawei Lin def amoxor_d = "b010011".U 5112225d46eSJiawei Lin def amoand_d = "b010111".U 5122225d46eSJiawei Lin def amoor_d = "b011011".U 5132225d46eSJiawei Lin def amomin_d = "b011111".U 5142225d46eSJiawei Lin def amomax_d = "b100011".U 5152225d46eSJiawei Lin def amominu_d = "b100111".U 5162225d46eSJiawei Lin def amomaxu_d = "b101011".U 517b6982e83SLemover 518b6982e83SLemover def size(op: UInt) = op(1,0) 5192225d46eSJiawei Lin } 5202225d46eSJiawei Lin 5213feeca58Szfw object BKUOpType { 522ee8ff153Szfw 5233feeca58Szfw def clmul = "b000000".U 5243feeca58Szfw def clmulh = "b000001".U 5253feeca58Szfw def clmulr = "b000010".U 5263feeca58Szfw def xpermn = "b000100".U 5273feeca58Szfw def xpermb = "b000101".U 528ee8ff153Szfw 5293feeca58Szfw def clz = "b001000".U 5303feeca58Szfw def clzw = "b001001".U 5313feeca58Szfw def ctz = "b001010".U 5323feeca58Szfw def ctzw = "b001011".U 5333feeca58Szfw def cpop = "b001100".U 5343feeca58Szfw def cpopw = "b001101".U 53507596dc6Szfw 5363feeca58Szfw // 01xxxx is reserve 5373feeca58Szfw def aes64es = "b100000".U 5383feeca58Szfw def aes64esm = "b100001".U 5393feeca58Szfw def aes64ds = "b100010".U 5403feeca58Szfw def aes64dsm = "b100011".U 5413feeca58Szfw def aes64im = "b100100".U 5423feeca58Szfw def aes64ks1i = "b100101".U 5433feeca58Szfw def aes64ks2 = "b100110".U 5443feeca58Szfw 5453feeca58Szfw // merge to two instruction sm4ks & sm4ed 54619bcce38SFawang Zhang def sm4ed0 = "b101000".U 54719bcce38SFawang Zhang def sm4ed1 = "b101001".U 54819bcce38SFawang Zhang def sm4ed2 = "b101010".U 54919bcce38SFawang Zhang def sm4ed3 = "b101011".U 55019bcce38SFawang Zhang def sm4ks0 = "b101100".U 55119bcce38SFawang Zhang def sm4ks1 = "b101101".U 55219bcce38SFawang Zhang def sm4ks2 = "b101110".U 55319bcce38SFawang Zhang def sm4ks3 = "b101111".U 5543feeca58Szfw 5553feeca58Szfw def sha256sum0 = "b110000".U 5563feeca58Szfw def sha256sum1 = "b110001".U 5573feeca58Szfw def sha256sig0 = "b110010".U 5583feeca58Szfw def sha256sig1 = "b110011".U 5593feeca58Szfw def sha512sum0 = "b110100".U 5603feeca58Szfw def sha512sum1 = "b110101".U 5613feeca58Szfw def sha512sig0 = "b110110".U 5623feeca58Szfw def sha512sig1 = "b110111".U 5633feeca58Szfw 5643feeca58Szfw def sm3p0 = "b111000".U 5653feeca58Szfw def sm3p1 = "b111001".U 566ee8ff153Szfw } 567ee8ff153Szfw 5682225d46eSJiawei Lin object BTBtype { 5692225d46eSJiawei Lin def B = "b00".U // branch 5702225d46eSJiawei Lin def J = "b01".U // jump 5712225d46eSJiawei Lin def I = "b10".U // indirect 5722225d46eSJiawei Lin def R = "b11".U // return 5732225d46eSJiawei Lin 5742225d46eSJiawei Lin def apply() = UInt(2.W) 5752225d46eSJiawei Lin } 5762225d46eSJiawei Lin 5772225d46eSJiawei Lin object SelImm { 578ee8ff153Szfw def IMM_X = "b0111".U 579d91483a6Sfdy def IMM_S = "b1110".U 580ee8ff153Szfw def IMM_SB = "b0001".U 581ee8ff153Szfw def IMM_U = "b0010".U 582ee8ff153Szfw def IMM_UJ = "b0011".U 583ee8ff153Szfw def IMM_I = "b0100".U 584ee8ff153Szfw def IMM_Z = "b0101".U 585ee8ff153Szfw def INVALID_INSTR = "b0110".U 586ee8ff153Szfw def IMM_B6 = "b1000".U 5872225d46eSJiawei Lin 58858c35d23Shuxuan0307 def IMM_OPIVIS = "b1001".U 58958c35d23Shuxuan0307 def IMM_OPIVIU = "b1010".U 590912e2179SXuan Hu def IMM_VSETVLI = "b1100".U 591912e2179SXuan Hu def IMM_VSETIVLI = "b1101".U 592fe528fd6Ssinsanction def IMM_LUI32 = "b1011".U 59358c35d23Shuxuan0307 59457a10886SXuan Hu def X = BitPat("b0000") 5956e7c9679Shuxuan0307 596ee8ff153Szfw def apply() = UInt(4.W) 5970655b1a0SXuan Hu 5980655b1a0SXuan Hu def mkString(immType: UInt) : String = { 5990655b1a0SXuan Hu val strMap = Map( 6000655b1a0SXuan Hu IMM_S.litValue -> "S", 6010655b1a0SXuan Hu IMM_SB.litValue -> "SB", 6020655b1a0SXuan Hu IMM_U.litValue -> "U", 6030655b1a0SXuan Hu IMM_UJ.litValue -> "UJ", 6040655b1a0SXuan Hu IMM_I.litValue -> "I", 6050655b1a0SXuan Hu IMM_Z.litValue -> "Z", 6060655b1a0SXuan Hu IMM_B6.litValue -> "B6", 6070655b1a0SXuan Hu IMM_OPIVIS.litValue -> "VIS", 6080655b1a0SXuan Hu IMM_OPIVIU.litValue -> "VIU", 6090655b1a0SXuan Hu IMM_VSETVLI.litValue -> "VSETVLI", 6100655b1a0SXuan Hu IMM_VSETIVLI.litValue -> "VSETIVLI", 611fe528fd6Ssinsanction IMM_LUI32.litValue -> "LUI32", 6120655b1a0SXuan Hu INVALID_INSTR.litValue -> "INVALID", 6130655b1a0SXuan Hu ) 6140655b1a0SXuan Hu strMap(immType.litValue) 6150655b1a0SXuan Hu } 6162225d46eSJiawei Lin } 6172225d46eSJiawei Lin 618e2695e90SzhanglyGit object UopSplitType { 619d91483a6Sfdy def SCA_SIM = "b000000".U // 620d91483a6Sfdy def DIR = "b010001".U // dirty: vset 621d91483a6Sfdy def VEC_VVV = "b010010".U // VEC_VVV 622d91483a6Sfdy def VEC_VXV = "b010011".U // VEC_VXV 623d91483a6Sfdy def VEC_0XV = "b010100".U // VEC_0XV 624d91483a6Sfdy def VEC_VVW = "b010101".U // VEC_VVW 625d91483a6Sfdy def VEC_WVW = "b010110".U // VEC_WVW 626d91483a6Sfdy def VEC_VXW = "b010111".U // VEC_VXW 627d91483a6Sfdy def VEC_WXW = "b011000".U // VEC_WXW 628d91483a6Sfdy def VEC_WVV = "b011001".U // VEC_WVV 629d91483a6Sfdy def VEC_WXV = "b011010".U // VEC_WXV 630d91483a6Sfdy def VEC_EXT2 = "b011011".U // VF2 0 -> V 631d91483a6Sfdy def VEC_EXT4 = "b011100".U // VF4 0 -> V 632d91483a6Sfdy def VEC_EXT8 = "b011101".U // VF8 0 -> V 633d91483a6Sfdy def VEC_VVM = "b011110".U // VEC_VVM 634d91483a6Sfdy def VEC_VXM = "b011111".U // VEC_VXM 635d91483a6Sfdy def VEC_SLIDE1UP = "b100000".U // vslide1up.vx 636d91483a6Sfdy def VEC_FSLIDE1UP = "b100001".U // vfslide1up.vf 637d91483a6Sfdy def VEC_SLIDE1DOWN = "b100010".U // vslide1down.vx 638d91483a6Sfdy def VEC_FSLIDE1DOWN = "b100011".U // vfslide1down.vf 639d91483a6Sfdy def VEC_VRED = "b100100".U // VEC_VRED 640d91483a6Sfdy def VEC_SLIDEUP = "b100101".U // VEC_SLIDEUP 641d91483a6Sfdy def VEC_SLIDEDOWN = "b100111".U // VEC_SLIDEDOWN 642d91483a6Sfdy def VEC_M0X = "b101001".U // VEC_M0X 0MV 643d91483a6Sfdy def VEC_MVV = "b101010".U // VEC_MVV VMV 644d91483a6Sfdy def VEC_M0X_VFIRST = "b101011".U // 64584260280Sczw def VEC_VWW = "b101100".U // 64665df1368Sczw def VEC_RGATHER = "b101101".U // vrgather.vv, vrgather.vi 64765df1368Sczw def VEC_RGATHER_VX = "b101110".U // vrgather.vx 64865df1368Sczw def VEC_RGATHEREI16 = "b101111".U // vrgatherei16.vv 649adf68ff3Sczw def VEC_COMPRESS = "b110000".U // vcompress.vm 650*c4501a6fSZiyue-Zhang def VEC_US_LDST = "b110001".U // vector unit-strided load/store 651*c4501a6fSZiyue-Zhang def VEC_S_LDST = "b110010".U // vector strided load/store 652*c4501a6fSZiyue-Zhang def VEC_I_LDST = "b110011".U // vector indexed load/store 653684d7aceSxiaofeibao-xjtu def VEC_VFV = "b111000".U // VEC_VFV 6543748ec56Sxiaofeibao-xjtu def VEC_VFW = "b111001".U // VEC_VFW 6553748ec56Sxiaofeibao-xjtu def VEC_WFW = "b111010".U // VEC_WVW 656f06d6d60Sxiaofeibao-xjtu def VEC_VFM = "b111011".U // VEC_VFM 657582849ffSxiaofeibao-xjtu def VEC_VFRED = "b111100".U // VEC_VFRED 658b94b1889Sxiaofeibao-xjtu def VEC_VFREDOSUM = "b111101".U // VEC_VFREDOSUM 659d91483a6Sfdy def VEC_M0M = "b000000".U // VEC_M0M 660d91483a6Sfdy def VEC_MMM = "b000000".U // VEC_MMM 6610a34fc22SZiyue Zhang def VEC_MVNR = "b000100".U // vmvnr 662d91483a6Sfdy def dummy = "b111111".U 663d91483a6Sfdy 664d91483a6Sfdy def X = BitPat("b000000") 665d91483a6Sfdy 666d91483a6Sfdy def apply() = UInt(6.W) 667e2695e90SzhanglyGit def needSplit(UopSplitType: UInt) = UopSplitType(4) || UopSplitType(5) 668d91483a6Sfdy } 669d91483a6Sfdy 6706ab6918fSYinan Xu object ExceptionNO { 6716ab6918fSYinan Xu def instrAddrMisaligned = 0 6726ab6918fSYinan Xu def instrAccessFault = 1 6736ab6918fSYinan Xu def illegalInstr = 2 6746ab6918fSYinan Xu def breakPoint = 3 6756ab6918fSYinan Xu def loadAddrMisaligned = 4 6766ab6918fSYinan Xu def loadAccessFault = 5 6776ab6918fSYinan Xu def storeAddrMisaligned = 6 6786ab6918fSYinan Xu def storeAccessFault = 7 6796ab6918fSYinan Xu def ecallU = 8 6806ab6918fSYinan Xu def ecallS = 9 6816ab6918fSYinan Xu def ecallM = 11 6826ab6918fSYinan Xu def instrPageFault = 12 6836ab6918fSYinan Xu def loadPageFault = 13 6846ab6918fSYinan Xu // def singleStep = 14 6856ab6918fSYinan Xu def storePageFault = 15 6866ab6918fSYinan Xu def priorities = Seq( 6876ab6918fSYinan Xu breakPoint, // TODO: different BP has different priority 6886ab6918fSYinan Xu instrPageFault, 6896ab6918fSYinan Xu instrAccessFault, 6906ab6918fSYinan Xu illegalInstr, 6916ab6918fSYinan Xu instrAddrMisaligned, 6926ab6918fSYinan Xu ecallM, ecallS, ecallU, 693d880177dSYinan Xu storeAddrMisaligned, 694d880177dSYinan Xu loadAddrMisaligned, 6956ab6918fSYinan Xu storePageFault, 6966ab6918fSYinan Xu loadPageFault, 6976ab6918fSYinan Xu storeAccessFault, 698d880177dSYinan Xu loadAccessFault 6996ab6918fSYinan Xu ) 7006ab6918fSYinan Xu def all = priorities.distinct.sorted 7016ab6918fSYinan Xu def frontendSet = Seq( 7026ab6918fSYinan Xu instrAddrMisaligned, 7036ab6918fSYinan Xu instrAccessFault, 7046ab6918fSYinan Xu illegalInstr, 7056ab6918fSYinan Xu instrPageFault 7066ab6918fSYinan Xu ) 7076ab6918fSYinan Xu def partialSelect(vec: Vec[Bool], select: Seq[Int]): Vec[Bool] = { 7086ab6918fSYinan Xu val new_vec = Wire(ExceptionVec()) 7096ab6918fSYinan Xu new_vec.foreach(_ := false.B) 7106ab6918fSYinan Xu select.foreach(i => new_vec(i) := vec(i)) 7116ab6918fSYinan Xu new_vec 7126ab6918fSYinan Xu } 7136ab6918fSYinan Xu def selectFrontend(vec: Vec[Bool]): Vec[Bool] = partialSelect(vec, frontendSet) 7146ab6918fSYinan Xu def selectAll(vec: Vec[Bool]): Vec[Bool] = partialSelect(vec, ExceptionNO.all) 7156ab6918fSYinan Xu def selectByFu(vec:Vec[Bool], fuConfig: FuConfig): Vec[Bool] = 7166ab6918fSYinan Xu partialSelect(vec, fuConfig.exceptionOut) 7176ab6918fSYinan Xu } 7186ab6918fSYinan Xu 719d2b20d1aSTang Haojin object TopDownCounters extends Enumeration { 720d2b20d1aSTang Haojin val NoStall = Value("NoStall") // Base 721d2b20d1aSTang Haojin // frontend 722d2b20d1aSTang Haojin val OverrideBubble = Value("OverrideBubble") 723d2b20d1aSTang Haojin val FtqUpdateBubble = Value("FtqUpdateBubble") 724d2b20d1aSTang Haojin // val ControlRedirectBubble = Value("ControlRedirectBubble") 725d2b20d1aSTang Haojin val TAGEMissBubble = Value("TAGEMissBubble") 726d2b20d1aSTang Haojin val SCMissBubble = Value("SCMissBubble") 727d2b20d1aSTang Haojin val ITTAGEMissBubble = Value("ITTAGEMissBubble") 728d2b20d1aSTang Haojin val RASMissBubble = Value("RASMissBubble") 729d2b20d1aSTang Haojin val MemVioRedirectBubble = Value("MemVioRedirectBubble") 730d2b20d1aSTang Haojin val OtherRedirectBubble = Value("OtherRedirectBubble") 731d2b20d1aSTang Haojin val FtqFullStall = Value("FtqFullStall") 732d2b20d1aSTang Haojin 733d2b20d1aSTang Haojin val ICacheMissBubble = Value("ICacheMissBubble") 734d2b20d1aSTang Haojin val ITLBMissBubble = Value("ITLBMissBubble") 735d2b20d1aSTang Haojin val BTBMissBubble = Value("BTBMissBubble") 736d2b20d1aSTang Haojin val FetchFragBubble = Value("FetchFragBubble") 737d2b20d1aSTang Haojin 738d2b20d1aSTang Haojin // backend 739d2b20d1aSTang Haojin // long inst stall at rob head 740d2b20d1aSTang Haojin val DivStall = Value("DivStall") // int div, float div/sqrt 741d2b20d1aSTang Haojin val IntNotReadyStall = Value("IntNotReadyStall") // int-inst at rob head not issue 742d2b20d1aSTang Haojin val FPNotReadyStall = Value("FPNotReadyStall") // fp-inst at rob head not issue 743d2b20d1aSTang Haojin val MemNotReadyStall = Value("MemNotReadyStall") // mem-inst at rob head not issue 744d2b20d1aSTang Haojin // freelist full 745d2b20d1aSTang Haojin val IntFlStall = Value("IntFlStall") 746d2b20d1aSTang Haojin val FpFlStall = Value("FpFlStall") 747d2b20d1aSTang Haojin // dispatch queue full 748d2b20d1aSTang Haojin val IntDqStall = Value("IntDqStall") 749d2b20d1aSTang Haojin val FpDqStall = Value("FpDqStall") 750d2b20d1aSTang Haojin val LsDqStall = Value("LsDqStall") 751d2b20d1aSTang Haojin 752d2b20d1aSTang Haojin // memblock 753d2b20d1aSTang Haojin val LoadTLBStall = Value("LoadTLBStall") 754d2b20d1aSTang Haojin val LoadL1Stall = Value("LoadL1Stall") 755d2b20d1aSTang Haojin val LoadL2Stall = Value("LoadL2Stall") 756d2b20d1aSTang Haojin val LoadL3Stall = Value("LoadL3Stall") 757d2b20d1aSTang Haojin val LoadMemStall = Value("LoadMemStall") 758d2b20d1aSTang Haojin val StoreStall = Value("StoreStall") // include store tlb miss 759d2b20d1aSTang Haojin val AtomicStall = Value("AtomicStall") // atomic, load reserved, store conditional 760d2b20d1aSTang Haojin 761d2b20d1aSTang Haojin // xs replay (different to gem5) 762d2b20d1aSTang Haojin val LoadVioReplayStall = Value("LoadVioReplayStall") 763d2b20d1aSTang Haojin val LoadMSHRReplayStall = Value("LoadMSHRReplayStall") 764d2b20d1aSTang Haojin 765d2b20d1aSTang Haojin // bad speculation 766d2b20d1aSTang Haojin val ControlRecoveryStall = Value("ControlRecoveryStall") 767d2b20d1aSTang Haojin val MemVioRecoveryStall = Value("MemVioRecoveryStall") 768d2b20d1aSTang Haojin val OtherRecoveryStall = Value("OtherRecoveryStall") 769d2b20d1aSTang Haojin 770d2b20d1aSTang Haojin val FlushedInsts = Value("FlushedInsts") // control flushed, memvio flushed, others 771d2b20d1aSTang Haojin 772d2b20d1aSTang Haojin val OtherCoreStall = Value("OtherCoreStall") 773d2b20d1aSTang Haojin 774d2b20d1aSTang Haojin val NumStallReasons = Value("NumStallReasons") 775d2b20d1aSTang Haojin } 7769a2e6b8aSLinJiawei} 777