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*c379dcbeSZiyue-Zhang // bit encoding: | padding (2bit) || mop (2bit) | lumop(5bit) | 72*c379dcbeSZiyue-Zhang // only unit-stride use lumop 73*c379dcbeSZiyue-Zhang // mop [1:0] 74*c379dcbeSZiyue-Zhang // 0 0 : unit-stride 75*c379dcbeSZiyue-Zhang // 0 1 : indexed-unordered 76*c379dcbeSZiyue-Zhang // 1 0 : strided 77*c379dcbeSZiyue-Zhang // 1 1 : indexed-ordered 78*c379dcbeSZiyue-Zhang // lumop[4:0] 79*c379dcbeSZiyue-Zhang // 0 0 0 0 0 : unit-stride load 80*c379dcbeSZiyue-Zhang // 0 1 0 0 0 : unit-stride, whole register load 81*c379dcbeSZiyue-Zhang // 0 1 0 1 1 : unit-stride, mask load, EEW=8 82*c379dcbeSZiyue-Zhang // 1 0 0 0 0 : unit-stride fault-only-first 83*c379dcbeSZiyue-Zhang def vle = "b00_00_00000".U 84*c379dcbeSZiyue-Zhang def vlr = "b00_00_01000".U 85*c379dcbeSZiyue-Zhang def vlm = "b00_00_01011".U 86*c379dcbeSZiyue-Zhang def vleff = "b00_00_10000".U 87*c379dcbeSZiyue-Zhang def vluxe = "b00_01_00000".U 88*c379dcbeSZiyue-Zhang def vlse = "b00_10_00000".U 89*c379dcbeSZiyue-Zhang def vloxe = "b00_11_00000".U 907f2b7720SXuan Hu } 917f2b7720SXuan Hu 927f2b7720SXuan Hu object VstuType { 93*c379dcbeSZiyue-Zhang // bit encoding: | padding (2bit) || mop (2bit) | sumop(5bit) | 94*c379dcbeSZiyue-Zhang // only unit-stride use sumop 95*c379dcbeSZiyue-Zhang // mop [1:0] 96*c379dcbeSZiyue-Zhang // 0 0 : unit-stride 97*c379dcbeSZiyue-Zhang // 0 1 : indexed-unordered 98*c379dcbeSZiyue-Zhang // 1 0 : strided 99*c379dcbeSZiyue-Zhang // 1 1 : indexed-ordered 100*c379dcbeSZiyue-Zhang // sumop[4:0] 101*c379dcbeSZiyue-Zhang // 0 0 0 0 0 : unit-stride load 102*c379dcbeSZiyue-Zhang // 0 1 0 0 0 : unit-stride, whole register load 103*c379dcbeSZiyue-Zhang // 0 1 0 1 1 : unit-stride, mask load, EEW=8 104*c379dcbeSZiyue-Zhang def vse = "b00_00_00000".U 105*c379dcbeSZiyue-Zhang def vsr = "b00_00_01000".U 106*c379dcbeSZiyue-Zhang def vsm = "b00_00_01011".U 107*c379dcbeSZiyue-Zhang def vsuxe = "b00_01_00000".U 108*c379dcbeSZiyue-Zhang def vsse = "b00_10_00000".U 109*c379dcbeSZiyue-Zhang def vsoxe = "b00_11_00000".U 1107f2b7720SXuan Hu } 1117f2b7720SXuan Hu 112d6059658SZiyue Zhang object IF2VectorType { 113d6059658SZiyue Zhang // use last 3 bits for vsew 114d6059658SZiyue Zhang def i2vector = "b00_00".U 115d6059658SZiyue Zhang def f2vector = "b00_01".U 116d6059658SZiyue Zhang def imm2vector = "b00_10".U 117d6059658SZiyue Zhang def permImm2vector = "b00_11".U 118d6059658SZiyue Zhang } 119d6059658SZiyue Zhang 120a3edac52SYinan Xu object CommitType { 121c3abb8b6SYinan Xu def NORMAL = "b000".U // int/fp 122c3abb8b6SYinan Xu def BRANCH = "b001".U // branch 123c3abb8b6SYinan Xu def LOAD = "b010".U // load 124c3abb8b6SYinan Xu def STORE = "b011".U // store 125518d8658SYinan Xu 126c3abb8b6SYinan Xu def apply() = UInt(3.W) 127c3abb8b6SYinan Xu def isFused(commitType: UInt): Bool = commitType(2) 128c3abb8b6SYinan Xu def isLoadStore(commitType: UInt): Bool = !isFused(commitType) && commitType(1) 129c3abb8b6SYinan Xu def lsInstIsStore(commitType: UInt): Bool = commitType(0) 130c3abb8b6SYinan Xu def isStore(commitType: UInt): Bool = isLoadStore(commitType) && lsInstIsStore(commitType) 131c3abb8b6SYinan Xu def isBranch(commitType: UInt): Bool = commitType(0) && !commitType(1) && !isFused(commitType) 132518d8658SYinan Xu } 133bfb958a3SYinan Xu 134bfb958a3SYinan Xu object RedirectLevel { 1352d7c7105SYinan Xu def flushAfter = "b0".U 1362d7c7105SYinan Xu def flush = "b1".U 137bfb958a3SYinan Xu 1382d7c7105SYinan Xu def apply() = UInt(1.W) 1392d7c7105SYinan Xu // def isUnconditional(level: UInt) = level(1) 140bfb958a3SYinan Xu def flushItself(level: UInt) = level(0) 1412d7c7105SYinan Xu // def isException(level: UInt) = level(1) && level(0) 142bfb958a3SYinan Xu } 143baf8def6SYinan Xu 144baf8def6SYinan Xu object ExceptionVec { 145da3bf434SMaxpicca-Li val ExceptionVecSize = 16 146da3bf434SMaxpicca-Li def apply() = Vec(ExceptionVecSize, Bool()) 147baf8def6SYinan Xu } 148a8e04b1dSYinan Xu 149c60c1ab4SWilliam Wang object PMAMode { 1508d9a04fcSWilliam Wang def R = "b1".U << 0 //readable 1518d9a04fcSWilliam Wang def W = "b1".U << 1 //writeable 1528d9a04fcSWilliam Wang def X = "b1".U << 2 //executable 1538d9a04fcSWilliam Wang def I = "b1".U << 3 //cacheable: icache 1548d9a04fcSWilliam Wang def D = "b1".U << 4 //cacheable: dcache 1558d9a04fcSWilliam Wang def S = "b1".U << 5 //enable speculative access 156cff68e26SWilliam Wang def A = "b1".U << 6 //enable atomic operation, A imply R & W 1578d9a04fcSWilliam Wang def C = "b1".U << 7 //if it is cacheable is configable 158c60c1ab4SWilliam Wang def Reserved = "b0".U 159c60c1ab4SWilliam Wang 160c60c1ab4SWilliam Wang def apply() = UInt(7.W) 161c60c1ab4SWilliam Wang 162c60c1ab4SWilliam Wang def read(mode: UInt) = mode(0) 163c60c1ab4SWilliam Wang def write(mode: UInt) = mode(1) 164c60c1ab4SWilliam Wang def execute(mode: UInt) = mode(2) 165c60c1ab4SWilliam Wang def icache(mode: UInt) = mode(3) 166c60c1ab4SWilliam Wang def dcache(mode: UInt) = mode(4) 167c60c1ab4SWilliam Wang def speculate(mode: UInt) = mode(5) 168c60c1ab4SWilliam Wang def atomic(mode: UInt) = mode(6) 169c60c1ab4SWilliam Wang def configable_cache(mode: UInt) = mode(7) 170c60c1ab4SWilliam Wang 171c60c1ab4SWilliam Wang def strToMode(s: String) = { 172423b9255SWilliam Wang var result = 0.U(8.W) 173c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("R") >= 0) result = result + R 174c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("W") >= 0) result = result + W 175c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("X") >= 0) result = result + X 176c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("I") >= 0) result = result + I 177c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("D") >= 0) result = result + D 178c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("S") >= 0) result = result + S 179c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("A") >= 0) result = result + A 180c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("C") >= 0) result = result + C 181c60c1ab4SWilliam Wang result 182c60c1ab4SWilliam Wang } 183c60c1ab4SWilliam Wang } 1842225d46eSJiawei Lin 1852225d46eSJiawei Lin 1862225d46eSJiawei Lin object CSROpType { 1872225d46eSJiawei Lin def jmp = "b000".U 1882225d46eSJiawei Lin def wrt = "b001".U 1892225d46eSJiawei Lin def set = "b010".U 1902225d46eSJiawei Lin def clr = "b011".U 191b6900d94SYinan Xu def wfi = "b100".U 1922225d46eSJiawei Lin def wrti = "b101".U 1932225d46eSJiawei Lin def seti = "b110".U 1942225d46eSJiawei Lin def clri = "b111".U 1955d669833SYinan Xu def needAccess(op: UInt): Bool = op(1, 0) =/= 0.U 1962225d46eSJiawei Lin } 1972225d46eSJiawei Lin 1982225d46eSJiawei Lin // jump 1992225d46eSJiawei Lin object JumpOpType { 2002225d46eSJiawei Lin def jal = "b00".U 2012225d46eSJiawei Lin def jalr = "b01".U 2022225d46eSJiawei Lin def auipc = "b10".U 2032225d46eSJiawei Lin// def call = "b11_011".U 2042225d46eSJiawei Lin// def ret = "b11_100".U 2052225d46eSJiawei Lin def jumpOpisJalr(op: UInt) = op(0) 2062225d46eSJiawei Lin def jumpOpisAuipc(op: UInt) = op(1) 2072225d46eSJiawei Lin } 2082225d46eSJiawei Lin 2092225d46eSJiawei Lin object FenceOpType { 2102225d46eSJiawei Lin def fence = "b10000".U 2112225d46eSJiawei Lin def sfence = "b10001".U 2122225d46eSJiawei Lin def fencei = "b10010".U 213af2f7849Shappy-lx def nofence= "b00000".U 2142225d46eSJiawei Lin } 2152225d46eSJiawei Lin 2162225d46eSJiawei Lin object ALUOpType { 217ee8ff153Szfw // shift optype 218675acc68SYinan Xu def slliuw = "b000_0000".U // slliuw: ZEXT(src1[31:0]) << shamt 219675acc68SYinan Xu def sll = "b000_0001".U // sll: src1 << src2 220ee8ff153Szfw 221675acc68SYinan Xu def bclr = "b000_0010".U // bclr: src1 & ~(1 << src2[5:0]) 222675acc68SYinan Xu def bset = "b000_0011".U // bset: src1 | (1 << src2[5:0]) 223675acc68SYinan Xu def binv = "b000_0100".U // binv: src1 ^ ~(1 << src2[5:0]) 224ee8ff153Szfw 225675acc68SYinan Xu def srl = "b000_0101".U // srl: src1 >> src2 226675acc68SYinan Xu def bext = "b000_0110".U // bext: (src1 >> src2)[0] 227675acc68SYinan Xu def sra = "b000_0111".U // sra: src1 >> src2 (arithmetic) 228ee8ff153Szfw 2297b441e5eSYinan Xu def rol = "b000_1001".U // rol: (src1 << src2) | (src1 >> (xlen - src2)) 2307b441e5eSYinan Xu def ror = "b000_1011".U // ror: (src1 >> src2) | (src1 << (xlen - src2)) 231184a1958Szfw 232ee8ff153Szfw // RV64 32bit optype 233675acc68SYinan Xu def addw = "b001_0000".U // addw: SEXT((src1 + src2)[31:0]) 234675acc68SYinan Xu def oddaddw = "b001_0001".U // oddaddw: SEXT((src1[0] + src2)[31:0]) 235675acc68SYinan Xu def subw = "b001_0010".U // subw: SEXT((src1 - src2)[31:0]) 23654711376Ssinsanction def lui32addw = "b001_0011".U // lui32addw: SEXT(SEXT(src2[11:0], 32) + {src2[31:12], 12'b0}, 64) 237ee8ff153Szfw 238675acc68SYinan Xu def addwbit = "b001_0100".U // addwbit: (src1 + src2)[0] 239675acc68SYinan Xu def addwbyte = "b001_0101".U // addwbyte: (src1 + src2)[7:0] 240675acc68SYinan Xu def addwzexth = "b001_0110".U // addwzexth: ZEXT((src1 + src2)[15:0]) 241675acc68SYinan Xu def addwsexth = "b001_0111".U // addwsexth: SEXT((src1 + src2)[15:0]) 242ee8ff153Szfw 243675acc68SYinan Xu def sllw = "b001_1000".U // sllw: SEXT((src1 << src2)[31:0]) 244675acc68SYinan Xu def srlw = "b001_1001".U // srlw: SEXT((src1[31:0] >> src2)[31:0]) 245675acc68SYinan Xu def sraw = "b001_1010".U // sraw: SEXT((src1[31:0] >> src2)[31:0]) 246675acc68SYinan Xu def rolw = "b001_1100".U 247675acc68SYinan Xu def rorw = "b001_1101".U 248675acc68SYinan Xu 249675acc68SYinan Xu // ADD-op 250675acc68SYinan Xu def adduw = "b010_0000".U // adduw: src1[31:0] + src2 251675acc68SYinan Xu def add = "b010_0001".U // add: src1 + src2 252675acc68SYinan Xu def oddadd = "b010_0010".U // oddadd: src1[0] + src2 253fe528fd6Ssinsanction def lui32add = "b010_0011".U // lui32add: SEXT(src2[11:0]) + {src2[63:12], 12'b0} 254675acc68SYinan Xu 255675acc68SYinan Xu def sr29add = "b010_0100".U // sr29add: src1[63:29] + src2 256675acc68SYinan Xu def sr30add = "b010_0101".U // sr30add: src1[63:30] + src2 257675acc68SYinan Xu def sr31add = "b010_0110".U // sr31add: src1[63:31] + src2 258675acc68SYinan Xu def sr32add = "b010_0111".U // sr32add: src1[63:32] + src2 259675acc68SYinan Xu 260675acc68SYinan Xu def sh1adduw = "b010_1000".U // sh1adduw: {src1[31:0], 1'b0} + src2 261675acc68SYinan Xu def sh1add = "b010_1001".U // sh1add: {src1[62:0], 1'b0} + src2 262675acc68SYinan Xu def sh2adduw = "b010_1010".U // sh2add_uw: {src1[31:0], 2'b0} + src2 263675acc68SYinan Xu def sh2add = "b010_1011".U // sh2add: {src1[61:0], 2'b0} + src2 264675acc68SYinan Xu def sh3adduw = "b010_1100".U // sh3add_uw: {src1[31:0], 3'b0} + src2 265675acc68SYinan Xu def sh3add = "b010_1101".U // sh3add: {src1[60:0], 3'b0} + src2 266675acc68SYinan Xu def sh4add = "b010_1111".U // sh4add: {src1[59:0], 4'b0} + src2 267675acc68SYinan Xu 268675acc68SYinan Xu // SUB-op: src1 - src2 269675acc68SYinan Xu def sub = "b011_0000".U 270675acc68SYinan Xu def sltu = "b011_0001".U 271675acc68SYinan Xu def slt = "b011_0010".U 272675acc68SYinan Xu def maxu = "b011_0100".U 273675acc68SYinan Xu def minu = "b011_0101".U 274675acc68SYinan Xu def max = "b011_0110".U 275675acc68SYinan Xu def min = "b011_0111".U 276675acc68SYinan Xu 277675acc68SYinan Xu // branch 278675acc68SYinan Xu def beq = "b111_0000".U 279675acc68SYinan Xu def bne = "b111_0010".U 280675acc68SYinan Xu def blt = "b111_1000".U 281675acc68SYinan Xu def bge = "b111_1010".U 282675acc68SYinan Xu def bltu = "b111_1100".U 283675acc68SYinan Xu def bgeu = "b111_1110".U 284675acc68SYinan Xu 285675acc68SYinan Xu // misc optype 286675acc68SYinan Xu def and = "b100_0000".U 287675acc68SYinan Xu def andn = "b100_0001".U 288675acc68SYinan Xu def or = "b100_0010".U 289675acc68SYinan Xu def orn = "b100_0011".U 290675acc68SYinan Xu def xor = "b100_0100".U 291675acc68SYinan Xu def xnor = "b100_0101".U 292675acc68SYinan Xu def orcb = "b100_0110".U 293675acc68SYinan Xu 294675acc68SYinan Xu def sextb = "b100_1000".U 295675acc68SYinan Xu def packh = "b100_1001".U 296675acc68SYinan Xu def sexth = "b100_1010".U 297675acc68SYinan Xu def packw = "b100_1011".U 298675acc68SYinan Xu 299675acc68SYinan Xu def revb = "b101_0000".U 300675acc68SYinan Xu def rev8 = "b101_0001".U 301675acc68SYinan Xu def pack = "b101_0010".U 302675acc68SYinan Xu def orh48 = "b101_0011".U 303675acc68SYinan Xu 304675acc68SYinan Xu def szewl1 = "b101_1000".U 305675acc68SYinan Xu def szewl2 = "b101_1001".U 306675acc68SYinan Xu def szewl3 = "b101_1010".U 307675acc68SYinan Xu def byte2 = "b101_1011".U 308675acc68SYinan Xu 309675acc68SYinan Xu def andlsb = "b110_0000".U 310675acc68SYinan Xu def andzexth = "b110_0001".U 311675acc68SYinan Xu def orlsb = "b110_0010".U 312675acc68SYinan Xu def orzexth = "b110_0011".U 313675acc68SYinan Xu def xorlsb = "b110_0100".U 314675acc68SYinan Xu def xorzexth = "b110_0101".U 315675acc68SYinan Xu def orcblsb = "b110_0110".U 316675acc68SYinan Xu def orcbzexth = "b110_0111".U 317675acc68SYinan Xu 318675acc68SYinan Xu def isAddw(func: UInt) = func(6, 4) === "b001".U && !func(3) && !func(1) 319675acc68SYinan Xu def isSimpleLogic(func: UInt) = func(6, 4) === "b100".U && !func(0) 320675acc68SYinan Xu def logicToLsb(func: UInt) = Cat("b110".U(3.W), func(3, 1), 0.U(1.W)) 321675acc68SYinan Xu def logicToZexth(func: UInt) = Cat("b110".U(3.W), func(3, 1), 1.U(1.W)) 322675acc68SYinan Xu 32357a10886SXuan Hu def apply() = UInt(FuOpTypeWidth.W) 3242225d46eSJiawei Lin } 3252225d46eSJiawei Lin 326d91483a6Sfdy object VSETOpType { 327a8db15d8Sfdy val setVlmaxBit = 0 328a8db15d8Sfdy val keepVlBit = 1 329a8db15d8Sfdy // destTypeBit == 0: write vl to rd 330a8db15d8Sfdy // destTypeBit == 1: write vconfig 331a8db15d8Sfdy val destTypeBit = 5 332a8db15d8Sfdy 333a32c56f4SXuan Hu // vsetvli's uop 334a32c56f4SXuan Hu // rs1!=x0, normal 335a32c56f4SXuan Hu // uop0: r(rs1), w(vconfig) | x[rs1],vtypei -> vconfig 336a32c56f4SXuan Hu // uop1: r(rs1), w(rd) | x[rs1],vtypei -> x[rd] 337a32c56f4SXuan Hu def uvsetvcfg_xi = "b1010_0000".U 338a32c56f4SXuan Hu def uvsetrd_xi = "b1000_0000".U 339a32c56f4SXuan Hu // rs1==x0, rd!=x0, set vl to vlmax, set rd to vlmax, set vtype 340a32c56f4SXuan Hu // uop0: w(vconfig) | vlmax, vtypei -> vconfig 341a32c56f4SXuan Hu // uop1: w(rd) | vlmax, vtypei -> x[rd] 342a32c56f4SXuan Hu def uvsetvcfg_vlmax_i = "b1010_0001".U 343a32c56f4SXuan Hu def uvsetrd_vlmax_i = "b1000_0001".U 344a32c56f4SXuan Hu // rs1==x0, rd==x0, keep vl, set vtype 345a32c56f4SXuan Hu // uop0: r(vconfig), w(vconfig) | ld_vconfig.vl, vtypei -> vconfig 346a32c56f4SXuan Hu def uvsetvcfg_keep_v = "b1010_0010".U 347d91483a6Sfdy 348a32c56f4SXuan Hu // vsetvl's uop 349a32c56f4SXuan Hu // rs1!=x0, normal 350a32c56f4SXuan Hu // uop0: r(rs1,rs2), w(vconfig) | x[rs1],x[rs2] -> vconfig 351a32c56f4SXuan Hu // uop1: r(rs1,rs2), w(rd) | x[rs1],x[rs2] -> x[rd] 352a32c56f4SXuan Hu def uvsetvcfg_xx = "b0110_0000".U 353a32c56f4SXuan Hu def uvsetrd_xx = "b0100_0000".U 354a32c56f4SXuan Hu // rs1==x0, rd!=x0, set vl to vlmax, set rd to vlmax, set vtype 355a32c56f4SXuan Hu // uop0: r(rs2), w(vconfig) | vlmax, vtypei -> vconfig 356a32c56f4SXuan Hu // uop1: r(rs2), w(rd) | vlmax, vtypei -> x[rd] 357a32c56f4SXuan Hu def uvsetvcfg_vlmax_x = "b0110_0001".U 358a32c56f4SXuan Hu def uvsetrd_vlmax_x = "b0100_0001".U 359a32c56f4SXuan Hu // rs1==x0, rd==x0, keep vl, set vtype 360a32c56f4SXuan Hu // uop0: r(rs2), w(vtmp) | x[rs2] -> vtmp 361a32c56f4SXuan Hu // uop0: r(vconfig,vtmp), w(vconfig) | old_vconfig.vl, vtmp -> vconfig 362a32c56f4SXuan Hu def uvmv_v_x = "b0110_0010".U 363a32c56f4SXuan Hu def uvsetvcfg_vv = "b0111_0010".U 364a32c56f4SXuan Hu 365a32c56f4SXuan Hu // vsetivli's uop 366a32c56f4SXuan Hu // uop0: w(vconfig) | vli, vtypei -> vconfig 367a32c56f4SXuan Hu // uop1: w(rd) | vli, vtypei -> x[rd] 368a32c56f4SXuan Hu def uvsetvcfg_ii = "b0010_0000".U 369a32c56f4SXuan Hu def uvsetrd_ii = "b0000_0000".U 370a32c56f4SXuan Hu 371a32c56f4SXuan Hu def isVsetvl (func: UInt) = func(6) 372a32c56f4SXuan Hu def isVsetvli (func: UInt) = func(7) 373a32c56f4SXuan Hu def isVsetivli(func: UInt) = func(7, 6) === 0.U 374a32c56f4SXuan Hu def isNormal (func: UInt) = func(1, 0) === 0.U 375a8db15d8Sfdy def isSetVlmax(func: UInt) = func(setVlmaxBit) 376a8db15d8Sfdy def isKeepVl (func: UInt) = func(keepVlBit) 377a32c56f4SXuan Hu // RG: region 378a32c56f4SXuan Hu def writeIntRG(func: UInt) = !func(5) 379a32c56f4SXuan Hu def writeVecRG(func: UInt) = func(5) 380a32c56f4SXuan Hu def readIntRG (func: UInt) = !func(4) 381a32c56f4SXuan Hu def readVecRG (func: UInt) = func(4) 382a8db15d8Sfdy // modify fuOpType 383a8db15d8Sfdy def switchDest(func: UInt) = func ^ (1 << destTypeBit).U 384a8db15d8Sfdy def keepVl(func: UInt) = func | (1 << keepVlBit).U 385a8db15d8Sfdy def setVlmax(func: UInt) = func | (1 << setVlmaxBit).U 386d91483a6Sfdy } 387d91483a6Sfdy 3883b739f49SXuan Hu object BRUOpType { 3893b739f49SXuan Hu // branch 3903b739f49SXuan Hu def beq = "b000_000".U 3913b739f49SXuan Hu def bne = "b000_001".U 3923b739f49SXuan Hu def blt = "b000_100".U 3933b739f49SXuan Hu def bge = "b000_101".U 3943b739f49SXuan Hu def bltu = "b001_000".U 3953b739f49SXuan Hu def bgeu = "b001_001".U 3963b739f49SXuan Hu 3973b739f49SXuan Hu def getBranchType(func: UInt) = func(3, 1) 3983b739f49SXuan Hu def isBranchInvert(func: UInt) = func(0) 3993b739f49SXuan Hu } 4003b739f49SXuan Hu 4013b739f49SXuan Hu object MULOpType { 4023b739f49SXuan Hu // mul 4033b739f49SXuan Hu // bit encoding: | type (2bit) | isWord(1bit) | opcode(2bit) | 4043b739f49SXuan Hu def mul = "b00000".U 4053b739f49SXuan Hu def mulh = "b00001".U 4063b739f49SXuan Hu def mulhsu = "b00010".U 4073b739f49SXuan Hu def mulhu = "b00011".U 4083b739f49SXuan Hu def mulw = "b00100".U 4093b739f49SXuan Hu 4103b739f49SXuan Hu def mulw7 = "b01100".U 4113b739f49SXuan Hu def isSign(op: UInt) = !op(1) 4123b739f49SXuan Hu def isW(op: UInt) = op(2) 4133b739f49SXuan Hu def isH(op: UInt) = op(1, 0) =/= 0.U 4143b739f49SXuan Hu def getOp(op: UInt) = Cat(op(3), op(1, 0)) 4153b739f49SXuan Hu } 4163b739f49SXuan Hu 4173b739f49SXuan Hu object DIVOpType { 4183b739f49SXuan Hu // div 4193b739f49SXuan Hu // bit encoding: | type (2bit) | isWord(1bit) | isSign(1bit) | opcode(1bit) | 4203b739f49SXuan Hu def div = "b10000".U 4213b739f49SXuan Hu def divu = "b10010".U 4223b739f49SXuan Hu def rem = "b10001".U 4233b739f49SXuan Hu def remu = "b10011".U 4243b739f49SXuan Hu 4253b739f49SXuan Hu def divw = "b10100".U 4263b739f49SXuan Hu def divuw = "b10110".U 4273b739f49SXuan Hu def remw = "b10101".U 4283b739f49SXuan Hu def remuw = "b10111".U 4293b739f49SXuan Hu 4303b739f49SXuan Hu def isSign(op: UInt) = !op(1) 4313b739f49SXuan Hu def isW(op: UInt) = op(2) 4323b739f49SXuan Hu def isH(op: UInt) = op(0) 4333b739f49SXuan Hu } 4343b739f49SXuan Hu 4352225d46eSJiawei Lin object MDUOpType { 4362225d46eSJiawei Lin // mul 4372225d46eSJiawei Lin // bit encoding: | type (2bit) | isWord(1bit) | opcode(2bit) | 4382225d46eSJiawei Lin def mul = "b00000".U 4392225d46eSJiawei Lin def mulh = "b00001".U 4402225d46eSJiawei Lin def mulhsu = "b00010".U 4412225d46eSJiawei Lin def mulhu = "b00011".U 4422225d46eSJiawei Lin def mulw = "b00100".U 4432225d46eSJiawei Lin 44488825c5cSYinan Xu def mulw7 = "b01100".U 44588825c5cSYinan Xu 4462225d46eSJiawei Lin // div 4472225d46eSJiawei Lin // bit encoding: | type (2bit) | isWord(1bit) | isSign(1bit) | opcode(1bit) | 44888825c5cSYinan Xu def div = "b10000".U 44988825c5cSYinan Xu def divu = "b10010".U 45088825c5cSYinan Xu def rem = "b10001".U 45188825c5cSYinan Xu def remu = "b10011".U 4522225d46eSJiawei Lin 45388825c5cSYinan Xu def divw = "b10100".U 45488825c5cSYinan Xu def divuw = "b10110".U 45588825c5cSYinan Xu def remw = "b10101".U 45688825c5cSYinan Xu def remuw = "b10111".U 4572225d46eSJiawei Lin 45888825c5cSYinan Xu def isMul(op: UInt) = !op(4) 45988825c5cSYinan Xu def isDiv(op: UInt) = op(4) 4602225d46eSJiawei Lin 4612225d46eSJiawei Lin def isDivSign(op: UInt) = isDiv(op) && !op(1) 4622225d46eSJiawei Lin def isW(op: UInt) = op(2) 4632225d46eSJiawei Lin def isH(op: UInt) = (isDiv(op) && op(0)) || (isMul(op) && op(1, 0) =/= 0.U) 4642225d46eSJiawei Lin def getMulOp(op: UInt) = op(1, 0) 4652225d46eSJiawei Lin } 4662225d46eSJiawei Lin 4672225d46eSJiawei Lin object LSUOpType { 468d200f594SWilliam Wang // load pipeline 4692225d46eSJiawei Lin 470d200f594SWilliam Wang // normal load 471d200f594SWilliam Wang // Note: bit(1, 0) are size, DO NOT CHANGE 472d200f594SWilliam Wang // bit encoding: | load 0 | is unsigned(1bit) | size(2bit) | 473d200f594SWilliam Wang def lb = "b0000".U 474d200f594SWilliam Wang def lh = "b0001".U 475d200f594SWilliam Wang def lw = "b0010".U 476d200f594SWilliam Wang def ld = "b0011".U 477d200f594SWilliam Wang def lbu = "b0100".U 478d200f594SWilliam Wang def lhu = "b0101".U 479d200f594SWilliam Wang def lwu = "b0110".U 480ca18a0b4SWilliam Wang 481d200f594SWilliam Wang // Zicbop software prefetch 482d200f594SWilliam Wang // bit encoding: | prefetch 1 | 0 | prefetch type (2bit) | 483d200f594SWilliam Wang def prefetch_i = "b1000".U // TODO 484d200f594SWilliam Wang def prefetch_r = "b1001".U 485d200f594SWilliam Wang def prefetch_w = "b1010".U 486ca18a0b4SWilliam Wang 487d200f594SWilliam Wang def isPrefetch(op: UInt): Bool = op(3) 488d200f594SWilliam Wang 489d200f594SWilliam Wang // store pipeline 490d200f594SWilliam Wang // normal store 491d200f594SWilliam Wang // bit encoding: | store 00 | size(2bit) | 492d200f594SWilliam Wang def sb = "b0000".U 493d200f594SWilliam Wang def sh = "b0001".U 494d200f594SWilliam Wang def sw = "b0010".U 495d200f594SWilliam Wang def sd = "b0011".U 496d200f594SWilliam Wang 497d200f594SWilliam Wang // l1 cache op 498d200f594SWilliam Wang // bit encoding: | cbo_zero 01 | size(2bit) 11 | 499d200f594SWilliam Wang def cbo_zero = "b0111".U 500d200f594SWilliam Wang 501d200f594SWilliam Wang // llc op 502d200f594SWilliam Wang // bit encoding: | prefetch 11 | suboptype(2bit) | 503d200f594SWilliam Wang def cbo_clean = "b1100".U 504d200f594SWilliam Wang def cbo_flush = "b1101".U 505d200f594SWilliam Wang def cbo_inval = "b1110".U 506d200f594SWilliam Wang 507d200f594SWilliam Wang def isCbo(op: UInt): Bool = op(3, 2) === "b11".U 5082225d46eSJiawei Lin 5092225d46eSJiawei Lin // atomics 5102225d46eSJiawei Lin // bit(1, 0) are size 5112225d46eSJiawei Lin // since atomics use a different fu type 5122225d46eSJiawei Lin // so we can safely reuse other load/store's encodings 513d200f594SWilliam Wang // bit encoding: | optype(4bit) | size (2bit) | 5142225d46eSJiawei Lin def lr_w = "b000010".U 5152225d46eSJiawei Lin def sc_w = "b000110".U 5162225d46eSJiawei Lin def amoswap_w = "b001010".U 5172225d46eSJiawei Lin def amoadd_w = "b001110".U 5182225d46eSJiawei Lin def amoxor_w = "b010010".U 5192225d46eSJiawei Lin def amoand_w = "b010110".U 5202225d46eSJiawei Lin def amoor_w = "b011010".U 5212225d46eSJiawei Lin def amomin_w = "b011110".U 5222225d46eSJiawei Lin def amomax_w = "b100010".U 5232225d46eSJiawei Lin def amominu_w = "b100110".U 5242225d46eSJiawei Lin def amomaxu_w = "b101010".U 5252225d46eSJiawei Lin 5262225d46eSJiawei Lin def lr_d = "b000011".U 5272225d46eSJiawei Lin def sc_d = "b000111".U 5282225d46eSJiawei Lin def amoswap_d = "b001011".U 5292225d46eSJiawei Lin def amoadd_d = "b001111".U 5302225d46eSJiawei Lin def amoxor_d = "b010011".U 5312225d46eSJiawei Lin def amoand_d = "b010111".U 5322225d46eSJiawei Lin def amoor_d = "b011011".U 5332225d46eSJiawei Lin def amomin_d = "b011111".U 5342225d46eSJiawei Lin def amomax_d = "b100011".U 5352225d46eSJiawei Lin def amominu_d = "b100111".U 5362225d46eSJiawei Lin def amomaxu_d = "b101011".U 537b6982e83SLemover 538b6982e83SLemover def size(op: UInt) = op(1,0) 5392225d46eSJiawei Lin } 5402225d46eSJiawei Lin 5413feeca58Szfw object BKUOpType { 542ee8ff153Szfw 5433feeca58Szfw def clmul = "b000000".U 5443feeca58Szfw def clmulh = "b000001".U 5453feeca58Szfw def clmulr = "b000010".U 5463feeca58Szfw def xpermn = "b000100".U 5473feeca58Szfw def xpermb = "b000101".U 548ee8ff153Szfw 5493feeca58Szfw def clz = "b001000".U 5503feeca58Szfw def clzw = "b001001".U 5513feeca58Szfw def ctz = "b001010".U 5523feeca58Szfw def ctzw = "b001011".U 5533feeca58Szfw def cpop = "b001100".U 5543feeca58Szfw def cpopw = "b001101".U 55507596dc6Szfw 5563feeca58Szfw // 01xxxx is reserve 5573feeca58Szfw def aes64es = "b100000".U 5583feeca58Szfw def aes64esm = "b100001".U 5593feeca58Szfw def aes64ds = "b100010".U 5603feeca58Szfw def aes64dsm = "b100011".U 5613feeca58Szfw def aes64im = "b100100".U 5623feeca58Szfw def aes64ks1i = "b100101".U 5633feeca58Szfw def aes64ks2 = "b100110".U 5643feeca58Szfw 5653feeca58Szfw // merge to two instruction sm4ks & sm4ed 56619bcce38SFawang Zhang def sm4ed0 = "b101000".U 56719bcce38SFawang Zhang def sm4ed1 = "b101001".U 56819bcce38SFawang Zhang def sm4ed2 = "b101010".U 56919bcce38SFawang Zhang def sm4ed3 = "b101011".U 57019bcce38SFawang Zhang def sm4ks0 = "b101100".U 57119bcce38SFawang Zhang def sm4ks1 = "b101101".U 57219bcce38SFawang Zhang def sm4ks2 = "b101110".U 57319bcce38SFawang Zhang def sm4ks3 = "b101111".U 5743feeca58Szfw 5753feeca58Szfw def sha256sum0 = "b110000".U 5763feeca58Szfw def sha256sum1 = "b110001".U 5773feeca58Szfw def sha256sig0 = "b110010".U 5783feeca58Szfw def sha256sig1 = "b110011".U 5793feeca58Szfw def sha512sum0 = "b110100".U 5803feeca58Szfw def sha512sum1 = "b110101".U 5813feeca58Szfw def sha512sig0 = "b110110".U 5823feeca58Szfw def sha512sig1 = "b110111".U 5833feeca58Szfw 5843feeca58Szfw def sm3p0 = "b111000".U 5853feeca58Szfw def sm3p1 = "b111001".U 586ee8ff153Szfw } 587ee8ff153Szfw 5882225d46eSJiawei Lin object BTBtype { 5892225d46eSJiawei Lin def B = "b00".U // branch 5902225d46eSJiawei Lin def J = "b01".U // jump 5912225d46eSJiawei Lin def I = "b10".U // indirect 5922225d46eSJiawei Lin def R = "b11".U // return 5932225d46eSJiawei Lin 5942225d46eSJiawei Lin def apply() = UInt(2.W) 5952225d46eSJiawei Lin } 5962225d46eSJiawei Lin 5972225d46eSJiawei Lin object SelImm { 598ee8ff153Szfw def IMM_X = "b0111".U 599d91483a6Sfdy def IMM_S = "b1110".U 600ee8ff153Szfw def IMM_SB = "b0001".U 601ee8ff153Szfw def IMM_U = "b0010".U 602ee8ff153Szfw def IMM_UJ = "b0011".U 603ee8ff153Szfw def IMM_I = "b0100".U 604ee8ff153Szfw def IMM_Z = "b0101".U 605ee8ff153Szfw def INVALID_INSTR = "b0110".U 606ee8ff153Szfw def IMM_B6 = "b1000".U 6072225d46eSJiawei Lin 60858c35d23Shuxuan0307 def IMM_OPIVIS = "b1001".U 60958c35d23Shuxuan0307 def IMM_OPIVIU = "b1010".U 610912e2179SXuan Hu def IMM_VSETVLI = "b1100".U 611912e2179SXuan Hu def IMM_VSETIVLI = "b1101".U 612fe528fd6Ssinsanction def IMM_LUI32 = "b1011".U 61358c35d23Shuxuan0307 61457a10886SXuan Hu def X = BitPat("b0000") 6156e7c9679Shuxuan0307 616ee8ff153Szfw def apply() = UInt(4.W) 6170655b1a0SXuan Hu 6180655b1a0SXuan Hu def mkString(immType: UInt) : String = { 6190655b1a0SXuan Hu val strMap = Map( 6200655b1a0SXuan Hu IMM_S.litValue -> "S", 6210655b1a0SXuan Hu IMM_SB.litValue -> "SB", 6220655b1a0SXuan Hu IMM_U.litValue -> "U", 6230655b1a0SXuan Hu IMM_UJ.litValue -> "UJ", 6240655b1a0SXuan Hu IMM_I.litValue -> "I", 6250655b1a0SXuan Hu IMM_Z.litValue -> "Z", 6260655b1a0SXuan Hu IMM_B6.litValue -> "B6", 6270655b1a0SXuan Hu IMM_OPIVIS.litValue -> "VIS", 6280655b1a0SXuan Hu IMM_OPIVIU.litValue -> "VIU", 6290655b1a0SXuan Hu IMM_VSETVLI.litValue -> "VSETVLI", 6300655b1a0SXuan Hu IMM_VSETIVLI.litValue -> "VSETIVLI", 631fe528fd6Ssinsanction IMM_LUI32.litValue -> "LUI32", 6320655b1a0SXuan Hu INVALID_INSTR.litValue -> "INVALID", 6330655b1a0SXuan Hu ) 6340655b1a0SXuan Hu strMap(immType.litValue) 6350655b1a0SXuan Hu } 6362225d46eSJiawei Lin } 6372225d46eSJiawei Lin 638e2695e90SzhanglyGit object UopSplitType { 639d91483a6Sfdy def SCA_SIM = "b000000".U // 640d91483a6Sfdy def DIR = "b010001".U // dirty: vset 641d91483a6Sfdy def VEC_VVV = "b010010".U // VEC_VVV 642d91483a6Sfdy def VEC_VXV = "b010011".U // VEC_VXV 643d91483a6Sfdy def VEC_0XV = "b010100".U // VEC_0XV 644d91483a6Sfdy def VEC_VVW = "b010101".U // VEC_VVW 645d91483a6Sfdy def VEC_WVW = "b010110".U // VEC_WVW 646d91483a6Sfdy def VEC_VXW = "b010111".U // VEC_VXW 647d91483a6Sfdy def VEC_WXW = "b011000".U // VEC_WXW 648d91483a6Sfdy def VEC_WVV = "b011001".U // VEC_WVV 649d91483a6Sfdy def VEC_WXV = "b011010".U // VEC_WXV 650d91483a6Sfdy def VEC_EXT2 = "b011011".U // VF2 0 -> V 651d91483a6Sfdy def VEC_EXT4 = "b011100".U // VF4 0 -> V 652d91483a6Sfdy def VEC_EXT8 = "b011101".U // VF8 0 -> V 653d91483a6Sfdy def VEC_VVM = "b011110".U // VEC_VVM 654d91483a6Sfdy def VEC_VXM = "b011111".U // VEC_VXM 655d91483a6Sfdy def VEC_SLIDE1UP = "b100000".U // vslide1up.vx 656d91483a6Sfdy def VEC_FSLIDE1UP = "b100001".U // vfslide1up.vf 657d91483a6Sfdy def VEC_SLIDE1DOWN = "b100010".U // vslide1down.vx 658d91483a6Sfdy def VEC_FSLIDE1DOWN = "b100011".U // vfslide1down.vf 659d91483a6Sfdy def VEC_VRED = "b100100".U // VEC_VRED 660d91483a6Sfdy def VEC_SLIDEUP = "b100101".U // VEC_SLIDEUP 661d91483a6Sfdy def VEC_SLIDEDOWN = "b100111".U // VEC_SLIDEDOWN 662d91483a6Sfdy def VEC_M0X = "b101001".U // VEC_M0X 0MV 663d91483a6Sfdy def VEC_MVV = "b101010".U // VEC_MVV VMV 664d91483a6Sfdy def VEC_M0X_VFIRST = "b101011".U // 66584260280Sczw def VEC_VWW = "b101100".U // 66665df1368Sczw def VEC_RGATHER = "b101101".U // vrgather.vv, vrgather.vi 66765df1368Sczw def VEC_RGATHER_VX = "b101110".U // vrgather.vx 66865df1368Sczw def VEC_RGATHEREI16 = "b101111".U // vrgatherei16.vv 669adf68ff3Sczw def VEC_COMPRESS = "b110000".U // vcompress.vm 670c4501a6fSZiyue-Zhang def VEC_US_LDST = "b110001".U // vector unit-strided load/store 671c4501a6fSZiyue-Zhang def VEC_S_LDST = "b110010".U // vector strided load/store 672c4501a6fSZiyue-Zhang def VEC_I_LDST = "b110011".U // vector indexed load/store 673684d7aceSxiaofeibao-xjtu def VEC_VFV = "b111000".U // VEC_VFV 6743748ec56Sxiaofeibao-xjtu def VEC_VFW = "b111001".U // VEC_VFW 6753748ec56Sxiaofeibao-xjtu def VEC_WFW = "b111010".U // VEC_WVW 676f06d6d60Sxiaofeibao-xjtu def VEC_VFM = "b111011".U // VEC_VFM 677582849ffSxiaofeibao-xjtu def VEC_VFRED = "b111100".U // VEC_VFRED 678b94b1889Sxiaofeibao-xjtu def VEC_VFREDOSUM = "b111101".U // VEC_VFREDOSUM 679d91483a6Sfdy def VEC_M0M = "b000000".U // VEC_M0M 680d91483a6Sfdy def VEC_MMM = "b000000".U // VEC_MMM 6810a34fc22SZiyue Zhang def VEC_MVNR = "b000100".U // vmvnr 682d91483a6Sfdy def dummy = "b111111".U 683d91483a6Sfdy 684d91483a6Sfdy def X = BitPat("b000000") 685d91483a6Sfdy 686d91483a6Sfdy def apply() = UInt(6.W) 687e2695e90SzhanglyGit def needSplit(UopSplitType: UInt) = UopSplitType(4) || UopSplitType(5) 688d91483a6Sfdy } 689d91483a6Sfdy 6906ab6918fSYinan Xu object ExceptionNO { 6916ab6918fSYinan Xu def instrAddrMisaligned = 0 6926ab6918fSYinan Xu def instrAccessFault = 1 6936ab6918fSYinan Xu def illegalInstr = 2 6946ab6918fSYinan Xu def breakPoint = 3 6956ab6918fSYinan Xu def loadAddrMisaligned = 4 6966ab6918fSYinan Xu def loadAccessFault = 5 6976ab6918fSYinan Xu def storeAddrMisaligned = 6 6986ab6918fSYinan Xu def storeAccessFault = 7 6996ab6918fSYinan Xu def ecallU = 8 7006ab6918fSYinan Xu def ecallS = 9 7016ab6918fSYinan Xu def ecallM = 11 7026ab6918fSYinan Xu def instrPageFault = 12 7036ab6918fSYinan Xu def loadPageFault = 13 7046ab6918fSYinan Xu // def singleStep = 14 7056ab6918fSYinan Xu def storePageFault = 15 7066ab6918fSYinan Xu def priorities = Seq( 7076ab6918fSYinan Xu breakPoint, // TODO: different BP has different priority 7086ab6918fSYinan Xu instrPageFault, 7096ab6918fSYinan Xu instrAccessFault, 7106ab6918fSYinan Xu illegalInstr, 7116ab6918fSYinan Xu instrAddrMisaligned, 7126ab6918fSYinan Xu ecallM, ecallS, ecallU, 713d880177dSYinan Xu storeAddrMisaligned, 714d880177dSYinan Xu loadAddrMisaligned, 7156ab6918fSYinan Xu storePageFault, 7166ab6918fSYinan Xu loadPageFault, 7176ab6918fSYinan Xu storeAccessFault, 718d880177dSYinan Xu loadAccessFault 7196ab6918fSYinan Xu ) 7206ab6918fSYinan Xu def all = priorities.distinct.sorted 7216ab6918fSYinan Xu def frontendSet = Seq( 7226ab6918fSYinan Xu instrAddrMisaligned, 7236ab6918fSYinan Xu instrAccessFault, 7246ab6918fSYinan Xu illegalInstr, 7256ab6918fSYinan Xu instrPageFault 7266ab6918fSYinan Xu ) 7276ab6918fSYinan Xu def partialSelect(vec: Vec[Bool], select: Seq[Int]): Vec[Bool] = { 7286ab6918fSYinan Xu val new_vec = Wire(ExceptionVec()) 7296ab6918fSYinan Xu new_vec.foreach(_ := false.B) 7306ab6918fSYinan Xu select.foreach(i => new_vec(i) := vec(i)) 7316ab6918fSYinan Xu new_vec 7326ab6918fSYinan Xu } 7336ab6918fSYinan Xu def selectFrontend(vec: Vec[Bool]): Vec[Bool] = partialSelect(vec, frontendSet) 7346ab6918fSYinan Xu def selectAll(vec: Vec[Bool]): Vec[Bool] = partialSelect(vec, ExceptionNO.all) 7356ab6918fSYinan Xu def selectByFu(vec:Vec[Bool], fuConfig: FuConfig): Vec[Bool] = 7366ab6918fSYinan Xu partialSelect(vec, fuConfig.exceptionOut) 7376ab6918fSYinan Xu } 7386ab6918fSYinan Xu 739d2b20d1aSTang Haojin object TopDownCounters extends Enumeration { 740d2b20d1aSTang Haojin val NoStall = Value("NoStall") // Base 741d2b20d1aSTang Haojin // frontend 742d2b20d1aSTang Haojin val OverrideBubble = Value("OverrideBubble") 743d2b20d1aSTang Haojin val FtqUpdateBubble = Value("FtqUpdateBubble") 744d2b20d1aSTang Haojin // val ControlRedirectBubble = Value("ControlRedirectBubble") 745d2b20d1aSTang Haojin val TAGEMissBubble = Value("TAGEMissBubble") 746d2b20d1aSTang Haojin val SCMissBubble = Value("SCMissBubble") 747d2b20d1aSTang Haojin val ITTAGEMissBubble = Value("ITTAGEMissBubble") 748d2b20d1aSTang Haojin val RASMissBubble = Value("RASMissBubble") 749d2b20d1aSTang Haojin val MemVioRedirectBubble = Value("MemVioRedirectBubble") 750d2b20d1aSTang Haojin val OtherRedirectBubble = Value("OtherRedirectBubble") 751d2b20d1aSTang Haojin val FtqFullStall = Value("FtqFullStall") 752d2b20d1aSTang Haojin 753d2b20d1aSTang Haojin val ICacheMissBubble = Value("ICacheMissBubble") 754d2b20d1aSTang Haojin val ITLBMissBubble = Value("ITLBMissBubble") 755d2b20d1aSTang Haojin val BTBMissBubble = Value("BTBMissBubble") 756d2b20d1aSTang Haojin val FetchFragBubble = Value("FetchFragBubble") 757d2b20d1aSTang Haojin 758d2b20d1aSTang Haojin // backend 759d2b20d1aSTang Haojin // long inst stall at rob head 760d2b20d1aSTang Haojin val DivStall = Value("DivStall") // int div, float div/sqrt 761d2b20d1aSTang Haojin val IntNotReadyStall = Value("IntNotReadyStall") // int-inst at rob head not issue 762d2b20d1aSTang Haojin val FPNotReadyStall = Value("FPNotReadyStall") // fp-inst at rob head not issue 763d2b20d1aSTang Haojin val MemNotReadyStall = Value("MemNotReadyStall") // mem-inst at rob head not issue 764d2b20d1aSTang Haojin // freelist full 765d2b20d1aSTang Haojin val IntFlStall = Value("IntFlStall") 766d2b20d1aSTang Haojin val FpFlStall = Value("FpFlStall") 767d2b20d1aSTang Haojin // dispatch queue full 768d2b20d1aSTang Haojin val IntDqStall = Value("IntDqStall") 769d2b20d1aSTang Haojin val FpDqStall = Value("FpDqStall") 770d2b20d1aSTang Haojin val LsDqStall = Value("LsDqStall") 771d2b20d1aSTang Haojin 772d2b20d1aSTang Haojin // memblock 773d2b20d1aSTang Haojin val LoadTLBStall = Value("LoadTLBStall") 774d2b20d1aSTang Haojin val LoadL1Stall = Value("LoadL1Stall") 775d2b20d1aSTang Haojin val LoadL2Stall = Value("LoadL2Stall") 776d2b20d1aSTang Haojin val LoadL3Stall = Value("LoadL3Stall") 777d2b20d1aSTang Haojin val LoadMemStall = Value("LoadMemStall") 778d2b20d1aSTang Haojin val StoreStall = Value("StoreStall") // include store tlb miss 779d2b20d1aSTang Haojin val AtomicStall = Value("AtomicStall") // atomic, load reserved, store conditional 780d2b20d1aSTang Haojin 781d2b20d1aSTang Haojin // xs replay (different to gem5) 782d2b20d1aSTang Haojin val LoadVioReplayStall = Value("LoadVioReplayStall") 783d2b20d1aSTang Haojin val LoadMSHRReplayStall = Value("LoadMSHRReplayStall") 784d2b20d1aSTang Haojin 785d2b20d1aSTang Haojin // bad speculation 786d2b20d1aSTang Haojin val ControlRecoveryStall = Value("ControlRecoveryStall") 787d2b20d1aSTang Haojin val MemVioRecoveryStall = Value("MemVioRecoveryStall") 788d2b20d1aSTang Haojin val OtherRecoveryStall = Value("OtherRecoveryStall") 789d2b20d1aSTang Haojin 790d2b20d1aSTang Haojin val FlushedInsts = Value("FlushedInsts") // control flushed, memvio flushed, others 791d2b20d1aSTang Haojin 792d2b20d1aSTang Haojin val OtherCoreStall = Value("OtherCoreStall") 793d2b20d1aSTang Haojin 794d2b20d1aSTang Haojin val NumStallReasons = Value("NumStallReasons") 795d2b20d1aSTang Haojin } 7969a2e6b8aSLinJiawei} 797