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 279d91483a6Sfdy object VSETOpType { 280*a8db15d8Sfdy val setVlmaxBit = 0 281*a8db15d8Sfdy val keepVlBit = 1 282*a8db15d8Sfdy // destTypeBit == 0: write vl to rd 283*a8db15d8Sfdy // destTypeBit == 1: write vconfig 284*a8db15d8Sfdy val destTypeBit = 5 285*a8db15d8Sfdy 286a32c56f4SXuan Hu // vsetvli's uop 287a32c56f4SXuan Hu // rs1!=x0, normal 288a32c56f4SXuan Hu // uop0: r(rs1), w(vconfig) | x[rs1],vtypei -> vconfig 289a32c56f4SXuan Hu // uop1: r(rs1), w(rd) | x[rs1],vtypei -> x[rd] 290a32c56f4SXuan Hu def uvsetvcfg_xi = "b1010_0000".U 291a32c56f4SXuan Hu def uvsetrd_xi = "b1000_0000".U 292a32c56f4SXuan Hu // rs1==x0, rd!=x0, set vl to vlmax, set rd to vlmax, set vtype 293a32c56f4SXuan Hu // uop0: w(vconfig) | vlmax, vtypei -> vconfig 294a32c56f4SXuan Hu // uop1: w(rd) | vlmax, vtypei -> x[rd] 295a32c56f4SXuan Hu def uvsetvcfg_vlmax_i = "b1010_0001".U 296a32c56f4SXuan Hu def uvsetrd_vlmax_i = "b1000_0001".U 297a32c56f4SXuan Hu // rs1==x0, rd==x0, keep vl, set vtype 298a32c56f4SXuan Hu // uop0: r(vconfig), w(vconfig) | ld_vconfig.vl, vtypei -> vconfig 299a32c56f4SXuan Hu def uvsetvcfg_keep_v = "b1010_0010".U 300d91483a6Sfdy 301a32c56f4SXuan Hu // vsetvl's uop 302a32c56f4SXuan Hu // rs1!=x0, normal 303a32c56f4SXuan Hu // uop0: r(rs1,rs2), w(vconfig) | x[rs1],x[rs2] -> vconfig 304a32c56f4SXuan Hu // uop1: r(rs1,rs2), w(rd) | x[rs1],x[rs2] -> x[rd] 305a32c56f4SXuan Hu def uvsetvcfg_xx = "b0110_0000".U 306a32c56f4SXuan Hu def uvsetrd_xx = "b0100_0000".U 307a32c56f4SXuan Hu // rs1==x0, rd!=x0, set vl to vlmax, set rd to vlmax, set vtype 308a32c56f4SXuan Hu // uop0: r(rs2), w(vconfig) | vlmax, vtypei -> vconfig 309a32c56f4SXuan Hu // uop1: r(rs2), w(rd) | vlmax, vtypei -> x[rd] 310a32c56f4SXuan Hu def uvsetvcfg_vlmax_x = "b0110_0001".U 311a32c56f4SXuan Hu def uvsetrd_vlmax_x = "b0100_0001".U 312a32c56f4SXuan Hu // rs1==x0, rd==x0, keep vl, set vtype 313a32c56f4SXuan Hu // uop0: r(rs2), w(vtmp) | x[rs2] -> vtmp 314a32c56f4SXuan Hu // uop0: r(vconfig,vtmp), w(vconfig) | old_vconfig.vl, vtmp -> vconfig 315a32c56f4SXuan Hu def uvmv_v_x = "b0110_0010".U 316a32c56f4SXuan Hu def uvsetvcfg_vv = "b0111_0010".U 317a32c56f4SXuan Hu 318a32c56f4SXuan Hu // vsetivli's uop 319a32c56f4SXuan Hu // uop0: w(vconfig) | vli, vtypei -> vconfig 320a32c56f4SXuan Hu // uop1: w(rd) | vli, vtypei -> x[rd] 321a32c56f4SXuan Hu def uvsetvcfg_ii = "b0010_0000".U 322a32c56f4SXuan Hu def uvsetrd_ii = "b0000_0000".U 323a32c56f4SXuan Hu 324a32c56f4SXuan Hu def isVsetvl (func: UInt) = func(6) 325a32c56f4SXuan Hu def isVsetvli (func: UInt) = func(7) 326a32c56f4SXuan Hu def isVsetivli(func: UInt) = func(7, 6) === 0.U 327a32c56f4SXuan Hu def isNormal (func: UInt) = func(1, 0) === 0.U 328*a8db15d8Sfdy def isSetVlmax(func: UInt) = func(setVlmaxBit) 329*a8db15d8Sfdy def isKeepVl (func: UInt) = func(keepVlBit) 330a32c56f4SXuan Hu // RG: region 331a32c56f4SXuan Hu def writeIntRG(func: UInt) = !func(5) 332a32c56f4SXuan Hu def writeVecRG(func: UInt) = func(5) 333a32c56f4SXuan Hu def readIntRG (func: UInt) = !func(4) 334a32c56f4SXuan Hu def readVecRG (func: UInt) = func(4) 335*a8db15d8Sfdy // modify fuOpType 336*a8db15d8Sfdy def switchDest(func: UInt) = func ^ (1 << destTypeBit).U 337*a8db15d8Sfdy def keepVl(func: UInt) = func | (1 << keepVlBit).U 338*a8db15d8Sfdy def setVlmax(func: UInt) = func | (1 << setVlmaxBit).U 339d91483a6Sfdy } 340d91483a6Sfdy 3413b739f49SXuan Hu object BRUOpType { 3423b739f49SXuan Hu // branch 3433b739f49SXuan Hu def beq = "b000_000".U 3443b739f49SXuan Hu def bne = "b000_001".U 3453b739f49SXuan Hu def blt = "b000_100".U 3463b739f49SXuan Hu def bge = "b000_101".U 3473b739f49SXuan Hu def bltu = "b001_000".U 3483b739f49SXuan Hu def bgeu = "b001_001".U 3493b739f49SXuan Hu 3503b739f49SXuan Hu def getBranchType(func: UInt) = func(3, 1) 3513b739f49SXuan Hu def isBranchInvert(func: UInt) = func(0) 3523b739f49SXuan Hu } 3533b739f49SXuan Hu 3543b739f49SXuan Hu object MULOpType { 3553b739f49SXuan Hu // mul 3563b739f49SXuan Hu // bit encoding: | type (2bit) | isWord(1bit) | opcode(2bit) | 3573b739f49SXuan Hu def mul = "b00000".U 3583b739f49SXuan Hu def mulh = "b00001".U 3593b739f49SXuan Hu def mulhsu = "b00010".U 3603b739f49SXuan Hu def mulhu = "b00011".U 3613b739f49SXuan Hu def mulw = "b00100".U 3623b739f49SXuan Hu 3633b739f49SXuan Hu def mulw7 = "b01100".U 3643b739f49SXuan Hu def isSign(op: UInt) = !op(1) 3653b739f49SXuan Hu def isW(op: UInt) = op(2) 3663b739f49SXuan Hu def isH(op: UInt) = op(1, 0) =/= 0.U 3673b739f49SXuan Hu def getOp(op: UInt) = Cat(op(3), op(1, 0)) 3683b739f49SXuan Hu } 3693b739f49SXuan Hu 3703b739f49SXuan Hu object DIVOpType { 3713b739f49SXuan Hu // div 3723b739f49SXuan Hu // bit encoding: | type (2bit) | isWord(1bit) | isSign(1bit) | opcode(1bit) | 3733b739f49SXuan Hu def div = "b10000".U 3743b739f49SXuan Hu def divu = "b10010".U 3753b739f49SXuan Hu def rem = "b10001".U 3763b739f49SXuan Hu def remu = "b10011".U 3773b739f49SXuan Hu 3783b739f49SXuan Hu def divw = "b10100".U 3793b739f49SXuan Hu def divuw = "b10110".U 3803b739f49SXuan Hu def remw = "b10101".U 3813b739f49SXuan Hu def remuw = "b10111".U 3823b739f49SXuan Hu 3833b739f49SXuan Hu def isSign(op: UInt) = !op(1) 3843b739f49SXuan Hu def isW(op: UInt) = op(2) 3853b739f49SXuan Hu def isH(op: UInt) = op(0) 3863b739f49SXuan Hu } 3873b739f49SXuan Hu 3882225d46eSJiawei Lin object MDUOpType { 3892225d46eSJiawei Lin // mul 3902225d46eSJiawei Lin // bit encoding: | type (2bit) | isWord(1bit) | opcode(2bit) | 3912225d46eSJiawei Lin def mul = "b00000".U 3922225d46eSJiawei Lin def mulh = "b00001".U 3932225d46eSJiawei Lin def mulhsu = "b00010".U 3942225d46eSJiawei Lin def mulhu = "b00011".U 3952225d46eSJiawei Lin def mulw = "b00100".U 3962225d46eSJiawei Lin 39788825c5cSYinan Xu def mulw7 = "b01100".U 39888825c5cSYinan Xu 3992225d46eSJiawei Lin // div 4002225d46eSJiawei Lin // bit encoding: | type (2bit) | isWord(1bit) | isSign(1bit) | opcode(1bit) | 40188825c5cSYinan Xu def div = "b10000".U 40288825c5cSYinan Xu def divu = "b10010".U 40388825c5cSYinan Xu def rem = "b10001".U 40488825c5cSYinan Xu def remu = "b10011".U 4052225d46eSJiawei Lin 40688825c5cSYinan Xu def divw = "b10100".U 40788825c5cSYinan Xu def divuw = "b10110".U 40888825c5cSYinan Xu def remw = "b10101".U 40988825c5cSYinan Xu def remuw = "b10111".U 4102225d46eSJiawei Lin 41188825c5cSYinan Xu def isMul(op: UInt) = !op(4) 41288825c5cSYinan Xu def isDiv(op: UInt) = op(4) 4132225d46eSJiawei Lin 4142225d46eSJiawei Lin def isDivSign(op: UInt) = isDiv(op) && !op(1) 4152225d46eSJiawei Lin def isW(op: UInt) = op(2) 4162225d46eSJiawei Lin def isH(op: UInt) = (isDiv(op) && op(0)) || (isMul(op) && op(1, 0) =/= 0.U) 4172225d46eSJiawei Lin def getMulOp(op: UInt) = op(1, 0) 4182225d46eSJiawei Lin } 4192225d46eSJiawei Lin 4202225d46eSJiawei Lin object LSUOpType { 421d200f594SWilliam Wang // load pipeline 4222225d46eSJiawei Lin 423d200f594SWilliam Wang // normal load 424d200f594SWilliam Wang // Note: bit(1, 0) are size, DO NOT CHANGE 425d200f594SWilliam Wang // bit encoding: | load 0 | is unsigned(1bit) | size(2bit) | 426d200f594SWilliam Wang def lb = "b0000".U 427d200f594SWilliam Wang def lh = "b0001".U 428d200f594SWilliam Wang def lw = "b0010".U 429d200f594SWilliam Wang def ld = "b0011".U 430d200f594SWilliam Wang def lbu = "b0100".U 431d200f594SWilliam Wang def lhu = "b0101".U 432d200f594SWilliam Wang def lwu = "b0110".U 433ca18a0b4SWilliam Wang 434d200f594SWilliam Wang // Zicbop software prefetch 435d200f594SWilliam Wang // bit encoding: | prefetch 1 | 0 | prefetch type (2bit) | 436d200f594SWilliam Wang def prefetch_i = "b1000".U // TODO 437d200f594SWilliam Wang def prefetch_r = "b1001".U 438d200f594SWilliam Wang def prefetch_w = "b1010".U 439ca18a0b4SWilliam Wang 440d200f594SWilliam Wang def isPrefetch(op: UInt): Bool = op(3) 441d200f594SWilliam Wang 442d200f594SWilliam Wang // store pipeline 443d200f594SWilliam Wang // normal store 444d200f594SWilliam Wang // bit encoding: | store 00 | size(2bit) | 445d200f594SWilliam Wang def sb = "b0000".U 446d200f594SWilliam Wang def sh = "b0001".U 447d200f594SWilliam Wang def sw = "b0010".U 448d200f594SWilliam Wang def sd = "b0011".U 449d200f594SWilliam Wang 450d200f594SWilliam Wang // l1 cache op 451d200f594SWilliam Wang // bit encoding: | cbo_zero 01 | size(2bit) 11 | 452d200f594SWilliam Wang def cbo_zero = "b0111".U 453d200f594SWilliam Wang 454d200f594SWilliam Wang // llc op 455d200f594SWilliam Wang // bit encoding: | prefetch 11 | suboptype(2bit) | 456d200f594SWilliam Wang def cbo_clean = "b1100".U 457d200f594SWilliam Wang def cbo_flush = "b1101".U 458d200f594SWilliam Wang def cbo_inval = "b1110".U 459d200f594SWilliam Wang 460d200f594SWilliam Wang def isCbo(op: UInt): Bool = op(3, 2) === "b11".U 4612225d46eSJiawei Lin 4622225d46eSJiawei Lin // atomics 4632225d46eSJiawei Lin // bit(1, 0) are size 4642225d46eSJiawei Lin // since atomics use a different fu type 4652225d46eSJiawei Lin // so we can safely reuse other load/store's encodings 466d200f594SWilliam Wang // bit encoding: | optype(4bit) | size (2bit) | 4672225d46eSJiawei Lin def lr_w = "b000010".U 4682225d46eSJiawei Lin def sc_w = "b000110".U 4692225d46eSJiawei Lin def amoswap_w = "b001010".U 4702225d46eSJiawei Lin def amoadd_w = "b001110".U 4712225d46eSJiawei Lin def amoxor_w = "b010010".U 4722225d46eSJiawei Lin def amoand_w = "b010110".U 4732225d46eSJiawei Lin def amoor_w = "b011010".U 4742225d46eSJiawei Lin def amomin_w = "b011110".U 4752225d46eSJiawei Lin def amomax_w = "b100010".U 4762225d46eSJiawei Lin def amominu_w = "b100110".U 4772225d46eSJiawei Lin def amomaxu_w = "b101010".U 4782225d46eSJiawei Lin 4792225d46eSJiawei Lin def lr_d = "b000011".U 4802225d46eSJiawei Lin def sc_d = "b000111".U 4812225d46eSJiawei Lin def amoswap_d = "b001011".U 4822225d46eSJiawei Lin def amoadd_d = "b001111".U 4832225d46eSJiawei Lin def amoxor_d = "b010011".U 4842225d46eSJiawei Lin def amoand_d = "b010111".U 4852225d46eSJiawei Lin def amoor_d = "b011011".U 4862225d46eSJiawei Lin def amomin_d = "b011111".U 4872225d46eSJiawei Lin def amomax_d = "b100011".U 4882225d46eSJiawei Lin def amominu_d = "b100111".U 4892225d46eSJiawei Lin def amomaxu_d = "b101011".U 490b6982e83SLemover 491b6982e83SLemover def size(op: UInt) = op(1,0) 4922225d46eSJiawei Lin } 4932225d46eSJiawei Lin 4943feeca58Szfw object BKUOpType { 495ee8ff153Szfw 4963feeca58Szfw def clmul = "b000000".U 4973feeca58Szfw def clmulh = "b000001".U 4983feeca58Szfw def clmulr = "b000010".U 4993feeca58Szfw def xpermn = "b000100".U 5003feeca58Szfw def xpermb = "b000101".U 501ee8ff153Szfw 5023feeca58Szfw def clz = "b001000".U 5033feeca58Szfw def clzw = "b001001".U 5043feeca58Szfw def ctz = "b001010".U 5053feeca58Szfw def ctzw = "b001011".U 5063feeca58Szfw def cpop = "b001100".U 5073feeca58Szfw def cpopw = "b001101".U 50807596dc6Szfw 5093feeca58Szfw // 01xxxx is reserve 5103feeca58Szfw def aes64es = "b100000".U 5113feeca58Szfw def aes64esm = "b100001".U 5123feeca58Szfw def aes64ds = "b100010".U 5133feeca58Szfw def aes64dsm = "b100011".U 5143feeca58Szfw def aes64im = "b100100".U 5153feeca58Szfw def aes64ks1i = "b100101".U 5163feeca58Szfw def aes64ks2 = "b100110".U 5173feeca58Szfw 5183feeca58Szfw // merge to two instruction sm4ks & sm4ed 51919bcce38SFawang Zhang def sm4ed0 = "b101000".U 52019bcce38SFawang Zhang def sm4ed1 = "b101001".U 52119bcce38SFawang Zhang def sm4ed2 = "b101010".U 52219bcce38SFawang Zhang def sm4ed3 = "b101011".U 52319bcce38SFawang Zhang def sm4ks0 = "b101100".U 52419bcce38SFawang Zhang def sm4ks1 = "b101101".U 52519bcce38SFawang Zhang def sm4ks2 = "b101110".U 52619bcce38SFawang Zhang def sm4ks3 = "b101111".U 5273feeca58Szfw 5283feeca58Szfw def sha256sum0 = "b110000".U 5293feeca58Szfw def sha256sum1 = "b110001".U 5303feeca58Szfw def sha256sig0 = "b110010".U 5313feeca58Szfw def sha256sig1 = "b110011".U 5323feeca58Szfw def sha512sum0 = "b110100".U 5333feeca58Szfw def sha512sum1 = "b110101".U 5343feeca58Szfw def sha512sig0 = "b110110".U 5353feeca58Szfw def sha512sig1 = "b110111".U 5363feeca58Szfw 5373feeca58Szfw def sm3p0 = "b111000".U 5383feeca58Szfw def sm3p1 = "b111001".U 539ee8ff153Szfw } 540ee8ff153Szfw 5412225d46eSJiawei Lin object BTBtype { 5422225d46eSJiawei Lin def B = "b00".U // branch 5432225d46eSJiawei Lin def J = "b01".U // jump 5442225d46eSJiawei Lin def I = "b10".U // indirect 5452225d46eSJiawei Lin def R = "b11".U // return 5462225d46eSJiawei Lin 5472225d46eSJiawei Lin def apply() = UInt(2.W) 5482225d46eSJiawei Lin } 5492225d46eSJiawei Lin 5502225d46eSJiawei Lin object SelImm { 551ee8ff153Szfw def IMM_X = "b0111".U 552d91483a6Sfdy def IMM_S = "b1110".U 553ee8ff153Szfw def IMM_SB = "b0001".U 554ee8ff153Szfw def IMM_U = "b0010".U 555ee8ff153Szfw def IMM_UJ = "b0011".U 556ee8ff153Szfw def IMM_I = "b0100".U 557ee8ff153Szfw def IMM_Z = "b0101".U 558ee8ff153Szfw def INVALID_INSTR = "b0110".U 559ee8ff153Szfw def IMM_B6 = "b1000".U 5602225d46eSJiawei Lin 56158c35d23Shuxuan0307 def IMM_OPIVIS = "b1001".U 56258c35d23Shuxuan0307 def IMM_OPIVIU = "b1010".U 563912e2179SXuan Hu def IMM_VSETVLI = "b1100".U 564912e2179SXuan Hu def IMM_VSETIVLI = "b1101".U 56558c35d23Shuxuan0307 56657a10886SXuan Hu def X = BitPat("b0000") 5676e7c9679Shuxuan0307 568ee8ff153Szfw def apply() = UInt(4.W) 5692225d46eSJiawei Lin } 5702225d46eSJiawei Lin 571d91483a6Sfdy object UopDivType { 572d91483a6Sfdy def SCA_SIM = "b000000".U // 573d91483a6Sfdy def DIR = "b010001".U // dirty: vset 574d91483a6Sfdy def VEC_VVV = "b010010".U // VEC_VVV 575d91483a6Sfdy def VEC_VXV = "b010011".U // VEC_VXV 576d91483a6Sfdy def VEC_0XV = "b010100".U // VEC_0XV 577d91483a6Sfdy def VEC_VVW = "b010101".U // VEC_VVW 578d91483a6Sfdy def VEC_WVW = "b010110".U // VEC_WVW 579d91483a6Sfdy def VEC_VXW = "b010111".U // VEC_VXW 580d91483a6Sfdy def VEC_WXW = "b011000".U // VEC_WXW 581d91483a6Sfdy def VEC_WVV = "b011001".U // VEC_WVV 582d91483a6Sfdy def VEC_WXV = "b011010".U // VEC_WXV 583d91483a6Sfdy def VEC_EXT2 = "b011011".U // VF2 0 -> V 584d91483a6Sfdy def VEC_EXT4 = "b011100".U // VF4 0 -> V 585d91483a6Sfdy def VEC_EXT8 = "b011101".U // VF8 0 -> V 586d91483a6Sfdy def VEC_VVM = "b011110".U // VEC_VVM 587d91483a6Sfdy def VEC_VXM = "b011111".U // VEC_VXM 588d91483a6Sfdy def VEC_SLIDE1UP = "b100000".U // vslide1up.vx 589d91483a6Sfdy def VEC_FSLIDE1UP = "b100001".U // vfslide1up.vf 590d91483a6Sfdy def VEC_SLIDE1DOWN = "b100010".U // vslide1down.vx 591d91483a6Sfdy def VEC_FSLIDE1DOWN = "b100011".U // vfslide1down.vf 592d91483a6Sfdy def VEC_VRED = "b100100".U // VEC_VRED 593d91483a6Sfdy def VEC_SLIDEUP = "b100101".U // VEC_SLIDEUP 594d91483a6Sfdy def VEC_ISLIDEUP = "b100110".U // VEC_ISLIDEUP 595d91483a6Sfdy def VEC_SLIDEDOWN = "b100111".U // VEC_SLIDEDOWN 596d91483a6Sfdy def VEC_ISLIDEDOWN = "b101000".U // VEC_ISLIDEDOWN 597d91483a6Sfdy def VEC_M0X = "b101001".U // VEC_M0X 0MV 598d91483a6Sfdy def VEC_MVV = "b101010".U // VEC_MVV VMV 599d91483a6Sfdy def VEC_M0X_VFIRST = "b101011".U // 600d91483a6Sfdy def VEC_M0M = "b000000".U // VEC_M0M 601d91483a6Sfdy def VEC_MMM = "b000000".U // VEC_MMM 602d91483a6Sfdy def dummy = "b111111".U 603d91483a6Sfdy 604d91483a6Sfdy def X = BitPat("b000000") 605d91483a6Sfdy 606d91483a6Sfdy def apply() = UInt(6.W) 607d91483a6Sfdy def needSplit(UopDivType: UInt) = UopDivType(4) || UopDivType(5) 608d91483a6Sfdy } 609d91483a6Sfdy 6106ab6918fSYinan Xu object ExceptionNO { 6116ab6918fSYinan Xu def instrAddrMisaligned = 0 6126ab6918fSYinan Xu def instrAccessFault = 1 6136ab6918fSYinan Xu def illegalInstr = 2 6146ab6918fSYinan Xu def breakPoint = 3 6156ab6918fSYinan Xu def loadAddrMisaligned = 4 6166ab6918fSYinan Xu def loadAccessFault = 5 6176ab6918fSYinan Xu def storeAddrMisaligned = 6 6186ab6918fSYinan Xu def storeAccessFault = 7 6196ab6918fSYinan Xu def ecallU = 8 6206ab6918fSYinan Xu def ecallS = 9 6216ab6918fSYinan Xu def ecallM = 11 6226ab6918fSYinan Xu def instrPageFault = 12 6236ab6918fSYinan Xu def loadPageFault = 13 6246ab6918fSYinan Xu // def singleStep = 14 6256ab6918fSYinan Xu def storePageFault = 15 6266ab6918fSYinan Xu def priorities = Seq( 6276ab6918fSYinan Xu breakPoint, // TODO: different BP has different priority 6286ab6918fSYinan Xu instrPageFault, 6296ab6918fSYinan Xu instrAccessFault, 6306ab6918fSYinan Xu illegalInstr, 6316ab6918fSYinan Xu instrAddrMisaligned, 6326ab6918fSYinan Xu ecallM, ecallS, ecallU, 633d880177dSYinan Xu storeAddrMisaligned, 634d880177dSYinan Xu loadAddrMisaligned, 6356ab6918fSYinan Xu storePageFault, 6366ab6918fSYinan Xu loadPageFault, 6376ab6918fSYinan Xu storeAccessFault, 638d880177dSYinan Xu loadAccessFault 6396ab6918fSYinan Xu ) 6406ab6918fSYinan Xu def all = priorities.distinct.sorted 6416ab6918fSYinan Xu def frontendSet = Seq( 6426ab6918fSYinan Xu instrAddrMisaligned, 6436ab6918fSYinan Xu instrAccessFault, 6446ab6918fSYinan Xu illegalInstr, 6456ab6918fSYinan Xu instrPageFault 6466ab6918fSYinan Xu ) 6476ab6918fSYinan Xu def partialSelect(vec: Vec[Bool], select: Seq[Int]): Vec[Bool] = { 6486ab6918fSYinan Xu val new_vec = Wire(ExceptionVec()) 6496ab6918fSYinan Xu new_vec.foreach(_ := false.B) 6506ab6918fSYinan Xu select.foreach(i => new_vec(i) := vec(i)) 6516ab6918fSYinan Xu new_vec 6526ab6918fSYinan Xu } 6536ab6918fSYinan Xu def selectFrontend(vec: Vec[Bool]): Vec[Bool] = partialSelect(vec, frontendSet) 6546ab6918fSYinan Xu def selectAll(vec: Vec[Bool]): Vec[Bool] = partialSelect(vec, ExceptionNO.all) 6556ab6918fSYinan Xu def selectByFu(vec:Vec[Bool], fuConfig: FuConfig): Vec[Bool] = 6566ab6918fSYinan Xu partialSelect(vec, fuConfig.exceptionOut) 6576ab6918fSYinan Xu } 6589a2e6b8aSLinJiawei} 659