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 6157a10886SXuan Hu def FuOpTypeWidth = 8 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]) 191ee8ff153Szfw 192675acc68SYinan Xu def addwbit = "b001_0100".U // addwbit: (src1 + src2)[0] 193675acc68SYinan Xu def addwbyte = "b001_0101".U // addwbyte: (src1 + src2)[7:0] 194675acc68SYinan Xu def addwzexth = "b001_0110".U // addwzexth: ZEXT((src1 + src2)[15:0]) 195675acc68SYinan Xu def addwsexth = "b001_0111".U // addwsexth: SEXT((src1 + src2)[15:0]) 196ee8ff153Szfw 197675acc68SYinan Xu def sllw = "b001_1000".U // sllw: SEXT((src1 << src2)[31:0]) 198675acc68SYinan Xu def srlw = "b001_1001".U // srlw: SEXT((src1[31:0] >> src2)[31:0]) 199675acc68SYinan Xu def sraw = "b001_1010".U // sraw: SEXT((src1[31:0] >> src2)[31:0]) 200675acc68SYinan Xu def rolw = "b001_1100".U 201675acc68SYinan Xu def rorw = "b001_1101".U 202675acc68SYinan Xu 203675acc68SYinan Xu // ADD-op 204675acc68SYinan Xu def adduw = "b010_0000".U // adduw: src1[31:0] + src2 205675acc68SYinan Xu def add = "b010_0001".U // add: src1 + src2 206675acc68SYinan Xu def oddadd = "b010_0010".U // oddadd: src1[0] + src2 207675acc68SYinan Xu 208675acc68SYinan Xu def sr29add = "b010_0100".U // sr29add: src1[63:29] + src2 209675acc68SYinan Xu def sr30add = "b010_0101".U // sr30add: src1[63:30] + src2 210675acc68SYinan Xu def sr31add = "b010_0110".U // sr31add: src1[63:31] + src2 211675acc68SYinan Xu def sr32add = "b010_0111".U // sr32add: src1[63:32] + src2 212675acc68SYinan Xu 213675acc68SYinan Xu def sh1adduw = "b010_1000".U // sh1adduw: {src1[31:0], 1'b0} + src2 214675acc68SYinan Xu def sh1add = "b010_1001".U // sh1add: {src1[62:0], 1'b0} + src2 215675acc68SYinan Xu def sh2adduw = "b010_1010".U // sh2add_uw: {src1[31:0], 2'b0} + src2 216675acc68SYinan Xu def sh2add = "b010_1011".U // sh2add: {src1[61:0], 2'b0} + src2 217675acc68SYinan Xu def sh3adduw = "b010_1100".U // sh3add_uw: {src1[31:0], 3'b0} + src2 218675acc68SYinan Xu def sh3add = "b010_1101".U // sh3add: {src1[60:0], 3'b0} + src2 219675acc68SYinan Xu def sh4add = "b010_1111".U // sh4add: {src1[59:0], 4'b0} + src2 220675acc68SYinan Xu 221675acc68SYinan Xu // SUB-op: src1 - src2 222675acc68SYinan Xu def sub = "b011_0000".U 223675acc68SYinan Xu def sltu = "b011_0001".U 224675acc68SYinan Xu def slt = "b011_0010".U 225675acc68SYinan Xu def maxu = "b011_0100".U 226675acc68SYinan Xu def minu = "b011_0101".U 227675acc68SYinan Xu def max = "b011_0110".U 228675acc68SYinan Xu def min = "b011_0111".U 229675acc68SYinan Xu 230675acc68SYinan Xu // branch 231675acc68SYinan Xu def beq = "b111_0000".U 232675acc68SYinan Xu def bne = "b111_0010".U 233675acc68SYinan Xu def blt = "b111_1000".U 234675acc68SYinan Xu def bge = "b111_1010".U 235675acc68SYinan Xu def bltu = "b111_1100".U 236675acc68SYinan Xu def bgeu = "b111_1110".U 237675acc68SYinan Xu 238675acc68SYinan Xu // misc optype 239675acc68SYinan Xu def and = "b100_0000".U 240675acc68SYinan Xu def andn = "b100_0001".U 241675acc68SYinan Xu def or = "b100_0010".U 242675acc68SYinan Xu def orn = "b100_0011".U 243675acc68SYinan Xu def xor = "b100_0100".U 244675acc68SYinan Xu def xnor = "b100_0101".U 245675acc68SYinan Xu def orcb = "b100_0110".U 246675acc68SYinan Xu 247675acc68SYinan Xu def sextb = "b100_1000".U 248675acc68SYinan Xu def packh = "b100_1001".U 249675acc68SYinan Xu def sexth = "b100_1010".U 250675acc68SYinan Xu def packw = "b100_1011".U 251675acc68SYinan Xu 252675acc68SYinan Xu def revb = "b101_0000".U 253675acc68SYinan Xu def rev8 = "b101_0001".U 254675acc68SYinan Xu def pack = "b101_0010".U 255675acc68SYinan Xu def orh48 = "b101_0011".U 256675acc68SYinan Xu 257675acc68SYinan Xu def szewl1 = "b101_1000".U 258675acc68SYinan Xu def szewl2 = "b101_1001".U 259675acc68SYinan Xu def szewl3 = "b101_1010".U 260675acc68SYinan Xu def byte2 = "b101_1011".U 261675acc68SYinan Xu 262675acc68SYinan Xu def andlsb = "b110_0000".U 263675acc68SYinan Xu def andzexth = "b110_0001".U 264675acc68SYinan Xu def orlsb = "b110_0010".U 265675acc68SYinan Xu def orzexth = "b110_0011".U 266675acc68SYinan Xu def xorlsb = "b110_0100".U 267675acc68SYinan Xu def xorzexth = "b110_0101".U 268675acc68SYinan Xu def orcblsb = "b110_0110".U 269675acc68SYinan Xu def orcbzexth = "b110_0111".U 270675acc68SYinan Xu 271675acc68SYinan Xu def isAddw(func: UInt) = func(6, 4) === "b001".U && !func(3) && !func(1) 272675acc68SYinan Xu def isSimpleLogic(func: UInt) = func(6, 4) === "b100".U && !func(0) 273675acc68SYinan Xu def logicToLsb(func: UInt) = Cat("b110".U(3.W), func(3, 1), 0.U(1.W)) 274675acc68SYinan Xu def logicToZexth(func: UInt) = Cat("b110".U(3.W), func(3, 1), 1.U(1.W)) 275675acc68SYinan Xu 27657a10886SXuan Hu def apply() = UInt(FuOpTypeWidth.W) 2772225d46eSJiawei Lin } 2782225d46eSJiawei Lin 279*d91483a6Sfdy object VSETOpType { 280*d91483a6Sfdy // o: set vl to old vl 281*d91483a6Sfdy // m: set vl to vlmax 282*d91483a6Sfdy def uvset_xi = "b0000_0000".U 283*d91483a6Sfdy def uvset_xi_o = "b0000_1000".U 284*d91483a6Sfdy def uvset_xi_m = "b0001_0000".U 285*d91483a6Sfdy def uvsetvl_xi = "b0000_0100".U 286*d91483a6Sfdy def uvsetvl_xi_o = "b0000_1100".U 287*d91483a6Sfdy def uvset_xx = "b0000_0001".U 288*d91483a6Sfdy def uvset_xx_o = "b0000_1001".U 289*d91483a6Sfdy def uvset_xx_m = "b0001_0001".U 290*d91483a6Sfdy def uvsetvl_xx = "b0000_0101".U 291*d91483a6Sfdy def uvsetvl_xx_o = "b0000_1101".U 292*d91483a6Sfdy def uvset_ii = "b0000_0010".U 293*d91483a6Sfdy def uvsetvl_ii = "b0000_0110".U 294*d91483a6Sfdy 295*d91483a6Sfdy def isVsetvl(func: UInt) = func(0) 296*d91483a6Sfdy def isVsetvli(func: UInt) = !func(1, 0).orR 297*d91483a6Sfdy def isVsetivli(func: UInt) = func(1) 298*d91483a6Sfdy def oldvlFlag(func: UInt) = func(3) 299*d91483a6Sfdy def vlmaxFlag(func: UInt) = func(4) 300*d91483a6Sfdy def convert2uvsetvl(func: UInt) = Cat(func(7, 3), "b1".U, func(1, 0)) 301*d91483a6Sfdy def convert2oldvl(func: UInt) = Cat(func(7, 4), "b1".U, func(2, 0)) 302*d91483a6Sfdy def convert2vlmax(func: UInt) = Cat(func(7, 5), "b1".U, func(3, 0)) 303*d91483a6Sfdy } 304*d91483a6Sfdy 3053b739f49SXuan Hu object BRUOpType { 3063b739f49SXuan Hu // branch 3073b739f49SXuan Hu def beq = "b000_000".U 3083b739f49SXuan Hu def bne = "b000_001".U 3093b739f49SXuan Hu def blt = "b000_100".U 3103b739f49SXuan Hu def bge = "b000_101".U 3113b739f49SXuan Hu def bltu = "b001_000".U 3123b739f49SXuan Hu def bgeu = "b001_001".U 3133b739f49SXuan Hu 3143b739f49SXuan Hu def getBranchType(func: UInt) = func(3, 1) 3153b739f49SXuan Hu def isBranchInvert(func: UInt) = func(0) 3163b739f49SXuan Hu } 3173b739f49SXuan Hu 3183b739f49SXuan Hu object MULOpType { 3193b739f49SXuan Hu // mul 3203b739f49SXuan Hu // bit encoding: | type (2bit) | isWord(1bit) | opcode(2bit) | 3213b739f49SXuan Hu def mul = "b00000".U 3223b739f49SXuan Hu def mulh = "b00001".U 3233b739f49SXuan Hu def mulhsu = "b00010".U 3243b739f49SXuan Hu def mulhu = "b00011".U 3253b739f49SXuan Hu def mulw = "b00100".U 3263b739f49SXuan Hu 3273b739f49SXuan Hu def mulw7 = "b01100".U 3283b739f49SXuan Hu def isSign(op: UInt) = !op(1) 3293b739f49SXuan Hu def isW(op: UInt) = op(2) 3303b739f49SXuan Hu def isH(op: UInt) = op(1, 0) =/= 0.U 3313b739f49SXuan Hu def getOp(op: UInt) = Cat(op(3), op(1, 0)) 3323b739f49SXuan Hu } 3333b739f49SXuan Hu 3343b739f49SXuan Hu object DIVOpType { 3353b739f49SXuan Hu // div 3363b739f49SXuan Hu // bit encoding: | type (2bit) | isWord(1bit) | isSign(1bit) | opcode(1bit) | 3373b739f49SXuan Hu def div = "b10000".U 3383b739f49SXuan Hu def divu = "b10010".U 3393b739f49SXuan Hu def rem = "b10001".U 3403b739f49SXuan Hu def remu = "b10011".U 3413b739f49SXuan Hu 3423b739f49SXuan Hu def divw = "b10100".U 3433b739f49SXuan Hu def divuw = "b10110".U 3443b739f49SXuan Hu def remw = "b10101".U 3453b739f49SXuan Hu def remuw = "b10111".U 3463b739f49SXuan Hu 3473b739f49SXuan Hu def isSign(op: UInt) = !op(1) 3483b739f49SXuan Hu def isW(op: UInt) = op(2) 3493b739f49SXuan Hu def isH(op: UInt) = op(0) 3503b739f49SXuan Hu } 3513b739f49SXuan Hu 3522225d46eSJiawei Lin object MDUOpType { 3532225d46eSJiawei Lin // mul 3542225d46eSJiawei Lin // bit encoding: | type (2bit) | isWord(1bit) | opcode(2bit) | 3552225d46eSJiawei Lin def mul = "b00000".U 3562225d46eSJiawei Lin def mulh = "b00001".U 3572225d46eSJiawei Lin def mulhsu = "b00010".U 3582225d46eSJiawei Lin def mulhu = "b00011".U 3592225d46eSJiawei Lin def mulw = "b00100".U 3602225d46eSJiawei Lin 36188825c5cSYinan Xu def mulw7 = "b01100".U 36288825c5cSYinan Xu 3632225d46eSJiawei Lin // div 3642225d46eSJiawei Lin // bit encoding: | type (2bit) | isWord(1bit) | isSign(1bit) | opcode(1bit) | 36588825c5cSYinan Xu def div = "b10000".U 36688825c5cSYinan Xu def divu = "b10010".U 36788825c5cSYinan Xu def rem = "b10001".U 36888825c5cSYinan Xu def remu = "b10011".U 3692225d46eSJiawei Lin 37088825c5cSYinan Xu def divw = "b10100".U 37188825c5cSYinan Xu def divuw = "b10110".U 37288825c5cSYinan Xu def remw = "b10101".U 37388825c5cSYinan Xu def remuw = "b10111".U 3742225d46eSJiawei Lin 37588825c5cSYinan Xu def isMul(op: UInt) = !op(4) 37688825c5cSYinan Xu def isDiv(op: UInt) = op(4) 3772225d46eSJiawei Lin 3782225d46eSJiawei Lin def isDivSign(op: UInt) = isDiv(op) && !op(1) 3792225d46eSJiawei Lin def isW(op: UInt) = op(2) 3802225d46eSJiawei Lin def isH(op: UInt) = (isDiv(op) && op(0)) || (isMul(op) && op(1, 0) =/= 0.U) 3812225d46eSJiawei Lin def getMulOp(op: UInt) = op(1, 0) 3822225d46eSJiawei Lin } 3832225d46eSJiawei Lin 3842225d46eSJiawei Lin object LSUOpType { 385d200f594SWilliam Wang // load pipeline 3862225d46eSJiawei Lin 387d200f594SWilliam Wang // normal load 388d200f594SWilliam Wang // Note: bit(1, 0) are size, DO NOT CHANGE 389d200f594SWilliam Wang // bit encoding: | load 0 | is unsigned(1bit) | size(2bit) | 390d200f594SWilliam Wang def lb = "b0000".U 391d200f594SWilliam Wang def lh = "b0001".U 392d200f594SWilliam Wang def lw = "b0010".U 393d200f594SWilliam Wang def ld = "b0011".U 394d200f594SWilliam Wang def lbu = "b0100".U 395d200f594SWilliam Wang def lhu = "b0101".U 396d200f594SWilliam Wang def lwu = "b0110".U 397ca18a0b4SWilliam Wang 398d200f594SWilliam Wang // Zicbop software prefetch 399d200f594SWilliam Wang // bit encoding: | prefetch 1 | 0 | prefetch type (2bit) | 400d200f594SWilliam Wang def prefetch_i = "b1000".U // TODO 401d200f594SWilliam Wang def prefetch_r = "b1001".U 402d200f594SWilliam Wang def prefetch_w = "b1010".U 403ca18a0b4SWilliam Wang 404d200f594SWilliam Wang def isPrefetch(op: UInt): Bool = op(3) 405d200f594SWilliam Wang 406d200f594SWilliam Wang // store pipeline 407d200f594SWilliam Wang // normal store 408d200f594SWilliam Wang // bit encoding: | store 00 | size(2bit) | 409d200f594SWilliam Wang def sb = "b0000".U 410d200f594SWilliam Wang def sh = "b0001".U 411d200f594SWilliam Wang def sw = "b0010".U 412d200f594SWilliam Wang def sd = "b0011".U 413d200f594SWilliam Wang 414d200f594SWilliam Wang // l1 cache op 415d200f594SWilliam Wang // bit encoding: | cbo_zero 01 | size(2bit) 11 | 416d200f594SWilliam Wang def cbo_zero = "b0111".U 417d200f594SWilliam Wang 418d200f594SWilliam Wang // llc op 419d200f594SWilliam Wang // bit encoding: | prefetch 11 | suboptype(2bit) | 420d200f594SWilliam Wang def cbo_clean = "b1100".U 421d200f594SWilliam Wang def cbo_flush = "b1101".U 422d200f594SWilliam Wang def cbo_inval = "b1110".U 423d200f594SWilliam Wang 424d200f594SWilliam Wang def isCbo(op: UInt): Bool = op(3, 2) === "b11".U 4252225d46eSJiawei Lin 4262225d46eSJiawei Lin // atomics 4272225d46eSJiawei Lin // bit(1, 0) are size 4282225d46eSJiawei Lin // since atomics use a different fu type 4292225d46eSJiawei Lin // so we can safely reuse other load/store's encodings 430d200f594SWilliam Wang // bit encoding: | optype(4bit) | size (2bit) | 4312225d46eSJiawei Lin def lr_w = "b000010".U 4322225d46eSJiawei Lin def sc_w = "b000110".U 4332225d46eSJiawei Lin def amoswap_w = "b001010".U 4342225d46eSJiawei Lin def amoadd_w = "b001110".U 4352225d46eSJiawei Lin def amoxor_w = "b010010".U 4362225d46eSJiawei Lin def amoand_w = "b010110".U 4372225d46eSJiawei Lin def amoor_w = "b011010".U 4382225d46eSJiawei Lin def amomin_w = "b011110".U 4392225d46eSJiawei Lin def amomax_w = "b100010".U 4402225d46eSJiawei Lin def amominu_w = "b100110".U 4412225d46eSJiawei Lin def amomaxu_w = "b101010".U 4422225d46eSJiawei Lin 4432225d46eSJiawei Lin def lr_d = "b000011".U 4442225d46eSJiawei Lin def sc_d = "b000111".U 4452225d46eSJiawei Lin def amoswap_d = "b001011".U 4462225d46eSJiawei Lin def amoadd_d = "b001111".U 4472225d46eSJiawei Lin def amoxor_d = "b010011".U 4482225d46eSJiawei Lin def amoand_d = "b010111".U 4492225d46eSJiawei Lin def amoor_d = "b011011".U 4502225d46eSJiawei Lin def amomin_d = "b011111".U 4512225d46eSJiawei Lin def amomax_d = "b100011".U 4522225d46eSJiawei Lin def amominu_d = "b100111".U 4532225d46eSJiawei Lin def amomaxu_d = "b101011".U 454b6982e83SLemover 455b6982e83SLemover def size(op: UInt) = op(1,0) 4562225d46eSJiawei Lin } 4572225d46eSJiawei Lin 4583feeca58Szfw object BKUOpType { 459ee8ff153Szfw 4603feeca58Szfw def clmul = "b000000".U 4613feeca58Szfw def clmulh = "b000001".U 4623feeca58Szfw def clmulr = "b000010".U 4633feeca58Szfw def xpermn = "b000100".U 4643feeca58Szfw def xpermb = "b000101".U 465ee8ff153Szfw 4663feeca58Szfw def clz = "b001000".U 4673feeca58Szfw def clzw = "b001001".U 4683feeca58Szfw def ctz = "b001010".U 4693feeca58Szfw def ctzw = "b001011".U 4703feeca58Szfw def cpop = "b001100".U 4713feeca58Szfw def cpopw = "b001101".U 47207596dc6Szfw 4733feeca58Szfw // 01xxxx is reserve 4743feeca58Szfw def aes64es = "b100000".U 4753feeca58Szfw def aes64esm = "b100001".U 4763feeca58Szfw def aes64ds = "b100010".U 4773feeca58Szfw def aes64dsm = "b100011".U 4783feeca58Szfw def aes64im = "b100100".U 4793feeca58Szfw def aes64ks1i = "b100101".U 4803feeca58Szfw def aes64ks2 = "b100110".U 4813feeca58Szfw 4823feeca58Szfw // merge to two instruction sm4ks & sm4ed 48319bcce38SFawang Zhang def sm4ed0 = "b101000".U 48419bcce38SFawang Zhang def sm4ed1 = "b101001".U 48519bcce38SFawang Zhang def sm4ed2 = "b101010".U 48619bcce38SFawang Zhang def sm4ed3 = "b101011".U 48719bcce38SFawang Zhang def sm4ks0 = "b101100".U 48819bcce38SFawang Zhang def sm4ks1 = "b101101".U 48919bcce38SFawang Zhang def sm4ks2 = "b101110".U 49019bcce38SFawang Zhang def sm4ks3 = "b101111".U 4913feeca58Szfw 4923feeca58Szfw def sha256sum0 = "b110000".U 4933feeca58Szfw def sha256sum1 = "b110001".U 4943feeca58Szfw def sha256sig0 = "b110010".U 4953feeca58Szfw def sha256sig1 = "b110011".U 4963feeca58Szfw def sha512sum0 = "b110100".U 4973feeca58Szfw def sha512sum1 = "b110101".U 4983feeca58Szfw def sha512sig0 = "b110110".U 4993feeca58Szfw def sha512sig1 = "b110111".U 5003feeca58Szfw 5013feeca58Szfw def sm3p0 = "b111000".U 5023feeca58Szfw def sm3p1 = "b111001".U 503ee8ff153Szfw } 504ee8ff153Szfw 5052225d46eSJiawei Lin object BTBtype { 5062225d46eSJiawei Lin def B = "b00".U // branch 5072225d46eSJiawei Lin def J = "b01".U // jump 5082225d46eSJiawei Lin def I = "b10".U // indirect 5092225d46eSJiawei Lin def R = "b11".U // return 5102225d46eSJiawei Lin 5112225d46eSJiawei Lin def apply() = UInt(2.W) 5122225d46eSJiawei Lin } 5132225d46eSJiawei Lin 5142225d46eSJiawei Lin object SelImm { 515ee8ff153Szfw def IMM_X = "b0111".U 516*d91483a6Sfdy def IMM_S = "b1110".U 517ee8ff153Szfw def IMM_SB = "b0001".U 518ee8ff153Szfw def IMM_U = "b0010".U 519ee8ff153Szfw def IMM_UJ = "b0011".U 520ee8ff153Szfw def IMM_I = "b0100".U 521ee8ff153Szfw def IMM_Z = "b0101".U 522ee8ff153Szfw def INVALID_INSTR = "b0110".U 523ee8ff153Szfw def IMM_B6 = "b1000".U 5242225d46eSJiawei Lin 52558c35d23Shuxuan0307 def IMM_OPIVIS = "b1001".U 52658c35d23Shuxuan0307 def IMM_OPIVIU = "b1010".U 527912e2179SXuan Hu def IMM_VSETVLI = "b1100".U 528912e2179SXuan Hu def IMM_VSETIVLI = "b1101".U 52958c35d23Shuxuan0307 53057a10886SXuan Hu def X = BitPat("b0000") 5316e7c9679Shuxuan0307 532ee8ff153Szfw def apply() = UInt(4.W) 5332225d46eSJiawei Lin } 5342225d46eSJiawei Lin 535*d91483a6Sfdy object UopDivType { 536*d91483a6Sfdy def SCA_SIM = "b000000".U // 537*d91483a6Sfdy def DIR = "b010001".U // dirty: vset 538*d91483a6Sfdy def VEC_VVV = "b010010".U // VEC_VVV 539*d91483a6Sfdy def VEC_VXV = "b010011".U // VEC_VXV 540*d91483a6Sfdy def VEC_0XV = "b010100".U // VEC_0XV 541*d91483a6Sfdy def VEC_VVW = "b010101".U // VEC_VVW 542*d91483a6Sfdy def VEC_WVW = "b010110".U // VEC_WVW 543*d91483a6Sfdy def VEC_VXW = "b010111".U // VEC_VXW 544*d91483a6Sfdy def VEC_WXW = "b011000".U // VEC_WXW 545*d91483a6Sfdy def VEC_WVV = "b011001".U // VEC_WVV 546*d91483a6Sfdy def VEC_WXV = "b011010".U // VEC_WXV 547*d91483a6Sfdy def VEC_EXT2 = "b011011".U // VF2 0 -> V 548*d91483a6Sfdy def VEC_EXT4 = "b011100".U // VF4 0 -> V 549*d91483a6Sfdy def VEC_EXT8 = "b011101".U // VF8 0 -> V 550*d91483a6Sfdy def VEC_VVM = "b011110".U // VEC_VVM 551*d91483a6Sfdy def VEC_VXM = "b011111".U // VEC_VXM 552*d91483a6Sfdy def VEC_SLIDE1UP = "b100000".U // vslide1up.vx 553*d91483a6Sfdy def VEC_FSLIDE1UP = "b100001".U // vfslide1up.vf 554*d91483a6Sfdy def VEC_SLIDE1DOWN = "b100010".U // vslide1down.vx 555*d91483a6Sfdy def VEC_FSLIDE1DOWN = "b100011".U // vfslide1down.vf 556*d91483a6Sfdy def VEC_VRED = "b100100".U // VEC_VRED 557*d91483a6Sfdy def VEC_SLIDEUP = "b100101".U // VEC_SLIDEUP 558*d91483a6Sfdy def VEC_ISLIDEUP = "b100110".U // VEC_ISLIDEUP 559*d91483a6Sfdy def VEC_SLIDEDOWN = "b100111".U // VEC_SLIDEDOWN 560*d91483a6Sfdy def VEC_ISLIDEDOWN = "b101000".U // VEC_ISLIDEDOWN 561*d91483a6Sfdy def VEC_M0X = "b101001".U // VEC_M0X 0MV 562*d91483a6Sfdy def VEC_MVV = "b101010".U // VEC_MVV VMV 563*d91483a6Sfdy def VEC_M0X_VFIRST = "b101011".U // 564*d91483a6Sfdy def VEC_M0M = "b000000".U // VEC_M0M 565*d91483a6Sfdy def VEC_MMM = "b000000".U // VEC_MMM 566*d91483a6Sfdy def dummy = "b111111".U 567*d91483a6Sfdy 568*d91483a6Sfdy def X = BitPat("b000000") 569*d91483a6Sfdy 570*d91483a6Sfdy def apply() = UInt(6.W) 571*d91483a6Sfdy def needSplit(UopDivType: UInt) = UopDivType(4) || UopDivType(5) 572*d91483a6Sfdy } 573*d91483a6Sfdy 5746ab6918fSYinan Xu object ExceptionNO { 5756ab6918fSYinan Xu def instrAddrMisaligned = 0 5766ab6918fSYinan Xu def instrAccessFault = 1 5776ab6918fSYinan Xu def illegalInstr = 2 5786ab6918fSYinan Xu def breakPoint = 3 5796ab6918fSYinan Xu def loadAddrMisaligned = 4 5806ab6918fSYinan Xu def loadAccessFault = 5 5816ab6918fSYinan Xu def storeAddrMisaligned = 6 5826ab6918fSYinan Xu def storeAccessFault = 7 5836ab6918fSYinan Xu def ecallU = 8 5846ab6918fSYinan Xu def ecallS = 9 5856ab6918fSYinan Xu def ecallM = 11 5866ab6918fSYinan Xu def instrPageFault = 12 5876ab6918fSYinan Xu def loadPageFault = 13 5886ab6918fSYinan Xu // def singleStep = 14 5896ab6918fSYinan Xu def storePageFault = 15 5906ab6918fSYinan Xu def priorities = Seq( 5916ab6918fSYinan Xu breakPoint, // TODO: different BP has different priority 5926ab6918fSYinan Xu instrPageFault, 5936ab6918fSYinan Xu instrAccessFault, 5946ab6918fSYinan Xu illegalInstr, 5956ab6918fSYinan Xu instrAddrMisaligned, 5966ab6918fSYinan Xu ecallM, ecallS, ecallU, 597d880177dSYinan Xu storeAddrMisaligned, 598d880177dSYinan Xu loadAddrMisaligned, 5996ab6918fSYinan Xu storePageFault, 6006ab6918fSYinan Xu loadPageFault, 6016ab6918fSYinan Xu storeAccessFault, 602d880177dSYinan Xu loadAccessFault 6036ab6918fSYinan Xu ) 6046ab6918fSYinan Xu def all = priorities.distinct.sorted 6056ab6918fSYinan Xu def frontendSet = Seq( 6066ab6918fSYinan Xu instrAddrMisaligned, 6076ab6918fSYinan Xu instrAccessFault, 6086ab6918fSYinan Xu illegalInstr, 6096ab6918fSYinan Xu instrPageFault 6106ab6918fSYinan Xu ) 6116ab6918fSYinan Xu def partialSelect(vec: Vec[Bool], select: Seq[Int]): Vec[Bool] = { 6126ab6918fSYinan Xu val new_vec = Wire(ExceptionVec()) 6136ab6918fSYinan Xu new_vec.foreach(_ := false.B) 6146ab6918fSYinan Xu select.foreach(i => new_vec(i) := vec(i)) 6156ab6918fSYinan Xu new_vec 6166ab6918fSYinan Xu } 6176ab6918fSYinan Xu def selectFrontend(vec: Vec[Bool]): Vec[Bool] = partialSelect(vec, frontendSet) 6186ab6918fSYinan Xu def selectAll(vec: Vec[Bool]): Vec[Bool] = partialSelect(vec, ExceptionNO.all) 6196ab6918fSYinan Xu def selectByFu(vec:Vec[Bool], fuConfig: FuConfig): Vec[Bool] = 6206ab6918fSYinan Xu partialSelect(vec, fuConfig.exceptionOut) 6216ab6918fSYinan Xu } 6229a2e6b8aSLinJiawei} 623