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._ 208f3b164bSXuan Huimport xiangshan.backend.exu._ 212225d46eSJiawei Linimport xiangshan.backend.fu._ 222225d46eSJiawei Linimport xiangshan.backend.fu.fpu._ 236827759bSZhangZifeiimport xiangshan.backend.fu.vector._ 248f3b164bSXuan Huimport xiangshan.backend.issue._ 25*3b739f49SXuan Huimport xiangshan.v2backend.FuConfig 262225d46eSJiawei Lin 279a2e6b8aSLinJiaweipackage object xiangshan { 289ee9f926SYikeZhou object SrcType { 291285b047SXuan Hu def imm = "b000".U 301285b047SXuan Hu def pc = "b000".U 311285b047SXuan Hu def xp = "b001".U 321285b047SXuan Hu def fp = "b010".U 331285b047SXuan Hu def vp = "b100".U 3404b56283SZhangZifei 351285b047SXuan Hu // alias 361285b047SXuan Hu def reg = this.xp 371a3df1feSYikeZhou def DC = imm // Don't Care 3857a10886SXuan Hu def X = BitPat("b000") 394d24c305SYikeZhou 4004b56283SZhangZifei def isPc(srcType: UInt) = srcType===pc 4104b56283SZhangZifei def isImm(srcType: UInt) = srcType===imm 421285b047SXuan Hu def isReg(srcType: UInt) = srcType(0) 439ca09953SXuan Hu def isXp(srcType: UInt) = srcType(0) 442b4e8253SYinan Xu def isFp(srcType: UInt) = srcType(1) 451285b047SXuan Hu def isVp(srcType: UInt) = srcType(2) 461285b047SXuan Hu def isPcOrImm(srcType: UInt) = isPc(srcType) || isImm(srcType) 479ca09953SXuan Hu def isNotReg(srcType: UInt): Bool = !srcType.orR 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 617f2b7720SXuan Hu // Todo: Use OH instead 62*3b739f49SXuan Hu// object FuType { 63*3b739f49SXuan Hu// def jmp = (BigInt(1) << 0).U 64*3b739f49SXuan Hu// def brh = (BigInt(1) << 1).U 65*3b739f49SXuan Hu// def i2f = (BigInt(1) << 2).U 66*3b739f49SXuan Hu// def csr = (BigInt(1) << 3).U 67*3b739f49SXuan Hu// def alu = (BigInt(1) << 4).U 68*3b739f49SXuan Hu// def mul = (BigInt(1) << 5).U 69*3b739f49SXuan Hu// def div = (BigInt(1) << 6).U 70*3b739f49SXuan Hu// def fence = (BigInt(1) << 7).U 71*3b739f49SXuan Hu// def bku = (BigInt(1) << 8).U 72*3b739f49SXuan Hu// def vset = (BigInt(1) << 9).U 73*3b739f49SXuan Hu// 74*3b739f49SXuan Hu// def fmac = (BigInt(1) << 10).U 75*3b739f49SXuan Hu// def fmisc = (BigInt(1) << 11).U 76*3b739f49SXuan Hu// def fDivSqrt = (BigInt(1) << 12).U 77*3b739f49SXuan Hu// 78*3b739f49SXuan Hu// def ldu = (BigInt(1) << 13).U 79*3b739f49SXuan Hu// def stu = (BigInt(1) << 14).U 80*3b739f49SXuan Hu// def mou = (BigInt(1) << 15).U // for amo, lr, sc, fence 81*3b739f49SXuan Hu// def vipu = (BigInt(1) << 16).U 82*3b739f49SXuan Hu// def vfpu = (BigInt(1) << 17).U 83*3b739f49SXuan Hu// def vldu = (BigInt(1) << 18).U 84*3b739f49SXuan Hu// def vstu = (BigInt(1) << 19).U 85*3b739f49SXuan Hu// def X = BitPat.dontCare(num) 86*3b739f49SXuan Hu// 87*3b739f49SXuan Hu// def num = 20 88*3b739f49SXuan Hu// 89*3b739f49SXuan Hu// def apply() = UInt(log2Up(num).W) 90*3b739f49SXuan Hu// 91*3b739f49SXuan Hu// def isIntExu(fuType: UInt) = !fuType(3) 92*3b739f49SXuan Hu// def isJumpExu(fuType: UInt) = fuType === jmp 93*3b739f49SXuan Hu// def isFpExu(fuType: UInt) = fuType(3, 2) === "b10".U 94*3b739f49SXuan Hu// def isMemExu(fuType: UInt) = fuType(3, 2) === "b11".U 95*3b739f49SXuan Hu// def isLoadStore(fuType: UInt) = isMemExu(fuType) && !fuType(1) 96*3b739f49SXuan Hu// def isStoreExu(fuType: UInt) = isMemExu(fuType) && fuType(0) 97*3b739f49SXuan Hu// def isAMO(fuType: UInt) = fuType(1) 98*3b739f49SXuan Hu// def isFence(fuType: UInt) = fuType === fence 99*3b739f49SXuan Hu// def isSvinvalBegin(fuType: UInt, func: UInt, flush: Bool) = isFence(fuType) && func === FenceOpType.nofence && !flush 100*3b739f49SXuan Hu// def isSvinval(fuType: UInt, func: UInt, flush: Bool) = isFence(fuType) && func === FenceOpType.sfence && !flush 101*3b739f49SXuan Hu// def isSvinvalEnd(fuType: UInt, func: UInt, flush: Bool) = isFence(fuType) && func === FenceOpType.nofence && flush 102*3b739f49SXuan Hu// def isVpu(fuType: UInt) = fuType(4) 103*3b739f49SXuan Hu// 104*3b739f49SXuan Hu// def jmpCanAccept(fuType: UInt) = !fuType(2) 105*3b739f49SXuan Hu// def mduCanAccept(fuType: UInt) = fuType(2) && !fuType(1) || fuType(2) && fuType(1) && fuType(0) 106*3b739f49SXuan Hu// def aluCanAccept(fuType: UInt) = fuType(2) && fuType(1) && !fuType(0) 107*3b739f49SXuan Hu// 108*3b739f49SXuan Hu// def fmacCanAccept(fuType: UInt) = !fuType(1) 109*3b739f49SXuan Hu// def fmiscCanAccept(fuType: UInt) = fuType(1) 110*3b739f49SXuan Hu// 111*3b739f49SXuan Hu// def loadCanAccept(fuType: UInt) = !fuType(0) 112*3b739f49SXuan Hu// def storeCanAccept(fuType: UInt) = fuType(0) 113*3b739f49SXuan Hu// 114*3b739f49SXuan Hu// def storeIsAMO(fuType: UInt) = fuType(1) 115*3b739f49SXuan Hu// 116*3b739f49SXuan Hu// val functionNameMap = Map( 117*3b739f49SXuan Hu// jmp.litValue() -> "jmp", 118*3b739f49SXuan Hu// i2f.litValue() -> "int_to_float", 119*3b739f49SXuan Hu// csr.litValue() -> "csr", 120*3b739f49SXuan Hu// alu.litValue() -> "alu", 121*3b739f49SXuan Hu// mul.litValue() -> "mul", 122*3b739f49SXuan Hu// div.litValue() -> "div", 123*3b739f49SXuan Hu// fence.litValue() -> "fence", 124*3b739f49SXuan Hu// bku.litValue() -> "bku", 125*3b739f49SXuan Hu// fmac.litValue() -> "fmac", 126*3b739f49SXuan Hu// fmisc.litValue() -> "fmisc", 127*3b739f49SXuan Hu// fDivSqrt.litValue() -> "fdiv_fsqrt", 128*3b739f49SXuan Hu// ldu.litValue() -> "load", 129*3b739f49SXuan Hu// stu.litValue() -> "store", 130*3b739f49SXuan Hu// mou.litValue() -> "mou" 131*3b739f49SXuan Hu// ) 132*3b739f49SXuan Hu// } 1339a2e6b8aSLinJiawei 13457a10886SXuan Hu def FuOpTypeWidth = 8 1352225d46eSJiawei Lin object FuOpType { 13657a10886SXuan Hu def apply() = UInt(FuOpTypeWidth.W) 13757a10886SXuan Hu def X = BitPat("b00000000") 138ebd97ecbSzhanglinjuan } 139518d8658SYinan Xu 1403a2e64c4SZhangZifei // move VipuType and VfpuType into YunSuan/package.scala 1413a2e64c4SZhangZifei // object VipuType { 1423a2e64c4SZhangZifei // def dummy = 0.U(7.W) 1433a2e64c4SZhangZifei // } 1447f2b7720SXuan Hu 1453a2e64c4SZhangZifei // object VfpuType { 1463a2e64c4SZhangZifei // def dummy = 0.U(7.W) 1473a2e64c4SZhangZifei // } 1487f2b7720SXuan Hu 1497f2b7720SXuan Hu object VlduType { 15057a10886SXuan Hu def dummy = 0.U 1517f2b7720SXuan Hu } 1527f2b7720SXuan Hu 1537f2b7720SXuan Hu object VstuType { 15457a10886SXuan Hu def dummy = 0.U 1557f2b7720SXuan Hu } 1567f2b7720SXuan Hu 157a3edac52SYinan Xu object CommitType { 158c3abb8b6SYinan Xu def NORMAL = "b000".U // int/fp 159c3abb8b6SYinan Xu def BRANCH = "b001".U // branch 160c3abb8b6SYinan Xu def LOAD = "b010".U // load 161c3abb8b6SYinan Xu def STORE = "b011".U // store 162518d8658SYinan Xu 163c3abb8b6SYinan Xu def apply() = UInt(3.W) 164c3abb8b6SYinan Xu def isFused(commitType: UInt): Bool = commitType(2) 165c3abb8b6SYinan Xu def isLoadStore(commitType: UInt): Bool = !isFused(commitType) && commitType(1) 166c3abb8b6SYinan Xu def lsInstIsStore(commitType: UInt): Bool = commitType(0) 167c3abb8b6SYinan Xu def isStore(commitType: UInt): Bool = isLoadStore(commitType) && lsInstIsStore(commitType) 168c3abb8b6SYinan Xu def isBranch(commitType: UInt): Bool = commitType(0) && !commitType(1) && !isFused(commitType) 169518d8658SYinan Xu } 170bfb958a3SYinan Xu 171bfb958a3SYinan Xu object RedirectLevel { 1722d7c7105SYinan Xu def flushAfter = "b0".U 1732d7c7105SYinan Xu def flush = "b1".U 174bfb958a3SYinan Xu 1752d7c7105SYinan Xu def apply() = UInt(1.W) 1762d7c7105SYinan Xu // def isUnconditional(level: UInt) = level(1) 177bfb958a3SYinan Xu def flushItself(level: UInt) = level(0) 1782d7c7105SYinan Xu // def isException(level: UInt) = level(1) && level(0) 179bfb958a3SYinan Xu } 180baf8def6SYinan Xu 181baf8def6SYinan Xu object ExceptionVec { 182baf8def6SYinan Xu def apply() = Vec(16, Bool()) 183baf8def6SYinan Xu } 184a8e04b1dSYinan Xu 185c60c1ab4SWilliam Wang object PMAMode { 1868d9a04fcSWilliam Wang def R = "b1".U << 0 //readable 1878d9a04fcSWilliam Wang def W = "b1".U << 1 //writeable 1888d9a04fcSWilliam Wang def X = "b1".U << 2 //executable 1898d9a04fcSWilliam Wang def I = "b1".U << 3 //cacheable: icache 1908d9a04fcSWilliam Wang def D = "b1".U << 4 //cacheable: dcache 1918d9a04fcSWilliam Wang def S = "b1".U << 5 //enable speculative access 192cff68e26SWilliam Wang def A = "b1".U << 6 //enable atomic operation, A imply R & W 1938d9a04fcSWilliam Wang def C = "b1".U << 7 //if it is cacheable is configable 194c60c1ab4SWilliam Wang def Reserved = "b0".U 195c60c1ab4SWilliam Wang 196c60c1ab4SWilliam Wang def apply() = UInt(7.W) 197c60c1ab4SWilliam Wang 198c60c1ab4SWilliam Wang def read(mode: UInt) = mode(0) 199c60c1ab4SWilliam Wang def write(mode: UInt) = mode(1) 200c60c1ab4SWilliam Wang def execute(mode: UInt) = mode(2) 201c60c1ab4SWilliam Wang def icache(mode: UInt) = mode(3) 202c60c1ab4SWilliam Wang def dcache(mode: UInt) = mode(4) 203c60c1ab4SWilliam Wang def speculate(mode: UInt) = mode(5) 204c60c1ab4SWilliam Wang def atomic(mode: UInt) = mode(6) 205c60c1ab4SWilliam Wang def configable_cache(mode: UInt) = mode(7) 206c60c1ab4SWilliam Wang 207c60c1ab4SWilliam Wang def strToMode(s: String) = { 208423b9255SWilliam Wang var result = 0.U(8.W) 209c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("R") >= 0) result = result + R 210c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("W") >= 0) result = result + W 211c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("X") >= 0) result = result + X 212c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("I") >= 0) result = result + I 213c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("D") >= 0) result = result + D 214c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("S") >= 0) result = result + S 215c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("A") >= 0) result = result + A 216c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("C") >= 0) result = result + C 217c60c1ab4SWilliam Wang result 218c60c1ab4SWilliam Wang } 219c60c1ab4SWilliam Wang } 2202225d46eSJiawei Lin 2212225d46eSJiawei Lin 2222225d46eSJiawei Lin object CSROpType { 2232225d46eSJiawei Lin def jmp = "b000".U 2242225d46eSJiawei Lin def wrt = "b001".U 2252225d46eSJiawei Lin def set = "b010".U 2262225d46eSJiawei Lin def clr = "b011".U 227b6900d94SYinan Xu def wfi = "b100".U 2282225d46eSJiawei Lin def wrti = "b101".U 2292225d46eSJiawei Lin def seti = "b110".U 2302225d46eSJiawei Lin def clri = "b111".U 2315d669833SYinan Xu def needAccess(op: UInt): Bool = op(1, 0) =/= 0.U 2322225d46eSJiawei Lin } 2332225d46eSJiawei Lin 2342225d46eSJiawei Lin // jump 2352225d46eSJiawei Lin object JumpOpType { 2362225d46eSJiawei Lin def jal = "b00".U 2372225d46eSJiawei Lin def jalr = "b01".U 2382225d46eSJiawei Lin def auipc = "b10".U 2392225d46eSJiawei Lin// def call = "b11_011".U 2402225d46eSJiawei Lin// def ret = "b11_100".U 2412225d46eSJiawei Lin def jumpOpisJalr(op: UInt) = op(0) 2422225d46eSJiawei Lin def jumpOpisAuipc(op: UInt) = op(1) 2432225d46eSJiawei Lin } 2442225d46eSJiawei Lin 2452225d46eSJiawei Lin object FenceOpType { 2462225d46eSJiawei Lin def fence = "b10000".U 2472225d46eSJiawei Lin def sfence = "b10001".U 2482225d46eSJiawei Lin def fencei = "b10010".U 249af2f7849Shappy-lx def nofence= "b00000".U 2502225d46eSJiawei Lin } 2512225d46eSJiawei Lin 2522225d46eSJiawei Lin object ALUOpType { 253ee8ff153Szfw // shift optype 254675acc68SYinan Xu def slliuw = "b000_0000".U // slliuw: ZEXT(src1[31:0]) << shamt 255675acc68SYinan Xu def sll = "b000_0001".U // sll: src1 << src2 256ee8ff153Szfw 257675acc68SYinan Xu def bclr = "b000_0010".U // bclr: src1 & ~(1 << src2[5:0]) 258675acc68SYinan Xu def bset = "b000_0011".U // bset: src1 | (1 << src2[5:0]) 259675acc68SYinan Xu def binv = "b000_0100".U // binv: src1 ^ ~(1 << src2[5:0]) 260ee8ff153Szfw 261675acc68SYinan Xu def srl = "b000_0101".U // srl: src1 >> src2 262675acc68SYinan Xu def bext = "b000_0110".U // bext: (src1 >> src2)[0] 263675acc68SYinan Xu def sra = "b000_0111".U // sra: src1 >> src2 (arithmetic) 264ee8ff153Szfw 2657b441e5eSYinan Xu def rol = "b000_1001".U // rol: (src1 << src2) | (src1 >> (xlen - src2)) 2667b441e5eSYinan Xu def ror = "b000_1011".U // ror: (src1 >> src2) | (src1 << (xlen - src2)) 267184a1958Szfw 268ee8ff153Szfw // RV64 32bit optype 269675acc68SYinan Xu def addw = "b001_0000".U // addw: SEXT((src1 + src2)[31:0]) 270675acc68SYinan Xu def oddaddw = "b001_0001".U // oddaddw: SEXT((src1[0] + src2)[31:0]) 271675acc68SYinan Xu def subw = "b001_0010".U // subw: SEXT((src1 - src2)[31:0]) 272ee8ff153Szfw 273675acc68SYinan Xu def addwbit = "b001_0100".U // addwbit: (src1 + src2)[0] 274675acc68SYinan Xu def addwbyte = "b001_0101".U // addwbyte: (src1 + src2)[7:0] 275675acc68SYinan Xu def addwzexth = "b001_0110".U // addwzexth: ZEXT((src1 + src2)[15:0]) 276675acc68SYinan Xu def addwsexth = "b001_0111".U // addwsexth: SEXT((src1 + src2)[15:0]) 277ee8ff153Szfw 278675acc68SYinan Xu def sllw = "b001_1000".U // sllw: SEXT((src1 << src2)[31:0]) 279675acc68SYinan Xu def srlw = "b001_1001".U // srlw: SEXT((src1[31:0] >> src2)[31:0]) 280675acc68SYinan Xu def sraw = "b001_1010".U // sraw: SEXT((src1[31:0] >> src2)[31:0]) 281675acc68SYinan Xu def rolw = "b001_1100".U 282675acc68SYinan Xu def rorw = "b001_1101".U 283675acc68SYinan Xu 284675acc68SYinan Xu // ADD-op 285675acc68SYinan Xu def adduw = "b010_0000".U // adduw: src1[31:0] + src2 286675acc68SYinan Xu def add = "b010_0001".U // add: src1 + src2 287675acc68SYinan Xu def oddadd = "b010_0010".U // oddadd: src1[0] + src2 288675acc68SYinan Xu 289675acc68SYinan Xu def sr29add = "b010_0100".U // sr29add: src1[63:29] + src2 290675acc68SYinan Xu def sr30add = "b010_0101".U // sr30add: src1[63:30] + src2 291675acc68SYinan Xu def sr31add = "b010_0110".U // sr31add: src1[63:31] + src2 292675acc68SYinan Xu def sr32add = "b010_0111".U // sr32add: src1[63:32] + src2 293675acc68SYinan Xu 294675acc68SYinan Xu def sh1adduw = "b010_1000".U // sh1adduw: {src1[31:0], 1'b0} + src2 295675acc68SYinan Xu def sh1add = "b010_1001".U // sh1add: {src1[62:0], 1'b0} + src2 296675acc68SYinan Xu def sh2adduw = "b010_1010".U // sh2add_uw: {src1[31:0], 2'b0} + src2 297675acc68SYinan Xu def sh2add = "b010_1011".U // sh2add: {src1[61:0], 2'b0} + src2 298675acc68SYinan Xu def sh3adduw = "b010_1100".U // sh3add_uw: {src1[31:0], 3'b0} + src2 299675acc68SYinan Xu def sh3add = "b010_1101".U // sh3add: {src1[60:0], 3'b0} + src2 300675acc68SYinan Xu def sh4add = "b010_1111".U // sh4add: {src1[59:0], 4'b0} + src2 301675acc68SYinan Xu 302675acc68SYinan Xu // SUB-op: src1 - src2 303675acc68SYinan Xu def sub = "b011_0000".U 304675acc68SYinan Xu def sltu = "b011_0001".U 305675acc68SYinan Xu def slt = "b011_0010".U 306675acc68SYinan Xu def maxu = "b011_0100".U 307675acc68SYinan Xu def minu = "b011_0101".U 308675acc68SYinan Xu def max = "b011_0110".U 309675acc68SYinan Xu def min = "b011_0111".U 310675acc68SYinan Xu 311675acc68SYinan Xu // branch 312675acc68SYinan Xu def beq = "b111_0000".U 313675acc68SYinan Xu def bne = "b111_0010".U 314675acc68SYinan Xu def blt = "b111_1000".U 315675acc68SYinan Xu def bge = "b111_1010".U 316675acc68SYinan Xu def bltu = "b111_1100".U 317675acc68SYinan Xu def bgeu = "b111_1110".U 318675acc68SYinan Xu 319675acc68SYinan Xu // misc optype 320675acc68SYinan Xu def and = "b100_0000".U 321675acc68SYinan Xu def andn = "b100_0001".U 322675acc68SYinan Xu def or = "b100_0010".U 323675acc68SYinan Xu def orn = "b100_0011".U 324675acc68SYinan Xu def xor = "b100_0100".U 325675acc68SYinan Xu def xnor = "b100_0101".U 326675acc68SYinan Xu def orcb = "b100_0110".U 327675acc68SYinan Xu 328675acc68SYinan Xu def sextb = "b100_1000".U 329675acc68SYinan Xu def packh = "b100_1001".U 330675acc68SYinan Xu def sexth = "b100_1010".U 331675acc68SYinan Xu def packw = "b100_1011".U 332675acc68SYinan Xu 333675acc68SYinan Xu def revb = "b101_0000".U 334675acc68SYinan Xu def rev8 = "b101_0001".U 335675acc68SYinan Xu def pack = "b101_0010".U 336675acc68SYinan Xu def orh48 = "b101_0011".U 337675acc68SYinan Xu 338675acc68SYinan Xu def szewl1 = "b101_1000".U 339675acc68SYinan Xu def szewl2 = "b101_1001".U 340675acc68SYinan Xu def szewl3 = "b101_1010".U 341675acc68SYinan Xu def byte2 = "b101_1011".U 342675acc68SYinan Xu 343675acc68SYinan Xu def andlsb = "b110_0000".U 344675acc68SYinan Xu def andzexth = "b110_0001".U 345675acc68SYinan Xu def orlsb = "b110_0010".U 346675acc68SYinan Xu def orzexth = "b110_0011".U 347675acc68SYinan Xu def xorlsb = "b110_0100".U 348675acc68SYinan Xu def xorzexth = "b110_0101".U 349675acc68SYinan Xu def orcblsb = "b110_0110".U 350675acc68SYinan Xu def orcbzexth = "b110_0111".U 3514aa9ed34Sfdy def vsetvli1 = "b1000_0000".U 3524aa9ed34Sfdy def vsetvli2 = "b1000_0100".U 3534aa9ed34Sfdy def vsetvl1 = "b1000_0001".U 3544aa9ed34Sfdy def vsetvl2 = "b1000_0101".U 3554aa9ed34Sfdy def vsetivli1 = "b1000_0010".U 3564aa9ed34Sfdy def vsetivli2 = "b1000_0110".U 357675acc68SYinan Xu 358675acc68SYinan Xu def isAddw(func: UInt) = func(6, 4) === "b001".U && !func(3) && !func(1) 359675acc68SYinan Xu def isSimpleLogic(func: UInt) = func(6, 4) === "b100".U && !func(0) 360675acc68SYinan Xu def logicToLsb(func: UInt) = Cat("b110".U(3.W), func(3, 1), 0.U(1.W)) 361675acc68SYinan Xu def logicToZexth(func: UInt) = Cat("b110".U(3.W), func(3, 1), 1.U(1.W)) 3624aa9ed34Sfdy def isVset(func: UInt) = func(7, 3) === "b1000_0".U 3634aa9ed34Sfdy def isVsetvl(func: UInt) = isVset(func) && func(0) 3644aa9ed34Sfdy def isVsetvli(func: UInt) = isVset(func) && !func(1, 0).orR 3654aa9ed34Sfdy def vsetExchange(func: UInt) = Cat(func(7, 3), "b1".U, func(1, 0)) 366675acc68SYinan Xu 36757a10886SXuan Hu def apply() = UInt(FuOpTypeWidth.W) 3682225d46eSJiawei Lin } 3692225d46eSJiawei Lin 370*3b739f49SXuan Hu object BRUOpType { 371*3b739f49SXuan Hu // branch 372*3b739f49SXuan Hu def beq = "b000_000".U 373*3b739f49SXuan Hu def bne = "b000_001".U 374*3b739f49SXuan Hu def blt = "b000_100".U 375*3b739f49SXuan Hu def bge = "b000_101".U 376*3b739f49SXuan Hu def bltu = "b001_000".U 377*3b739f49SXuan Hu def bgeu = "b001_001".U 378*3b739f49SXuan Hu 379*3b739f49SXuan Hu def getBranchType(func: UInt) = func(3, 1) 380*3b739f49SXuan Hu def isBranchInvert(func: UInt) = func(0) 381*3b739f49SXuan Hu } 382*3b739f49SXuan Hu 383*3b739f49SXuan Hu object MULOpType { 384*3b739f49SXuan Hu // mul 385*3b739f49SXuan Hu // bit encoding: | type (2bit) | isWord(1bit) | opcode(2bit) | 386*3b739f49SXuan Hu def mul = "b00000".U 387*3b739f49SXuan Hu def mulh = "b00001".U 388*3b739f49SXuan Hu def mulhsu = "b00010".U 389*3b739f49SXuan Hu def mulhu = "b00011".U 390*3b739f49SXuan Hu def mulw = "b00100".U 391*3b739f49SXuan Hu 392*3b739f49SXuan Hu def mulw7 = "b01100".U 393*3b739f49SXuan Hu def isSign(op: UInt) = !op(1) 394*3b739f49SXuan Hu def isW(op: UInt) = op(2) 395*3b739f49SXuan Hu def isH(op: UInt) = op(1, 0) =/= 0.U 396*3b739f49SXuan Hu def getOp(op: UInt) = Cat(op(3), op(1, 0)) 397*3b739f49SXuan Hu } 398*3b739f49SXuan Hu 399*3b739f49SXuan Hu object DIVOpType { 400*3b739f49SXuan Hu // div 401*3b739f49SXuan Hu // bit encoding: | type (2bit) | isWord(1bit) | isSign(1bit) | opcode(1bit) | 402*3b739f49SXuan Hu def div = "b10000".U 403*3b739f49SXuan Hu def divu = "b10010".U 404*3b739f49SXuan Hu def rem = "b10001".U 405*3b739f49SXuan Hu def remu = "b10011".U 406*3b739f49SXuan Hu 407*3b739f49SXuan Hu def divw = "b10100".U 408*3b739f49SXuan Hu def divuw = "b10110".U 409*3b739f49SXuan Hu def remw = "b10101".U 410*3b739f49SXuan Hu def remuw = "b10111".U 411*3b739f49SXuan Hu 412*3b739f49SXuan Hu def isSign(op: UInt) = !op(1) 413*3b739f49SXuan Hu def isW(op: UInt) = op(2) 414*3b739f49SXuan Hu def isH(op: UInt) = op(0) 415*3b739f49SXuan Hu } 416*3b739f49SXuan Hu 4172225d46eSJiawei Lin object MDUOpType { 4182225d46eSJiawei Lin // mul 4192225d46eSJiawei Lin // bit encoding: | type (2bit) | isWord(1bit) | opcode(2bit) | 4202225d46eSJiawei Lin def mul = "b00000".U 4212225d46eSJiawei Lin def mulh = "b00001".U 4222225d46eSJiawei Lin def mulhsu = "b00010".U 4232225d46eSJiawei Lin def mulhu = "b00011".U 4242225d46eSJiawei Lin def mulw = "b00100".U 4252225d46eSJiawei Lin 42688825c5cSYinan Xu def mulw7 = "b01100".U 42788825c5cSYinan Xu 4282225d46eSJiawei Lin // div 4292225d46eSJiawei Lin // bit encoding: | type (2bit) | isWord(1bit) | isSign(1bit) | opcode(1bit) | 43088825c5cSYinan Xu def div = "b10000".U 43188825c5cSYinan Xu def divu = "b10010".U 43288825c5cSYinan Xu def rem = "b10001".U 43388825c5cSYinan Xu def remu = "b10011".U 4342225d46eSJiawei Lin 43588825c5cSYinan Xu def divw = "b10100".U 43688825c5cSYinan Xu def divuw = "b10110".U 43788825c5cSYinan Xu def remw = "b10101".U 43888825c5cSYinan Xu def remuw = "b10111".U 4392225d46eSJiawei Lin 44088825c5cSYinan Xu def isMul(op: UInt) = !op(4) 44188825c5cSYinan Xu def isDiv(op: UInt) = op(4) 4422225d46eSJiawei Lin 4432225d46eSJiawei Lin def isDivSign(op: UInt) = isDiv(op) && !op(1) 4442225d46eSJiawei Lin def isW(op: UInt) = op(2) 4452225d46eSJiawei Lin def isH(op: UInt) = (isDiv(op) && op(0)) || (isMul(op) && op(1, 0) =/= 0.U) 4462225d46eSJiawei Lin def getMulOp(op: UInt) = op(1, 0) 4472225d46eSJiawei Lin } 4482225d46eSJiawei Lin 4492225d46eSJiawei Lin object LSUOpType { 450d200f594SWilliam Wang // load pipeline 4512225d46eSJiawei Lin 452d200f594SWilliam Wang // normal load 453d200f594SWilliam Wang // Note: bit(1, 0) are size, DO NOT CHANGE 454d200f594SWilliam Wang // bit encoding: | load 0 | is unsigned(1bit) | size(2bit) | 455d200f594SWilliam Wang def lb = "b0000".U 456d200f594SWilliam Wang def lh = "b0001".U 457d200f594SWilliam Wang def lw = "b0010".U 458d200f594SWilliam Wang def ld = "b0011".U 459d200f594SWilliam Wang def lbu = "b0100".U 460d200f594SWilliam Wang def lhu = "b0101".U 461d200f594SWilliam Wang def lwu = "b0110".U 462ca18a0b4SWilliam Wang 463d200f594SWilliam Wang // Zicbop software prefetch 464d200f594SWilliam Wang // bit encoding: | prefetch 1 | 0 | prefetch type (2bit) | 465d200f594SWilliam Wang def prefetch_i = "b1000".U // TODO 466d200f594SWilliam Wang def prefetch_r = "b1001".U 467d200f594SWilliam Wang def prefetch_w = "b1010".U 468ca18a0b4SWilliam Wang 469d200f594SWilliam Wang def isPrefetch(op: UInt): Bool = op(3) 470d200f594SWilliam Wang 471d200f594SWilliam Wang // store pipeline 472d200f594SWilliam Wang // normal store 473d200f594SWilliam Wang // bit encoding: | store 00 | size(2bit) | 474d200f594SWilliam Wang def sb = "b0000".U 475d200f594SWilliam Wang def sh = "b0001".U 476d200f594SWilliam Wang def sw = "b0010".U 477d200f594SWilliam Wang def sd = "b0011".U 478d200f594SWilliam Wang 479d200f594SWilliam Wang // l1 cache op 480d200f594SWilliam Wang // bit encoding: | cbo_zero 01 | size(2bit) 11 | 481d200f594SWilliam Wang def cbo_zero = "b0111".U 482d200f594SWilliam Wang 483d200f594SWilliam Wang // llc op 484d200f594SWilliam Wang // bit encoding: | prefetch 11 | suboptype(2bit) | 485d200f594SWilliam Wang def cbo_clean = "b1100".U 486d200f594SWilliam Wang def cbo_flush = "b1101".U 487d200f594SWilliam Wang def cbo_inval = "b1110".U 488d200f594SWilliam Wang 489d200f594SWilliam Wang def isCbo(op: UInt): Bool = op(3, 2) === "b11".U 4902225d46eSJiawei Lin 4912225d46eSJiawei Lin // atomics 4922225d46eSJiawei Lin // bit(1, 0) are size 4932225d46eSJiawei Lin // since atomics use a different fu type 4942225d46eSJiawei Lin // so we can safely reuse other load/store's encodings 495d200f594SWilliam Wang // bit encoding: | optype(4bit) | size (2bit) | 4962225d46eSJiawei Lin def lr_w = "b000010".U 4972225d46eSJiawei Lin def sc_w = "b000110".U 4982225d46eSJiawei Lin def amoswap_w = "b001010".U 4992225d46eSJiawei Lin def amoadd_w = "b001110".U 5002225d46eSJiawei Lin def amoxor_w = "b010010".U 5012225d46eSJiawei Lin def amoand_w = "b010110".U 5022225d46eSJiawei Lin def amoor_w = "b011010".U 5032225d46eSJiawei Lin def amomin_w = "b011110".U 5042225d46eSJiawei Lin def amomax_w = "b100010".U 5052225d46eSJiawei Lin def amominu_w = "b100110".U 5062225d46eSJiawei Lin def amomaxu_w = "b101010".U 5072225d46eSJiawei Lin 5082225d46eSJiawei Lin def lr_d = "b000011".U 5092225d46eSJiawei Lin def sc_d = "b000111".U 5102225d46eSJiawei Lin def amoswap_d = "b001011".U 5112225d46eSJiawei Lin def amoadd_d = "b001111".U 5122225d46eSJiawei Lin def amoxor_d = "b010011".U 5132225d46eSJiawei Lin def amoand_d = "b010111".U 5142225d46eSJiawei Lin def amoor_d = "b011011".U 5152225d46eSJiawei Lin def amomin_d = "b011111".U 5162225d46eSJiawei Lin def amomax_d = "b100011".U 5172225d46eSJiawei Lin def amominu_d = "b100111".U 5182225d46eSJiawei Lin def amomaxu_d = "b101011".U 519b6982e83SLemover 520b6982e83SLemover def size(op: UInt) = op(1,0) 5212225d46eSJiawei Lin } 5222225d46eSJiawei Lin 5233feeca58Szfw object BKUOpType { 524ee8ff153Szfw 5253feeca58Szfw def clmul = "b000000".U 5263feeca58Szfw def clmulh = "b000001".U 5273feeca58Szfw def clmulr = "b000010".U 5283feeca58Szfw def xpermn = "b000100".U 5293feeca58Szfw def xpermb = "b000101".U 530ee8ff153Szfw 5313feeca58Szfw def clz = "b001000".U 5323feeca58Szfw def clzw = "b001001".U 5333feeca58Szfw def ctz = "b001010".U 5343feeca58Szfw def ctzw = "b001011".U 5353feeca58Szfw def cpop = "b001100".U 5363feeca58Szfw def cpopw = "b001101".U 53707596dc6Szfw 5383feeca58Szfw // 01xxxx is reserve 5393feeca58Szfw def aes64es = "b100000".U 5403feeca58Szfw def aes64esm = "b100001".U 5413feeca58Szfw def aes64ds = "b100010".U 5423feeca58Szfw def aes64dsm = "b100011".U 5433feeca58Szfw def aes64im = "b100100".U 5443feeca58Szfw def aes64ks1i = "b100101".U 5453feeca58Szfw def aes64ks2 = "b100110".U 5463feeca58Szfw 5473feeca58Szfw // merge to two instruction sm4ks & sm4ed 54819bcce38SFawang Zhang def sm4ed0 = "b101000".U 54919bcce38SFawang Zhang def sm4ed1 = "b101001".U 55019bcce38SFawang Zhang def sm4ed2 = "b101010".U 55119bcce38SFawang Zhang def sm4ed3 = "b101011".U 55219bcce38SFawang Zhang def sm4ks0 = "b101100".U 55319bcce38SFawang Zhang def sm4ks1 = "b101101".U 55419bcce38SFawang Zhang def sm4ks2 = "b101110".U 55519bcce38SFawang Zhang def sm4ks3 = "b101111".U 5563feeca58Szfw 5573feeca58Szfw def sha256sum0 = "b110000".U 5583feeca58Szfw def sha256sum1 = "b110001".U 5593feeca58Szfw def sha256sig0 = "b110010".U 5603feeca58Szfw def sha256sig1 = "b110011".U 5613feeca58Szfw def sha512sum0 = "b110100".U 5623feeca58Szfw def sha512sum1 = "b110101".U 5633feeca58Szfw def sha512sig0 = "b110110".U 5643feeca58Szfw def sha512sig1 = "b110111".U 5653feeca58Szfw 5663feeca58Szfw def sm3p0 = "b111000".U 5673feeca58Szfw def sm3p1 = "b111001".U 568ee8ff153Szfw } 569ee8ff153Szfw 5702225d46eSJiawei Lin object BTBtype { 5712225d46eSJiawei Lin def B = "b00".U // branch 5722225d46eSJiawei Lin def J = "b01".U // jump 5732225d46eSJiawei Lin def I = "b10".U // indirect 5742225d46eSJiawei Lin def R = "b11".U // return 5752225d46eSJiawei Lin 5762225d46eSJiawei Lin def apply() = UInt(2.W) 5772225d46eSJiawei Lin } 5782225d46eSJiawei Lin 5792225d46eSJiawei Lin object SelImm { 580ee8ff153Szfw def IMM_X = "b0111".U 581ee8ff153Szfw def IMM_S = "b0000".U 582ee8ff153Szfw def IMM_SB = "b0001".U 583ee8ff153Szfw def IMM_U = "b0010".U 584ee8ff153Szfw def IMM_UJ = "b0011".U 585ee8ff153Szfw def IMM_I = "b0100".U 586ee8ff153Szfw def IMM_Z = "b0101".U 587ee8ff153Szfw def INVALID_INSTR = "b0110".U 588ee8ff153Szfw def IMM_B6 = "b1000".U 5892225d46eSJiawei Lin 59058c35d23Shuxuan0307 def IMM_OPIVIS = "b1001".U 59158c35d23Shuxuan0307 def IMM_OPIVIU = "b1010".U 592912e2179SXuan Hu def IMM_VSETVLI = "b1100".U 593912e2179SXuan Hu def IMM_VSETIVLI = "b1101".U 59458c35d23Shuxuan0307 59557a10886SXuan Hu def X = BitPat("b0000") 5966e7c9679Shuxuan0307 597ee8ff153Szfw def apply() = UInt(4.W) 5982225d46eSJiawei Lin } 5992225d46eSJiawei Lin 6006ab6918fSYinan Xu object ExceptionNO { 6016ab6918fSYinan Xu def instrAddrMisaligned = 0 6026ab6918fSYinan Xu def instrAccessFault = 1 6036ab6918fSYinan Xu def illegalInstr = 2 6046ab6918fSYinan Xu def breakPoint = 3 6056ab6918fSYinan Xu def loadAddrMisaligned = 4 6066ab6918fSYinan Xu def loadAccessFault = 5 6076ab6918fSYinan Xu def storeAddrMisaligned = 6 6086ab6918fSYinan Xu def storeAccessFault = 7 6096ab6918fSYinan Xu def ecallU = 8 6106ab6918fSYinan Xu def ecallS = 9 6116ab6918fSYinan Xu def ecallM = 11 6126ab6918fSYinan Xu def instrPageFault = 12 6136ab6918fSYinan Xu def loadPageFault = 13 6146ab6918fSYinan Xu // def singleStep = 14 6156ab6918fSYinan Xu def storePageFault = 15 6166ab6918fSYinan Xu def priorities = Seq( 6176ab6918fSYinan Xu breakPoint, // TODO: different BP has different priority 6186ab6918fSYinan Xu instrPageFault, 6196ab6918fSYinan Xu instrAccessFault, 6206ab6918fSYinan Xu illegalInstr, 6216ab6918fSYinan Xu instrAddrMisaligned, 6226ab6918fSYinan Xu ecallM, ecallS, ecallU, 623d880177dSYinan Xu storeAddrMisaligned, 624d880177dSYinan Xu loadAddrMisaligned, 6256ab6918fSYinan Xu storePageFault, 6266ab6918fSYinan Xu loadPageFault, 6276ab6918fSYinan Xu storeAccessFault, 628d880177dSYinan Xu loadAccessFault 6296ab6918fSYinan Xu ) 6306ab6918fSYinan Xu def all = priorities.distinct.sorted 6316ab6918fSYinan Xu def frontendSet = Seq( 6326ab6918fSYinan Xu instrAddrMisaligned, 6336ab6918fSYinan Xu instrAccessFault, 6346ab6918fSYinan Xu illegalInstr, 6356ab6918fSYinan Xu instrPageFault 6366ab6918fSYinan Xu ) 6376ab6918fSYinan Xu def partialSelect(vec: Vec[Bool], select: Seq[Int]): Vec[Bool] = { 6386ab6918fSYinan Xu val new_vec = Wire(ExceptionVec()) 6396ab6918fSYinan Xu new_vec.foreach(_ := false.B) 6406ab6918fSYinan Xu select.foreach(i => new_vec(i) := vec(i)) 6416ab6918fSYinan Xu new_vec 6426ab6918fSYinan Xu } 6436ab6918fSYinan Xu def selectFrontend(vec: Vec[Bool]): Vec[Bool] = partialSelect(vec, frontendSet) 6446ab6918fSYinan Xu def selectAll(vec: Vec[Bool]): Vec[Bool] = partialSelect(vec, ExceptionNO.all) 6456ab6918fSYinan Xu def selectByFu(vec:Vec[Bool], fuConfig: FuConfig): Vec[Bool] = 6466ab6918fSYinan Xu partialSelect(vec, fuConfig.exceptionOut) 647*3b739f49SXuan Hu// def selectByExu(vec:Vec[Bool], exuConfig: ExuConfig): Vec[Bool] = 648*3b739f49SXuan Hu// partialSelect(vec, exuConfig.exceptionOut) 649*3b739f49SXuan Hu// def selectByExu(vec:Vec[Bool], exuConfigs: Seq[ExuConfig]): Vec[Bool] = 650*3b739f49SXuan Hu// partialSelect(vec, exuConfigs.map(_.exceptionOut).reduce(_ ++ _).distinct.sorted) 6516ab6918fSYinan Xu } 6526ab6918fSYinan Xu 653*3b739f49SXuan Hu// def dividerGen(p: Parameters) = new DividerWrapper(p(XLen))(p) 654*3b739f49SXuan Hu// def multiplierGen(p: Parameters) = new ArrayMultiplier(p(XLen) + 1)(p) 655*3b739f49SXuan Hu// def aluGen(p: Parameters) = new Alu()(p) 656*3b739f49SXuan Hu// def bkuGen(p: Parameters) = new Bku()(p) 657*3b739f49SXuan Hu// def jmpGen(p: Parameters) = new Jump()(p) 658*3b739f49SXuan Hu// def fenceGen(p: Parameters) = new Fence()(p) 659*3b739f49SXuan Hu// def csrGen(p: Parameters) = new CSR()(p) 660*3b739f49SXuan Hu// def i2fGen(p: Parameters) = new IntToFP()(p) 661*3b739f49SXuan Hu// def fmacGen(p: Parameters) = new FMA()(p) 662*3b739f49SXuan Hu// def f2iGen(p: Parameters) = new FPToInt()(p) 663*3b739f49SXuan Hu// def f2fGen(p: Parameters) = new FPToFP()(p) 664*3b739f49SXuan Hu// def fdivSqrtGen(p: Parameters) = new FDivSqrt()(p) 665*3b739f49SXuan Hu// def stdGen(p: Parameters) = new Std()(p) 666*3b739f49SXuan Hu// def mouDataGen(p: Parameters) = new Std()(p) 667*3b739f49SXuan Hu// def vipuGen(p: Parameters) = new VIPU()(p) 668*3b739f49SXuan Hu// 669*3b739f49SXuan Hu// def f2iSel(uop: MicroOp): Bool = { 670*3b739f49SXuan Hu// uop.ctrl.rfWen 671*3b739f49SXuan Hu// } 672*3b739f49SXuan Hu// 673*3b739f49SXuan Hu// def i2fSel(uop: MicroOp): Bool = { 674*3b739f49SXuan Hu// uop.ctrl.fpu.fromInt 675*3b739f49SXuan Hu// } 676*3b739f49SXuan Hu// 677*3b739f49SXuan Hu// def f2fSel(uop: MicroOp): Bool = { 678*3b739f49SXuan Hu// val ctrl = uop.ctrl.fpu 679*3b739f49SXuan Hu// ctrl.fpWen && !ctrl.div && !ctrl.sqrt 680*3b739f49SXuan Hu// } 681*3b739f49SXuan Hu// 682*3b739f49SXuan Hu// def fdivSqrtSel(uop: MicroOp): Bool = { 683*3b739f49SXuan Hu// val ctrl = uop.ctrl.fpu 684*3b739f49SXuan Hu// ctrl.div || ctrl.sqrt 685*3b739f49SXuan Hu// } 686*3b739f49SXuan Hu// 687*3b739f49SXuan Hu// val aluCfg = FuConfig( 688*3b739f49SXuan Hu// name = "alu", 689*3b739f49SXuan Hu// fuGen = aluGen, 690*3b739f49SXuan Hu// fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.alu, 691*3b739f49SXuan Hu// fuType = FuType.alu, 692*3b739f49SXuan Hu// numIntSrc = 2, 693*3b739f49SXuan Hu// numFpSrc = 0, 694*3b739f49SXuan Hu// writeIntRf = true, 695*3b739f49SXuan Hu// writeFpRf = false, 696*3b739f49SXuan Hu// hasRedirect = true, 697*3b739f49SXuan Hu// ) 698*3b739f49SXuan Hu// 699*3b739f49SXuan Hu// val jmpCfg = FuConfig( 700*3b739f49SXuan Hu// name = "jmp", 701*3b739f49SXuan Hu// fuGen = jmpGen, 702*3b739f49SXuan Hu// fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.jmp, 703*3b739f49SXuan Hu// fuType = FuType.jmp, 704*3b739f49SXuan Hu// numIntSrc = 1, 705*3b739f49SXuan Hu// numFpSrc = 0, 706*3b739f49SXuan Hu// writeIntRf = true, 707*3b739f49SXuan Hu// writeFpRf = false, 708*3b739f49SXuan Hu// hasRedirect = true, 709*3b739f49SXuan Hu// ) 710*3b739f49SXuan Hu// 711*3b739f49SXuan Hu// val fenceCfg = FuConfig( 712*3b739f49SXuan Hu// name = "fence", 713*3b739f49SXuan Hu// fuGen = fenceGen, 714*3b739f49SXuan Hu// fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.fence, 715*3b739f49SXuan Hu// FuType.fence, 2, 0, writeIntRf = false, writeFpRf = false, 716*3b739f49SXuan Hu// latency = UncertainLatency(), exceptionOut = Seq(illegalInstr), // TODO: need rewrite latency structure, not just this value, 717*3b739f49SXuan Hu// flushPipe = true 718*3b739f49SXuan Hu// ) 719*3b739f49SXuan Hu// 720*3b739f49SXuan Hu// val csrCfg = FuConfig( 721*3b739f49SXuan Hu// name = "csr", 722*3b739f49SXuan Hu// fuGen = csrGen, 723*3b739f49SXuan Hu// fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.csr, 724*3b739f49SXuan Hu// fuType = FuType.csr, 725*3b739f49SXuan Hu// numIntSrc = 1, 726*3b739f49SXuan Hu// numFpSrc = 0, 727*3b739f49SXuan Hu// writeIntRf = true, 728*3b739f49SXuan Hu// writeFpRf = false, 729*3b739f49SXuan Hu// exceptionOut = Seq(illegalInstr, breakPoint, ecallU, ecallS, ecallM), 730*3b739f49SXuan Hu// flushPipe = true 731*3b739f49SXuan Hu// ) 732*3b739f49SXuan Hu// 733*3b739f49SXuan Hu// val i2fCfg = FuConfig( 734*3b739f49SXuan Hu// name = "i2f", 735*3b739f49SXuan Hu// fuGen = i2fGen, 736*3b739f49SXuan Hu// fuSel = i2fSel, 737*3b739f49SXuan Hu// FuType.i2f, 738*3b739f49SXuan Hu// numIntSrc = 1, 739*3b739f49SXuan Hu// numFpSrc = 0, 740*3b739f49SXuan Hu// writeIntRf = false, 741*3b739f49SXuan Hu// writeFpRf = true, 742*3b739f49SXuan Hu// writeFflags = true, 743*3b739f49SXuan Hu// latency = CertainLatency(2), 744*3b739f49SXuan Hu// fastUopOut = true, fastImplemented = true 745*3b739f49SXuan Hu// ) 746*3b739f49SXuan Hu// 747*3b739f49SXuan Hu// val divCfg = FuConfig( 748*3b739f49SXuan Hu// name = "div", 749*3b739f49SXuan Hu// fuGen = dividerGen, 750*3b739f49SXuan Hu// fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.div, 751*3b739f49SXuan Hu// FuType.div, 752*3b739f49SXuan Hu// 2, 753*3b739f49SXuan Hu// 0, 754*3b739f49SXuan Hu// writeIntRf = true, 755*3b739f49SXuan Hu// writeFpRf = false, 756*3b739f49SXuan Hu// latency = UncertainLatency(), 757*3b739f49SXuan Hu// fastUopOut = true, 758*3b739f49SXuan Hu// fastImplemented = true, 759*3b739f49SXuan Hu// hasInputBuffer = (true, 4, true) 760*3b739f49SXuan Hu// ) 761*3b739f49SXuan Hu// 762*3b739f49SXuan Hu// val mulCfg = FuConfig( 763*3b739f49SXuan Hu// name = "mul", 764*3b739f49SXuan Hu// fuGen = multiplierGen, 765*3b739f49SXuan Hu// fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.mul, 766*3b739f49SXuan Hu// FuType.mul, 767*3b739f49SXuan Hu// 2, 768*3b739f49SXuan Hu// 0, 769*3b739f49SXuan Hu// writeIntRf = true, 770*3b739f49SXuan Hu// writeFpRf = false, 771*3b739f49SXuan Hu// latency = CertainLatency(2), 772*3b739f49SXuan Hu// fastUopOut = true, 773*3b739f49SXuan Hu// fastImplemented = true 774*3b739f49SXuan Hu// ) 775*3b739f49SXuan Hu// 776*3b739f49SXuan Hu// val bkuCfg = FuConfig( 777*3b739f49SXuan Hu// name = "bku", 778*3b739f49SXuan Hu// fuGen = bkuGen, 779*3b739f49SXuan Hu// fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.bku, 780*3b739f49SXuan Hu// fuType = FuType.bku, 781*3b739f49SXuan Hu// numIntSrc = 2, 782*3b739f49SXuan Hu// numFpSrc = 0, 783*3b739f49SXuan Hu// writeIntRf = true, 784*3b739f49SXuan Hu// writeFpRf = false, 785*3b739f49SXuan Hu// latency = CertainLatency(1), 786*3b739f49SXuan Hu// fastUopOut = true, 787*3b739f49SXuan Hu// fastImplemented = true 788*3b739f49SXuan Hu// ) 789*3b739f49SXuan Hu// 790*3b739f49SXuan Hu// val fmacCfg = FuConfig( 791*3b739f49SXuan Hu// name = "fmac", 792*3b739f49SXuan Hu// fuGen = fmacGen, 793*3b739f49SXuan Hu// fuSel = _ => true.B, 794*3b739f49SXuan Hu// FuType.fmac, 0, 3, writeIntRf = false, writeFpRf = true, writeFflags = true, 795*3b739f49SXuan Hu// latency = UncertainLatency(), fastUopOut = true, fastImplemented = true 796*3b739f49SXuan Hu// ) 797*3b739f49SXuan Hu// 798*3b739f49SXuan Hu// val f2iCfg = FuConfig( 799*3b739f49SXuan Hu// name = "f2i", 800*3b739f49SXuan Hu// fuGen = f2iGen, 801*3b739f49SXuan Hu// fuSel = f2iSel, 802*3b739f49SXuan Hu// FuType.fmisc, 0, 1, writeIntRf = true, writeFpRf = false, writeFflags = true, latency = CertainLatency(2), 803*3b739f49SXuan Hu// fastUopOut = true, fastImplemented = true 804*3b739f49SXuan Hu// ) 805*3b739f49SXuan Hu// 806*3b739f49SXuan Hu// val f2fCfg = FuConfig( 807*3b739f49SXuan Hu// name = "f2f", 808*3b739f49SXuan Hu// fuGen = f2fGen, 809*3b739f49SXuan Hu// fuSel = f2fSel, 810*3b739f49SXuan Hu// FuType.fmisc, 0, 1, writeIntRf = false, writeFpRf = true, writeFflags = true, latency = CertainLatency(2), 811*3b739f49SXuan Hu// fastUopOut = true, fastImplemented = true 812*3b739f49SXuan Hu// ) 813*3b739f49SXuan Hu// 814*3b739f49SXuan Hu// val fdivSqrtCfg = FuConfig( 815*3b739f49SXuan Hu// name = "fdivSqrt", 816*3b739f49SXuan Hu// fuGen = fdivSqrtGen, 817*3b739f49SXuan Hu// fuSel = fdivSqrtSel, 818*3b739f49SXuan Hu// FuType.fDivSqrt, 0, 2, writeIntRf = false, writeFpRf = true, writeFflags = true, latency = UncertainLatency(), 819*3b739f49SXuan Hu// fastUopOut = true, fastImplemented = true, hasInputBuffer = (true, 8, true) 820*3b739f49SXuan Hu// ) 821*3b739f49SXuan Hu// 822*3b739f49SXuan Hu// val lduCfg = FuConfig( 823*3b739f49SXuan Hu// "ldu", 824*3b739f49SXuan Hu// null, // DontCare 825*3b739f49SXuan Hu// (uop: MicroOp) => FuType.loadCanAccept(uop.ctrl.fuType), 826*3b739f49SXuan Hu// FuType.ldu, 1, 0, writeIntRf = true, writeFpRf = true, 827*3b739f49SXuan Hu// latency = UncertainLatency(), 828*3b739f49SXuan Hu// exceptionOut = Seq(loadAddrMisaligned, loadAccessFault, loadPageFault), 829*3b739f49SXuan Hu// flushPipe = true, 830*3b739f49SXuan Hu// replayInst = true, 831*3b739f49SXuan Hu// hasLoadError = true 832*3b739f49SXuan Hu// ) 833*3b739f49SXuan Hu// 834*3b739f49SXuan Hu// val staCfg = FuConfig( 835*3b739f49SXuan Hu// "sta", 836*3b739f49SXuan Hu// null, 837*3b739f49SXuan Hu// (uop: MicroOp) => FuType.storeCanAccept(uop.ctrl.fuType), 838*3b739f49SXuan Hu// FuType.stu, 1, 0, writeIntRf = false, writeFpRf = false, 839*3b739f49SXuan Hu// latency = UncertainLatency(), 840*3b739f49SXuan Hu// exceptionOut = Seq(storeAddrMisaligned, storeAccessFault, storePageFault) 841*3b739f49SXuan Hu// ) 842*3b739f49SXuan Hu// 843*3b739f49SXuan Hu// val stdCfg = FuConfig( 844*3b739f49SXuan Hu// "std", 845*3b739f49SXuan Hu// fuGen = stdGen, fuSel = (uop: MicroOp) => FuType.storeCanAccept(uop.ctrl.fuType), FuType.stu, 1, 1, 846*3b739f49SXuan Hu// writeIntRf = false, writeFpRf = false, latency = CertainLatency(1) 847*3b739f49SXuan Hu// ) 848*3b739f49SXuan Hu// 849*3b739f49SXuan Hu// val mouCfg = FuConfig( 850*3b739f49SXuan Hu// "mou", 851*3b739f49SXuan Hu// null, 852*3b739f49SXuan Hu// (uop: MicroOp) => FuType.storeCanAccept(uop.ctrl.fuType), 853*3b739f49SXuan Hu// FuType.mou, 1, 0, writeIntRf = false, writeFpRf = false, 854*3b739f49SXuan Hu// latency = UncertainLatency(), exceptionOut = lduCfg.exceptionOut ++ staCfg.exceptionOut 855*3b739f49SXuan Hu// ) 856*3b739f49SXuan Hu// 857*3b739f49SXuan Hu// val mouDataCfg = FuConfig( 858*3b739f49SXuan Hu// "mou", 859*3b739f49SXuan Hu// mouDataGen, 860*3b739f49SXuan Hu// (uop: MicroOp) => FuType.storeCanAccept(uop.ctrl.fuType), 861*3b739f49SXuan Hu// FuType.mou, 1, 0, writeIntRf = false, writeFpRf = false, 862*3b739f49SXuan Hu// latency = UncertainLatency() 863*3b739f49SXuan Hu// ) 864*3b739f49SXuan Hu// 865*3b739f49SXuan Hu// val vipuCfg = FuConfig( 866*3b739f49SXuan Hu// name = "vipu", 867*3b739f49SXuan Hu// fuGen = vipuGen, 868*3b739f49SXuan Hu// fuSel = (uop: MicroOp) => FuType.vipu === uop.ctrl.fuType, 869*3b739f49SXuan Hu// fuType = FuType.vipu, 870*3b739f49SXuan Hu// numIntSrc = 0, numFpSrc = 0, writeIntRf = false, writeFpRf = false, writeFflags = false, 871*3b739f49SXuan Hu// numVecSrc = 2, writeVecRf = true, 872*3b739f49SXuan Hu// fastUopOut = true, // TODO: check 873*3b739f49SXuan Hu// fastImplemented = true, //TODO: check 874*3b739f49SXuan Hu// ) 8752225d46eSJiawei Lin 876*3b739f49SXuan Hu// val JumpExeUnitCfg = ExuConfig("JmpExeUnit", "Int", Seq(jmpCfg, i2fCfg), 2, Int.MaxValue) 877*3b739f49SXuan Hu// val AluExeUnitCfg = ExuConfig("AluExeUnit", "Int", Seq(aluCfg), 0, Int.MaxValue) 878*3b739f49SXuan Hu// val JumpCSRExeUnitCfg = ExuConfig("JmpCSRExeUnit", "Int", Seq(jmpCfg, csrCfg, fenceCfg, i2fCfg), 2, Int.MaxValue) 879*3b739f49SXuan Hu// val MulDivExeUnitCfg = ExuConfig("MulDivExeUnit", "Int", Seq(mulCfg, divCfg, bkuCfg), 1, Int.MaxValue) 880*3b739f49SXuan Hu// val FmacExeUnitCfg = ExuConfig("FmacExeUnit", "Fp", Seq(fmacCfg, vipuCfg), Int.MaxValue, 0) 881*3b739f49SXuan Hu// val FmiscExeUnitCfg = ExuConfig( 882*3b739f49SXuan Hu// "FmiscExeUnit", 883*3b739f49SXuan Hu// "Fp", 884*3b739f49SXuan Hu// Seq(f2iCfg, f2fCfg, fdivSqrtCfg), 885*3b739f49SXuan Hu// Int.MaxValue, 1 886*3b739f49SXuan Hu// ) 887*3b739f49SXuan Hu// val LdExeUnitCfg = ExuConfig("LoadExu", "Mem", Seq(lduCfg), wbIntPriority = 0, wbFpPriority = 0, extendsExu = false) 888*3b739f49SXuan Hu// val StaExeUnitCfg = ExuConfig("StaExu", "Mem", Seq(staCfg, mouCfg), wbIntPriority = Int.MaxValue, wbFpPriority = Int.MaxValue, extendsExu = false) 889*3b739f49SXuan Hu// val StdExeUnitCfg = ExuConfig("StdExu", "Mem", Seq(stdCfg, mouDataCfg), wbIntPriority = Int.MaxValue, wbFpPriority = Int.MaxValue, extendsExu = false) 89054034ccdSZhangZifei 891d16f4ea4SZhangZifei // def jumpRSWrapperGen(p: Parameters) = new JumpRSWrapper()(p) 892d16f4ea4SZhangZifei // def mulRSWrapperGen(p: Parameters) = new MulRSWrapper()(p) 893d16f4ea4SZhangZifei // def loadRSWrapperGen(p: Parameters) = new LoadRSWrapper()(p) 894d16f4ea4SZhangZifei // def stdRSWrapperGen(p: Parameters) = new StdRSWrapper()(p) 895d16f4ea4SZhangZifei // def staRSWrapperGen(p: Parameters) = new StaRSWrapper()(p) 896d16f4ea4SZhangZifei // def fmaRSWrapperGen(p: Parameters) = new FMARSWrapper()(p) 897d16f4ea4SZhangZifei // def fmiscRSWrapperGen(p: Parameters) = new FMiscRSWrapper()(p) 89854034ccdSZhangZifei 899*3b739f49SXuan Hu// val aluRSMod = new RSMod( 900*3b739f49SXuan Hu// rsWrapperGen = (modGen: RSMod, p: Parameters) => new ALURSWrapper(modGen)(p), 901*3b739f49SXuan Hu// rsGen = (a: RSParams, b: Parameters) => new ALURS(a)(b), 902*3b739f49SXuan Hu// immExtractorGen = (src: Int, width: Int, p: Parameters) => new AluImmExtractor()(p) 903*3b739f49SXuan Hu// ) 904*3b739f49SXuan Hu// val fmaRSMod = new RSMod( 905*3b739f49SXuan Hu// rsWrapperGen = (modGen: RSMod, p: Parameters) => new FMARSWrapper(modGen)(p), 906*3b739f49SXuan Hu// rsGen = (a: RSParams, b: Parameters) => new FMARS(a)(b), 907*3b739f49SXuan Hu// ) 908*3b739f49SXuan Hu// val fmiscRSMod = new RSMod( 909*3b739f49SXuan Hu// rsWrapperGen = (modGen: RSMod, p: Parameters) => new FMiscRSWrapper(modGen)(p), 910*3b739f49SXuan Hu// rsGen = (a: RSParams, b: Parameters) => new FMiscRS(a)(b), 911*3b739f49SXuan Hu// ) 912*3b739f49SXuan Hu// val jumpRSMod = new RSMod( 913*3b739f49SXuan Hu// rsWrapperGen = (modGen: RSMod, p: Parameters) => new JumpRSWrapper(modGen)(p), 914*3b739f49SXuan Hu// rsGen = (a: RSParams, b: Parameters) => new JumpRS(a)(b), 915*3b739f49SXuan Hu// immExtractorGen = (src: Int, width: Int, p: Parameters) => new JumpImmExtractor()(p) 916*3b739f49SXuan Hu// ) 917*3b739f49SXuan Hu// val loadRSMod = new RSMod( 918*3b739f49SXuan Hu// rsWrapperGen = (modGen: RSMod, p: Parameters) => new LoadRSWrapper(modGen)(p), 919*3b739f49SXuan Hu// rsGen = (a: RSParams, b: Parameters) => new LoadRS(a)(b), 920*3b739f49SXuan Hu// immExtractorGen = (src: Int, width: Int, p: Parameters) => new LoadImmExtractor()(p) 921*3b739f49SXuan Hu// ) 922*3b739f49SXuan Hu// val mulRSMod = new RSMod( 923*3b739f49SXuan Hu// rsWrapperGen = (modGen: RSMod, p: Parameters) => new MulRSWrapper(modGen)(p), 924*3b739f49SXuan Hu// rsGen = (a: RSParams, b: Parameters) => new MulRS(a)(b), 925*3b739f49SXuan Hu// immExtractorGen = (src: Int, width: Int, p: Parameters) => new MduImmExtractor()(p) 926*3b739f49SXuan Hu// ) 927*3b739f49SXuan Hu// val staRSMod = new RSMod( 928*3b739f49SXuan Hu// rsWrapperGen = (modGen: RSMod, p: Parameters) => new StaRSWrapper(modGen)(p), 929*3b739f49SXuan Hu// rsGen = (a: RSParams, b: Parameters) => new StaRS(a)(b), 930*3b739f49SXuan Hu// ) 931*3b739f49SXuan Hu// val stdRSMod = new RSMod( 932*3b739f49SXuan Hu// rsWrapperGen = (modGen: RSMod, p: Parameters) => new StdRSWrapper(modGen)(p), 933*3b739f49SXuan Hu// rsGen = (a: RSParams, b: Parameters) => new StdRS(a)(b), 934*3b739f49SXuan Hu// ) 9359a2e6b8aSLinJiawei} 936