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._ 24*730cfbc0SXuan 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 { 100baf8def6SYinan Xu def apply() = Vec(16, Bool()) 101baf8def6SYinan Xu } 102a8e04b1dSYinan Xu 103c60c1ab4SWilliam Wang object PMAMode { 1048d9a04fcSWilliam Wang def R = "b1".U << 0 //readable 1058d9a04fcSWilliam Wang def W = "b1".U << 1 //writeable 1068d9a04fcSWilliam Wang def X = "b1".U << 2 //executable 1078d9a04fcSWilliam Wang def I = "b1".U << 3 //cacheable: icache 1088d9a04fcSWilliam Wang def D = "b1".U << 4 //cacheable: dcache 1098d9a04fcSWilliam Wang def S = "b1".U << 5 //enable speculative access 110cff68e26SWilliam Wang def A = "b1".U << 6 //enable atomic operation, A imply R & W 1118d9a04fcSWilliam Wang def C = "b1".U << 7 //if it is cacheable is configable 112c60c1ab4SWilliam Wang def Reserved = "b0".U 113c60c1ab4SWilliam Wang 114c60c1ab4SWilliam Wang def apply() = UInt(7.W) 115c60c1ab4SWilliam Wang 116c60c1ab4SWilliam Wang def read(mode: UInt) = mode(0) 117c60c1ab4SWilliam Wang def write(mode: UInt) = mode(1) 118c60c1ab4SWilliam Wang def execute(mode: UInt) = mode(2) 119c60c1ab4SWilliam Wang def icache(mode: UInt) = mode(3) 120c60c1ab4SWilliam Wang def dcache(mode: UInt) = mode(4) 121c60c1ab4SWilliam Wang def speculate(mode: UInt) = mode(5) 122c60c1ab4SWilliam Wang def atomic(mode: UInt) = mode(6) 123c60c1ab4SWilliam Wang def configable_cache(mode: UInt) = mode(7) 124c60c1ab4SWilliam Wang 125c60c1ab4SWilliam Wang def strToMode(s: String) = { 126423b9255SWilliam Wang var result = 0.U(8.W) 127c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("R") >= 0) result = result + R 128c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("W") >= 0) result = result + W 129c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("X") >= 0) result = result + X 130c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("I") >= 0) result = result + I 131c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("D") >= 0) result = result + D 132c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("S") >= 0) result = result + S 133c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("A") >= 0) result = result + A 134c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("C") >= 0) result = result + C 135c60c1ab4SWilliam Wang result 136c60c1ab4SWilliam Wang } 137c60c1ab4SWilliam Wang } 1382225d46eSJiawei Lin 1392225d46eSJiawei Lin 1402225d46eSJiawei Lin object CSROpType { 1412225d46eSJiawei Lin def jmp = "b000".U 1422225d46eSJiawei Lin def wrt = "b001".U 1432225d46eSJiawei Lin def set = "b010".U 1442225d46eSJiawei Lin def clr = "b011".U 145b6900d94SYinan Xu def wfi = "b100".U 1462225d46eSJiawei Lin def wrti = "b101".U 1472225d46eSJiawei Lin def seti = "b110".U 1482225d46eSJiawei Lin def clri = "b111".U 1495d669833SYinan Xu def needAccess(op: UInt): Bool = op(1, 0) =/= 0.U 1502225d46eSJiawei Lin } 1512225d46eSJiawei Lin 1522225d46eSJiawei Lin // jump 1532225d46eSJiawei Lin object JumpOpType { 1542225d46eSJiawei Lin def jal = "b00".U 1552225d46eSJiawei Lin def jalr = "b01".U 1562225d46eSJiawei Lin def auipc = "b10".U 1572225d46eSJiawei Lin// def call = "b11_011".U 1582225d46eSJiawei Lin// def ret = "b11_100".U 1592225d46eSJiawei Lin def jumpOpisJalr(op: UInt) = op(0) 1602225d46eSJiawei Lin def jumpOpisAuipc(op: UInt) = op(1) 1612225d46eSJiawei Lin } 1622225d46eSJiawei Lin 1632225d46eSJiawei Lin object FenceOpType { 1642225d46eSJiawei Lin def fence = "b10000".U 1652225d46eSJiawei Lin def sfence = "b10001".U 1662225d46eSJiawei Lin def fencei = "b10010".U 167af2f7849Shappy-lx def nofence= "b00000".U 1682225d46eSJiawei Lin } 1692225d46eSJiawei Lin 1702225d46eSJiawei Lin object ALUOpType { 171ee8ff153Szfw // shift optype 172675acc68SYinan Xu def slliuw = "b000_0000".U // slliuw: ZEXT(src1[31:0]) << shamt 173675acc68SYinan Xu def sll = "b000_0001".U // sll: src1 << src2 174ee8ff153Szfw 175675acc68SYinan Xu def bclr = "b000_0010".U // bclr: src1 & ~(1 << src2[5:0]) 176675acc68SYinan Xu def bset = "b000_0011".U // bset: src1 | (1 << src2[5:0]) 177675acc68SYinan Xu def binv = "b000_0100".U // binv: src1 ^ ~(1 << src2[5:0]) 178ee8ff153Szfw 179675acc68SYinan Xu def srl = "b000_0101".U // srl: src1 >> src2 180675acc68SYinan Xu def bext = "b000_0110".U // bext: (src1 >> src2)[0] 181675acc68SYinan Xu def sra = "b000_0111".U // sra: src1 >> src2 (arithmetic) 182ee8ff153Szfw 1837b441e5eSYinan Xu def rol = "b000_1001".U // rol: (src1 << src2) | (src1 >> (xlen - src2)) 1847b441e5eSYinan Xu def ror = "b000_1011".U // ror: (src1 >> src2) | (src1 << (xlen - src2)) 185184a1958Szfw 186ee8ff153Szfw // RV64 32bit optype 187675acc68SYinan Xu def addw = "b001_0000".U // addw: SEXT((src1 + src2)[31:0]) 188675acc68SYinan Xu def oddaddw = "b001_0001".U // oddaddw: SEXT((src1[0] + src2)[31:0]) 189675acc68SYinan Xu def subw = "b001_0010".U // subw: SEXT((src1 - src2)[31:0]) 190ee8ff153Szfw 191675acc68SYinan Xu def addwbit = "b001_0100".U // addwbit: (src1 + src2)[0] 192675acc68SYinan Xu def addwbyte = "b001_0101".U // addwbyte: (src1 + src2)[7:0] 193675acc68SYinan Xu def addwzexth = "b001_0110".U // addwzexth: ZEXT((src1 + src2)[15:0]) 194675acc68SYinan Xu def addwsexth = "b001_0111".U // addwsexth: SEXT((src1 + src2)[15:0]) 195ee8ff153Szfw 196675acc68SYinan Xu def sllw = "b001_1000".U // sllw: SEXT((src1 << src2)[31:0]) 197675acc68SYinan Xu def srlw = "b001_1001".U // srlw: SEXT((src1[31:0] >> src2)[31:0]) 198675acc68SYinan Xu def sraw = "b001_1010".U // sraw: SEXT((src1[31:0] >> src2)[31:0]) 199675acc68SYinan Xu def rolw = "b001_1100".U 200675acc68SYinan Xu def rorw = "b001_1101".U 201675acc68SYinan Xu 202675acc68SYinan Xu // ADD-op 203675acc68SYinan Xu def adduw = "b010_0000".U // adduw: src1[31:0] + src2 204675acc68SYinan Xu def add = "b010_0001".U // add: src1 + src2 205675acc68SYinan Xu def oddadd = "b010_0010".U // oddadd: src1[0] + src2 206675acc68SYinan Xu 207675acc68SYinan Xu def sr29add = "b010_0100".U // sr29add: src1[63:29] + src2 208675acc68SYinan Xu def sr30add = "b010_0101".U // sr30add: src1[63:30] + src2 209675acc68SYinan Xu def sr31add = "b010_0110".U // sr31add: src1[63:31] + src2 210675acc68SYinan Xu def sr32add = "b010_0111".U // sr32add: src1[63:32] + src2 211675acc68SYinan Xu 212675acc68SYinan Xu def sh1adduw = "b010_1000".U // sh1adduw: {src1[31:0], 1'b0} + src2 213675acc68SYinan Xu def sh1add = "b010_1001".U // sh1add: {src1[62:0], 1'b0} + src2 214675acc68SYinan Xu def sh2adduw = "b010_1010".U // sh2add_uw: {src1[31:0], 2'b0} + src2 215675acc68SYinan Xu def sh2add = "b010_1011".U // sh2add: {src1[61:0], 2'b0} + src2 216675acc68SYinan Xu def sh3adduw = "b010_1100".U // sh3add_uw: {src1[31:0], 3'b0} + src2 217675acc68SYinan Xu def sh3add = "b010_1101".U // sh3add: {src1[60:0], 3'b0} + src2 218675acc68SYinan Xu def sh4add = "b010_1111".U // sh4add: {src1[59:0], 4'b0} + src2 219675acc68SYinan Xu 220675acc68SYinan Xu // SUB-op: src1 - src2 221675acc68SYinan Xu def sub = "b011_0000".U 222675acc68SYinan Xu def sltu = "b011_0001".U 223675acc68SYinan Xu def slt = "b011_0010".U 224675acc68SYinan Xu def maxu = "b011_0100".U 225675acc68SYinan Xu def minu = "b011_0101".U 226675acc68SYinan Xu def max = "b011_0110".U 227675acc68SYinan Xu def min = "b011_0111".U 228675acc68SYinan Xu 229675acc68SYinan Xu // branch 230675acc68SYinan Xu def beq = "b111_0000".U 231675acc68SYinan Xu def bne = "b111_0010".U 232675acc68SYinan Xu def blt = "b111_1000".U 233675acc68SYinan Xu def bge = "b111_1010".U 234675acc68SYinan Xu def bltu = "b111_1100".U 235675acc68SYinan Xu def bgeu = "b111_1110".U 236675acc68SYinan Xu 237675acc68SYinan Xu // misc optype 238675acc68SYinan Xu def and = "b100_0000".U 239675acc68SYinan Xu def andn = "b100_0001".U 240675acc68SYinan Xu def or = "b100_0010".U 241675acc68SYinan Xu def orn = "b100_0011".U 242675acc68SYinan Xu def xor = "b100_0100".U 243675acc68SYinan Xu def xnor = "b100_0101".U 244675acc68SYinan Xu def orcb = "b100_0110".U 245675acc68SYinan Xu 246675acc68SYinan Xu def sextb = "b100_1000".U 247675acc68SYinan Xu def packh = "b100_1001".U 248675acc68SYinan Xu def sexth = "b100_1010".U 249675acc68SYinan Xu def packw = "b100_1011".U 250675acc68SYinan Xu 251675acc68SYinan Xu def revb = "b101_0000".U 252675acc68SYinan Xu def rev8 = "b101_0001".U 253675acc68SYinan Xu def pack = "b101_0010".U 254675acc68SYinan Xu def orh48 = "b101_0011".U 255675acc68SYinan Xu 256675acc68SYinan Xu def szewl1 = "b101_1000".U 257675acc68SYinan Xu def szewl2 = "b101_1001".U 258675acc68SYinan Xu def szewl3 = "b101_1010".U 259675acc68SYinan Xu def byte2 = "b101_1011".U 260675acc68SYinan Xu 261675acc68SYinan Xu def andlsb = "b110_0000".U 262675acc68SYinan Xu def andzexth = "b110_0001".U 263675acc68SYinan Xu def orlsb = "b110_0010".U 264675acc68SYinan Xu def orzexth = "b110_0011".U 265675acc68SYinan Xu def xorlsb = "b110_0100".U 266675acc68SYinan Xu def xorzexth = "b110_0101".U 267675acc68SYinan Xu def orcblsb = "b110_0110".U 268675acc68SYinan Xu def orcbzexth = "b110_0111".U 2694aa9ed34Sfdy def vsetvli1 = "b1000_0000".U 2704aa9ed34Sfdy def vsetvli2 = "b1000_0100".U 2714aa9ed34Sfdy def vsetvl1 = "b1000_0001".U 2724aa9ed34Sfdy def vsetvl2 = "b1000_0101".U 2734aa9ed34Sfdy def vsetivli1 = "b1000_0010".U 2744aa9ed34Sfdy def vsetivli2 = "b1000_0110".U 275675acc68SYinan Xu 276675acc68SYinan Xu def isAddw(func: UInt) = func(6, 4) === "b001".U && !func(3) && !func(1) 277675acc68SYinan Xu def isSimpleLogic(func: UInt) = func(6, 4) === "b100".U && !func(0) 278675acc68SYinan Xu def logicToLsb(func: UInt) = Cat("b110".U(3.W), func(3, 1), 0.U(1.W)) 279675acc68SYinan Xu def logicToZexth(func: UInt) = Cat("b110".U(3.W), func(3, 1), 1.U(1.W)) 2804aa9ed34Sfdy def isVset(func: UInt) = func(7, 3) === "b1000_0".U 2814aa9ed34Sfdy def isVsetvl(func: UInt) = isVset(func) && func(0) 2824aa9ed34Sfdy def isVsetvli(func: UInt) = isVset(func) && !func(1, 0).orR 2834aa9ed34Sfdy def vsetExchange(func: UInt) = Cat(func(7, 3), "b1".U, func(1, 0)) 284675acc68SYinan Xu 28557a10886SXuan Hu def apply() = UInt(FuOpTypeWidth.W) 2862225d46eSJiawei Lin } 2872225d46eSJiawei Lin 2883b739f49SXuan Hu object BRUOpType { 2893b739f49SXuan Hu // branch 2903b739f49SXuan Hu def beq = "b000_000".U 2913b739f49SXuan Hu def bne = "b000_001".U 2923b739f49SXuan Hu def blt = "b000_100".U 2933b739f49SXuan Hu def bge = "b000_101".U 2943b739f49SXuan Hu def bltu = "b001_000".U 2953b739f49SXuan Hu def bgeu = "b001_001".U 2963b739f49SXuan Hu 2973b739f49SXuan Hu def getBranchType(func: UInt) = func(3, 1) 2983b739f49SXuan Hu def isBranchInvert(func: UInt) = func(0) 2993b739f49SXuan Hu } 3003b739f49SXuan Hu 3013b739f49SXuan Hu object MULOpType { 3023b739f49SXuan Hu // mul 3033b739f49SXuan Hu // bit encoding: | type (2bit) | isWord(1bit) | opcode(2bit) | 3043b739f49SXuan Hu def mul = "b00000".U 3053b739f49SXuan Hu def mulh = "b00001".U 3063b739f49SXuan Hu def mulhsu = "b00010".U 3073b739f49SXuan Hu def mulhu = "b00011".U 3083b739f49SXuan Hu def mulw = "b00100".U 3093b739f49SXuan Hu 3103b739f49SXuan Hu def mulw7 = "b01100".U 3113b739f49SXuan Hu def isSign(op: UInt) = !op(1) 3123b739f49SXuan Hu def isW(op: UInt) = op(2) 3133b739f49SXuan Hu def isH(op: UInt) = op(1, 0) =/= 0.U 3143b739f49SXuan Hu def getOp(op: UInt) = Cat(op(3), op(1, 0)) 3153b739f49SXuan Hu } 3163b739f49SXuan Hu 3173b739f49SXuan Hu object DIVOpType { 3183b739f49SXuan Hu // div 3193b739f49SXuan Hu // bit encoding: | type (2bit) | isWord(1bit) | isSign(1bit) | opcode(1bit) | 3203b739f49SXuan Hu def div = "b10000".U 3213b739f49SXuan Hu def divu = "b10010".U 3223b739f49SXuan Hu def rem = "b10001".U 3233b739f49SXuan Hu def remu = "b10011".U 3243b739f49SXuan Hu 3253b739f49SXuan Hu def divw = "b10100".U 3263b739f49SXuan Hu def divuw = "b10110".U 3273b739f49SXuan Hu def remw = "b10101".U 3283b739f49SXuan Hu def remuw = "b10111".U 3293b739f49SXuan Hu 3303b739f49SXuan Hu def isSign(op: UInt) = !op(1) 3313b739f49SXuan Hu def isW(op: UInt) = op(2) 3323b739f49SXuan Hu def isH(op: UInt) = op(0) 3333b739f49SXuan Hu } 3343b739f49SXuan Hu 3352225d46eSJiawei Lin object MDUOpType { 3362225d46eSJiawei Lin // mul 3372225d46eSJiawei Lin // bit encoding: | type (2bit) | isWord(1bit) | opcode(2bit) | 3382225d46eSJiawei Lin def mul = "b00000".U 3392225d46eSJiawei Lin def mulh = "b00001".U 3402225d46eSJiawei Lin def mulhsu = "b00010".U 3412225d46eSJiawei Lin def mulhu = "b00011".U 3422225d46eSJiawei Lin def mulw = "b00100".U 3432225d46eSJiawei Lin 34488825c5cSYinan Xu def mulw7 = "b01100".U 34588825c5cSYinan Xu 3462225d46eSJiawei Lin // div 3472225d46eSJiawei Lin // bit encoding: | type (2bit) | isWord(1bit) | isSign(1bit) | opcode(1bit) | 34888825c5cSYinan Xu def div = "b10000".U 34988825c5cSYinan Xu def divu = "b10010".U 35088825c5cSYinan Xu def rem = "b10001".U 35188825c5cSYinan Xu def remu = "b10011".U 3522225d46eSJiawei Lin 35388825c5cSYinan Xu def divw = "b10100".U 35488825c5cSYinan Xu def divuw = "b10110".U 35588825c5cSYinan Xu def remw = "b10101".U 35688825c5cSYinan Xu def remuw = "b10111".U 3572225d46eSJiawei Lin 35888825c5cSYinan Xu def isMul(op: UInt) = !op(4) 35988825c5cSYinan Xu def isDiv(op: UInt) = op(4) 3602225d46eSJiawei Lin 3612225d46eSJiawei Lin def isDivSign(op: UInt) = isDiv(op) && !op(1) 3622225d46eSJiawei Lin def isW(op: UInt) = op(2) 3632225d46eSJiawei Lin def isH(op: UInt) = (isDiv(op) && op(0)) || (isMul(op) && op(1, 0) =/= 0.U) 3642225d46eSJiawei Lin def getMulOp(op: UInt) = op(1, 0) 3652225d46eSJiawei Lin } 3662225d46eSJiawei Lin 3672225d46eSJiawei Lin object LSUOpType { 368d200f594SWilliam Wang // load pipeline 3692225d46eSJiawei Lin 370d200f594SWilliam Wang // normal load 371d200f594SWilliam Wang // Note: bit(1, 0) are size, DO NOT CHANGE 372d200f594SWilliam Wang // bit encoding: | load 0 | is unsigned(1bit) | size(2bit) | 373d200f594SWilliam Wang def lb = "b0000".U 374d200f594SWilliam Wang def lh = "b0001".U 375d200f594SWilliam Wang def lw = "b0010".U 376d200f594SWilliam Wang def ld = "b0011".U 377d200f594SWilliam Wang def lbu = "b0100".U 378d200f594SWilliam Wang def lhu = "b0101".U 379d200f594SWilliam Wang def lwu = "b0110".U 380ca18a0b4SWilliam Wang 381d200f594SWilliam Wang // Zicbop software prefetch 382d200f594SWilliam Wang // bit encoding: | prefetch 1 | 0 | prefetch type (2bit) | 383d200f594SWilliam Wang def prefetch_i = "b1000".U // TODO 384d200f594SWilliam Wang def prefetch_r = "b1001".U 385d200f594SWilliam Wang def prefetch_w = "b1010".U 386ca18a0b4SWilliam Wang 387d200f594SWilliam Wang def isPrefetch(op: UInt): Bool = op(3) 388d200f594SWilliam Wang 389d200f594SWilliam Wang // store pipeline 390d200f594SWilliam Wang // normal store 391d200f594SWilliam Wang // bit encoding: | store 00 | size(2bit) | 392d200f594SWilliam Wang def sb = "b0000".U 393d200f594SWilliam Wang def sh = "b0001".U 394d200f594SWilliam Wang def sw = "b0010".U 395d200f594SWilliam Wang def sd = "b0011".U 396d200f594SWilliam Wang 397d200f594SWilliam Wang // l1 cache op 398d200f594SWilliam Wang // bit encoding: | cbo_zero 01 | size(2bit) 11 | 399d200f594SWilliam Wang def cbo_zero = "b0111".U 400d200f594SWilliam Wang 401d200f594SWilliam Wang // llc op 402d200f594SWilliam Wang // bit encoding: | prefetch 11 | suboptype(2bit) | 403d200f594SWilliam Wang def cbo_clean = "b1100".U 404d200f594SWilliam Wang def cbo_flush = "b1101".U 405d200f594SWilliam Wang def cbo_inval = "b1110".U 406d200f594SWilliam Wang 407d200f594SWilliam Wang def isCbo(op: UInt): Bool = op(3, 2) === "b11".U 4082225d46eSJiawei Lin 4092225d46eSJiawei Lin // atomics 4102225d46eSJiawei Lin // bit(1, 0) are size 4112225d46eSJiawei Lin // since atomics use a different fu type 4122225d46eSJiawei Lin // so we can safely reuse other load/store's encodings 413d200f594SWilliam Wang // bit encoding: | optype(4bit) | size (2bit) | 4142225d46eSJiawei Lin def lr_w = "b000010".U 4152225d46eSJiawei Lin def sc_w = "b000110".U 4162225d46eSJiawei Lin def amoswap_w = "b001010".U 4172225d46eSJiawei Lin def amoadd_w = "b001110".U 4182225d46eSJiawei Lin def amoxor_w = "b010010".U 4192225d46eSJiawei Lin def amoand_w = "b010110".U 4202225d46eSJiawei Lin def amoor_w = "b011010".U 4212225d46eSJiawei Lin def amomin_w = "b011110".U 4222225d46eSJiawei Lin def amomax_w = "b100010".U 4232225d46eSJiawei Lin def amominu_w = "b100110".U 4242225d46eSJiawei Lin def amomaxu_w = "b101010".U 4252225d46eSJiawei Lin 4262225d46eSJiawei Lin def lr_d = "b000011".U 4272225d46eSJiawei Lin def sc_d = "b000111".U 4282225d46eSJiawei Lin def amoswap_d = "b001011".U 4292225d46eSJiawei Lin def amoadd_d = "b001111".U 4302225d46eSJiawei Lin def amoxor_d = "b010011".U 4312225d46eSJiawei Lin def amoand_d = "b010111".U 4322225d46eSJiawei Lin def amoor_d = "b011011".U 4332225d46eSJiawei Lin def amomin_d = "b011111".U 4342225d46eSJiawei Lin def amomax_d = "b100011".U 4352225d46eSJiawei Lin def amominu_d = "b100111".U 4362225d46eSJiawei Lin def amomaxu_d = "b101011".U 437b6982e83SLemover 438b6982e83SLemover def size(op: UInt) = op(1,0) 4392225d46eSJiawei Lin } 4402225d46eSJiawei Lin 4413feeca58Szfw object BKUOpType { 442ee8ff153Szfw 4433feeca58Szfw def clmul = "b000000".U 4443feeca58Szfw def clmulh = "b000001".U 4453feeca58Szfw def clmulr = "b000010".U 4463feeca58Szfw def xpermn = "b000100".U 4473feeca58Szfw def xpermb = "b000101".U 448ee8ff153Szfw 4493feeca58Szfw def clz = "b001000".U 4503feeca58Szfw def clzw = "b001001".U 4513feeca58Szfw def ctz = "b001010".U 4523feeca58Szfw def ctzw = "b001011".U 4533feeca58Szfw def cpop = "b001100".U 4543feeca58Szfw def cpopw = "b001101".U 45507596dc6Szfw 4563feeca58Szfw // 01xxxx is reserve 4573feeca58Szfw def aes64es = "b100000".U 4583feeca58Szfw def aes64esm = "b100001".U 4593feeca58Szfw def aes64ds = "b100010".U 4603feeca58Szfw def aes64dsm = "b100011".U 4613feeca58Szfw def aes64im = "b100100".U 4623feeca58Szfw def aes64ks1i = "b100101".U 4633feeca58Szfw def aes64ks2 = "b100110".U 4643feeca58Szfw 4653feeca58Szfw // merge to two instruction sm4ks & sm4ed 46619bcce38SFawang Zhang def sm4ed0 = "b101000".U 46719bcce38SFawang Zhang def sm4ed1 = "b101001".U 46819bcce38SFawang Zhang def sm4ed2 = "b101010".U 46919bcce38SFawang Zhang def sm4ed3 = "b101011".U 47019bcce38SFawang Zhang def sm4ks0 = "b101100".U 47119bcce38SFawang Zhang def sm4ks1 = "b101101".U 47219bcce38SFawang Zhang def sm4ks2 = "b101110".U 47319bcce38SFawang Zhang def sm4ks3 = "b101111".U 4743feeca58Szfw 4753feeca58Szfw def sha256sum0 = "b110000".U 4763feeca58Szfw def sha256sum1 = "b110001".U 4773feeca58Szfw def sha256sig0 = "b110010".U 4783feeca58Szfw def sha256sig1 = "b110011".U 4793feeca58Szfw def sha512sum0 = "b110100".U 4803feeca58Szfw def sha512sum1 = "b110101".U 4813feeca58Szfw def sha512sig0 = "b110110".U 4823feeca58Szfw def sha512sig1 = "b110111".U 4833feeca58Szfw 4843feeca58Szfw def sm3p0 = "b111000".U 4853feeca58Szfw def sm3p1 = "b111001".U 486ee8ff153Szfw } 487ee8ff153Szfw 4882225d46eSJiawei Lin object BTBtype { 4892225d46eSJiawei Lin def B = "b00".U // branch 4902225d46eSJiawei Lin def J = "b01".U // jump 4912225d46eSJiawei Lin def I = "b10".U // indirect 4922225d46eSJiawei Lin def R = "b11".U // return 4932225d46eSJiawei Lin 4942225d46eSJiawei Lin def apply() = UInt(2.W) 4952225d46eSJiawei Lin } 4962225d46eSJiawei Lin 4972225d46eSJiawei Lin object SelImm { 498ee8ff153Szfw def IMM_X = "b0111".U 499ee8ff153Szfw def IMM_S = "b0000".U 500ee8ff153Szfw def IMM_SB = "b0001".U 501ee8ff153Szfw def IMM_U = "b0010".U 502ee8ff153Szfw def IMM_UJ = "b0011".U 503ee8ff153Szfw def IMM_I = "b0100".U 504ee8ff153Szfw def IMM_Z = "b0101".U 505ee8ff153Szfw def INVALID_INSTR = "b0110".U 506ee8ff153Szfw def IMM_B6 = "b1000".U 5072225d46eSJiawei Lin 50858c35d23Shuxuan0307 def IMM_OPIVIS = "b1001".U 50958c35d23Shuxuan0307 def IMM_OPIVIU = "b1010".U 510912e2179SXuan Hu def IMM_VSETVLI = "b1100".U 511912e2179SXuan Hu def IMM_VSETIVLI = "b1101".U 51258c35d23Shuxuan0307 51357a10886SXuan Hu def X = BitPat("b0000") 5146e7c9679Shuxuan0307 515ee8ff153Szfw def apply() = UInt(4.W) 5162225d46eSJiawei Lin } 5172225d46eSJiawei Lin 5186ab6918fSYinan Xu object ExceptionNO { 5196ab6918fSYinan Xu def instrAddrMisaligned = 0 5206ab6918fSYinan Xu def instrAccessFault = 1 5216ab6918fSYinan Xu def illegalInstr = 2 5226ab6918fSYinan Xu def breakPoint = 3 5236ab6918fSYinan Xu def loadAddrMisaligned = 4 5246ab6918fSYinan Xu def loadAccessFault = 5 5256ab6918fSYinan Xu def storeAddrMisaligned = 6 5266ab6918fSYinan Xu def storeAccessFault = 7 5276ab6918fSYinan Xu def ecallU = 8 5286ab6918fSYinan Xu def ecallS = 9 5296ab6918fSYinan Xu def ecallM = 11 5306ab6918fSYinan Xu def instrPageFault = 12 5316ab6918fSYinan Xu def loadPageFault = 13 5326ab6918fSYinan Xu // def singleStep = 14 5336ab6918fSYinan Xu def storePageFault = 15 5346ab6918fSYinan Xu def priorities = Seq( 5356ab6918fSYinan Xu breakPoint, // TODO: different BP has different priority 5366ab6918fSYinan Xu instrPageFault, 5376ab6918fSYinan Xu instrAccessFault, 5386ab6918fSYinan Xu illegalInstr, 5396ab6918fSYinan Xu instrAddrMisaligned, 5406ab6918fSYinan Xu ecallM, ecallS, ecallU, 541d880177dSYinan Xu storeAddrMisaligned, 542d880177dSYinan Xu loadAddrMisaligned, 5436ab6918fSYinan Xu storePageFault, 5446ab6918fSYinan Xu loadPageFault, 5456ab6918fSYinan Xu storeAccessFault, 546d880177dSYinan Xu loadAccessFault 5476ab6918fSYinan Xu ) 5486ab6918fSYinan Xu def all = priorities.distinct.sorted 5496ab6918fSYinan Xu def frontendSet = Seq( 5506ab6918fSYinan Xu instrAddrMisaligned, 5516ab6918fSYinan Xu instrAccessFault, 5526ab6918fSYinan Xu illegalInstr, 5536ab6918fSYinan Xu instrPageFault 5546ab6918fSYinan Xu ) 5556ab6918fSYinan Xu def partialSelect(vec: Vec[Bool], select: Seq[Int]): Vec[Bool] = { 5566ab6918fSYinan Xu val new_vec = Wire(ExceptionVec()) 5576ab6918fSYinan Xu new_vec.foreach(_ := false.B) 5586ab6918fSYinan Xu select.foreach(i => new_vec(i) := vec(i)) 5596ab6918fSYinan Xu new_vec 5606ab6918fSYinan Xu } 5616ab6918fSYinan Xu def selectFrontend(vec: Vec[Bool]): Vec[Bool] = partialSelect(vec, frontendSet) 5626ab6918fSYinan Xu def selectAll(vec: Vec[Bool]): Vec[Bool] = partialSelect(vec, ExceptionNO.all) 5636ab6918fSYinan Xu def selectByFu(vec:Vec[Bool], fuConfig: FuConfig): Vec[Bool] = 5646ab6918fSYinan Xu partialSelect(vec, fuConfig.exceptionOut) 5656ab6918fSYinan Xu } 5669a2e6b8aSLinJiawei} 567