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._ 253b739f49SXuan 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 48*351e22f2SXuan Hu def isVfp(srcType: UInt) = isVp(srcType) || isFp(srcType) 491285b047SXuan Hu def apply() = UInt(3.W) 509a2e6b8aSLinJiawei } 519a2e6b8aSLinJiawei 529a2e6b8aSLinJiawei object SrcState { 53100aa93cSYinan Xu def busy = "b0".U 54100aa93cSYinan Xu def rdy = "b1".U 55100aa93cSYinan Xu // def specRdy = "b10".U // speculative ready, for future use 56100aa93cSYinan Xu def apply() = UInt(1.W) 579ca09953SXuan Hu 589ca09953SXuan Hu def isReady(state: UInt): Bool = state === this.rdy 599ca09953SXuan Hu def isBusy(state: UInt): Bool = state === this.busy 609a2e6b8aSLinJiawei } 619a2e6b8aSLinJiawei 627f2b7720SXuan Hu // Todo: Use OH instead 633b739f49SXuan Hu// object FuType { 643b739f49SXuan Hu// def jmp = (BigInt(1) << 0).U 653b739f49SXuan Hu// def brh = (BigInt(1) << 1).U 663b739f49SXuan Hu// def i2f = (BigInt(1) << 2).U 673b739f49SXuan Hu// def csr = (BigInt(1) << 3).U 683b739f49SXuan Hu// def alu = (BigInt(1) << 4).U 693b739f49SXuan Hu// def mul = (BigInt(1) << 5).U 703b739f49SXuan Hu// def div = (BigInt(1) << 6).U 713b739f49SXuan Hu// def fence = (BigInt(1) << 7).U 723b739f49SXuan Hu// def bku = (BigInt(1) << 8).U 733b739f49SXuan Hu// def vset = (BigInt(1) << 9).U 743b739f49SXuan Hu// 753b739f49SXuan Hu// def fmac = (BigInt(1) << 10).U 763b739f49SXuan Hu// def fmisc = (BigInt(1) << 11).U 773b739f49SXuan Hu// def fDivSqrt = (BigInt(1) << 12).U 783b739f49SXuan Hu// 793b739f49SXuan Hu// def ldu = (BigInt(1) << 13).U 803b739f49SXuan Hu// def stu = (BigInt(1) << 14).U 813b739f49SXuan Hu// def mou = (BigInt(1) << 15).U // for amo, lr, sc, fence 823b739f49SXuan Hu// def vipu = (BigInt(1) << 16).U 833b739f49SXuan Hu// def vfpu = (BigInt(1) << 17).U 843b739f49SXuan Hu// def vldu = (BigInt(1) << 18).U 853b739f49SXuan Hu// def vstu = (BigInt(1) << 19).U 863b739f49SXuan Hu// def X = BitPat.dontCare(num) 873b739f49SXuan Hu// 883b739f49SXuan Hu// def num = 20 893b739f49SXuan Hu// 903b739f49SXuan Hu// def apply() = UInt(log2Up(num).W) 913b739f49SXuan Hu// 923b739f49SXuan Hu// def isIntExu(fuType: UInt) = !fuType(3) 933b739f49SXuan Hu// def isJumpExu(fuType: UInt) = fuType === jmp 943b739f49SXuan Hu// def isFpExu(fuType: UInt) = fuType(3, 2) === "b10".U 953b739f49SXuan Hu// def isMemExu(fuType: UInt) = fuType(3, 2) === "b11".U 963b739f49SXuan Hu// def isLoadStore(fuType: UInt) = isMemExu(fuType) && !fuType(1) 973b739f49SXuan Hu// def isStoreExu(fuType: UInt) = isMemExu(fuType) && fuType(0) 983b739f49SXuan Hu// def isAMO(fuType: UInt) = fuType(1) 993b739f49SXuan Hu// def isFence(fuType: UInt) = fuType === fence 1003b739f49SXuan Hu// def isSvinvalBegin(fuType: UInt, func: UInt, flush: Bool) = isFence(fuType) && func === FenceOpType.nofence && !flush 1013b739f49SXuan Hu// def isSvinval(fuType: UInt, func: UInt, flush: Bool) = isFence(fuType) && func === FenceOpType.sfence && !flush 1023b739f49SXuan Hu// def isSvinvalEnd(fuType: UInt, func: UInt, flush: Bool) = isFence(fuType) && func === FenceOpType.nofence && flush 1033b739f49SXuan Hu// def isVpu(fuType: UInt) = fuType(4) 1043b739f49SXuan Hu// 1053b739f49SXuan Hu// def jmpCanAccept(fuType: UInt) = !fuType(2) 1063b739f49SXuan Hu// def mduCanAccept(fuType: UInt) = fuType(2) && !fuType(1) || fuType(2) && fuType(1) && fuType(0) 1073b739f49SXuan Hu// def aluCanAccept(fuType: UInt) = fuType(2) && fuType(1) && !fuType(0) 1083b739f49SXuan Hu// 1093b739f49SXuan Hu// def fmacCanAccept(fuType: UInt) = !fuType(1) 1103b739f49SXuan Hu// def fmiscCanAccept(fuType: UInt) = fuType(1) 1113b739f49SXuan Hu// 1123b739f49SXuan Hu// def loadCanAccept(fuType: UInt) = !fuType(0) 1133b739f49SXuan Hu// def storeCanAccept(fuType: UInt) = fuType(0) 1143b739f49SXuan Hu// 1153b739f49SXuan Hu// def storeIsAMO(fuType: UInt) = fuType(1) 1163b739f49SXuan Hu// 1173b739f49SXuan Hu// val functionNameMap = Map( 1183b739f49SXuan Hu// jmp.litValue() -> "jmp", 1193b739f49SXuan Hu// i2f.litValue() -> "int_to_float", 1203b739f49SXuan Hu// csr.litValue() -> "csr", 1213b739f49SXuan Hu// alu.litValue() -> "alu", 1223b739f49SXuan Hu// mul.litValue() -> "mul", 1233b739f49SXuan Hu// div.litValue() -> "div", 1243b739f49SXuan Hu// fence.litValue() -> "fence", 1253b739f49SXuan Hu// bku.litValue() -> "bku", 1263b739f49SXuan Hu// fmac.litValue() -> "fmac", 1273b739f49SXuan Hu// fmisc.litValue() -> "fmisc", 1283b739f49SXuan Hu// fDivSqrt.litValue() -> "fdiv_fsqrt", 1293b739f49SXuan Hu// ldu.litValue() -> "load", 1303b739f49SXuan Hu// stu.litValue() -> "store", 1313b739f49SXuan Hu// mou.litValue() -> "mou" 1323b739f49SXuan Hu// ) 1333b739f49SXuan Hu// } 1349a2e6b8aSLinJiawei 13557a10886SXuan Hu def FuOpTypeWidth = 8 1362225d46eSJiawei Lin object FuOpType { 13757a10886SXuan Hu def apply() = UInt(FuOpTypeWidth.W) 13857a10886SXuan Hu def X = BitPat("b00000000") 139ebd97ecbSzhanglinjuan } 140518d8658SYinan Xu 1413a2e64c4SZhangZifei // move VipuType and VfpuType into YunSuan/package.scala 1423a2e64c4SZhangZifei // object VipuType { 1433a2e64c4SZhangZifei // def dummy = 0.U(7.W) 1443a2e64c4SZhangZifei // } 1457f2b7720SXuan Hu 1463a2e64c4SZhangZifei // object VfpuType { 1473a2e64c4SZhangZifei // def dummy = 0.U(7.W) 1483a2e64c4SZhangZifei // } 1497f2b7720SXuan Hu 1507f2b7720SXuan Hu object VlduType { 15157a10886SXuan Hu def dummy = 0.U 1527f2b7720SXuan Hu } 1537f2b7720SXuan Hu 1547f2b7720SXuan Hu object VstuType { 15557a10886SXuan Hu def dummy = 0.U 1567f2b7720SXuan Hu } 1577f2b7720SXuan Hu 158a3edac52SYinan Xu object CommitType { 159c3abb8b6SYinan Xu def NORMAL = "b000".U // int/fp 160c3abb8b6SYinan Xu def BRANCH = "b001".U // branch 161c3abb8b6SYinan Xu def LOAD = "b010".U // load 162c3abb8b6SYinan Xu def STORE = "b011".U // store 163518d8658SYinan Xu 164c3abb8b6SYinan Xu def apply() = UInt(3.W) 165c3abb8b6SYinan Xu def isFused(commitType: UInt): Bool = commitType(2) 166c3abb8b6SYinan Xu def isLoadStore(commitType: UInt): Bool = !isFused(commitType) && commitType(1) 167c3abb8b6SYinan Xu def lsInstIsStore(commitType: UInt): Bool = commitType(0) 168c3abb8b6SYinan Xu def isStore(commitType: UInt): Bool = isLoadStore(commitType) && lsInstIsStore(commitType) 169c3abb8b6SYinan Xu def isBranch(commitType: UInt): Bool = commitType(0) && !commitType(1) && !isFused(commitType) 170518d8658SYinan Xu } 171bfb958a3SYinan Xu 172bfb958a3SYinan Xu object RedirectLevel { 1732d7c7105SYinan Xu def flushAfter = "b0".U 1742d7c7105SYinan Xu def flush = "b1".U 175bfb958a3SYinan Xu 1762d7c7105SYinan Xu def apply() = UInt(1.W) 1772d7c7105SYinan Xu // def isUnconditional(level: UInt) = level(1) 178bfb958a3SYinan Xu def flushItself(level: UInt) = level(0) 1792d7c7105SYinan Xu // def isException(level: UInt) = level(1) && level(0) 180bfb958a3SYinan Xu } 181baf8def6SYinan Xu 182baf8def6SYinan Xu object ExceptionVec { 183baf8def6SYinan Xu def apply() = Vec(16, Bool()) 184baf8def6SYinan Xu } 185a8e04b1dSYinan Xu 186c60c1ab4SWilliam Wang object PMAMode { 1878d9a04fcSWilliam Wang def R = "b1".U << 0 //readable 1888d9a04fcSWilliam Wang def W = "b1".U << 1 //writeable 1898d9a04fcSWilliam Wang def X = "b1".U << 2 //executable 1908d9a04fcSWilliam Wang def I = "b1".U << 3 //cacheable: icache 1918d9a04fcSWilliam Wang def D = "b1".U << 4 //cacheable: dcache 1928d9a04fcSWilliam Wang def S = "b1".U << 5 //enable speculative access 193cff68e26SWilliam Wang def A = "b1".U << 6 //enable atomic operation, A imply R & W 1948d9a04fcSWilliam Wang def C = "b1".U << 7 //if it is cacheable is configable 195c60c1ab4SWilliam Wang def Reserved = "b0".U 196c60c1ab4SWilliam Wang 197c60c1ab4SWilliam Wang def apply() = UInt(7.W) 198c60c1ab4SWilliam Wang 199c60c1ab4SWilliam Wang def read(mode: UInt) = mode(0) 200c60c1ab4SWilliam Wang def write(mode: UInt) = mode(1) 201c60c1ab4SWilliam Wang def execute(mode: UInt) = mode(2) 202c60c1ab4SWilliam Wang def icache(mode: UInt) = mode(3) 203c60c1ab4SWilliam Wang def dcache(mode: UInt) = mode(4) 204c60c1ab4SWilliam Wang def speculate(mode: UInt) = mode(5) 205c60c1ab4SWilliam Wang def atomic(mode: UInt) = mode(6) 206c60c1ab4SWilliam Wang def configable_cache(mode: UInt) = mode(7) 207c60c1ab4SWilliam Wang 208c60c1ab4SWilliam Wang def strToMode(s: String) = { 209423b9255SWilliam Wang var result = 0.U(8.W) 210c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("R") >= 0) result = result + R 211c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("W") >= 0) result = result + W 212c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("X") >= 0) result = result + X 213c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("I") >= 0) result = result + I 214c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("D") >= 0) result = result + D 215c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("S") >= 0) result = result + S 216c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("A") >= 0) result = result + A 217c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("C") >= 0) result = result + C 218c60c1ab4SWilliam Wang result 219c60c1ab4SWilliam Wang } 220c60c1ab4SWilliam Wang } 2212225d46eSJiawei Lin 2222225d46eSJiawei Lin 2232225d46eSJiawei Lin object CSROpType { 2242225d46eSJiawei Lin def jmp = "b000".U 2252225d46eSJiawei Lin def wrt = "b001".U 2262225d46eSJiawei Lin def set = "b010".U 2272225d46eSJiawei Lin def clr = "b011".U 228b6900d94SYinan Xu def wfi = "b100".U 2292225d46eSJiawei Lin def wrti = "b101".U 2302225d46eSJiawei Lin def seti = "b110".U 2312225d46eSJiawei Lin def clri = "b111".U 2325d669833SYinan Xu def needAccess(op: UInt): Bool = op(1, 0) =/= 0.U 2332225d46eSJiawei Lin } 2342225d46eSJiawei Lin 2352225d46eSJiawei Lin // jump 2362225d46eSJiawei Lin object JumpOpType { 2372225d46eSJiawei Lin def jal = "b00".U 2382225d46eSJiawei Lin def jalr = "b01".U 2392225d46eSJiawei Lin def auipc = "b10".U 2402225d46eSJiawei Lin// def call = "b11_011".U 2412225d46eSJiawei Lin// def ret = "b11_100".U 2422225d46eSJiawei Lin def jumpOpisJalr(op: UInt) = op(0) 2432225d46eSJiawei Lin def jumpOpisAuipc(op: UInt) = op(1) 2442225d46eSJiawei Lin } 2452225d46eSJiawei Lin 2462225d46eSJiawei Lin object FenceOpType { 2472225d46eSJiawei Lin def fence = "b10000".U 2482225d46eSJiawei Lin def sfence = "b10001".U 2492225d46eSJiawei Lin def fencei = "b10010".U 250af2f7849Shappy-lx def nofence= "b00000".U 2512225d46eSJiawei Lin } 2522225d46eSJiawei Lin 2532225d46eSJiawei Lin object ALUOpType { 254ee8ff153Szfw // shift optype 255675acc68SYinan Xu def slliuw = "b000_0000".U // slliuw: ZEXT(src1[31:0]) << shamt 256675acc68SYinan Xu def sll = "b000_0001".U // sll: src1 << src2 257ee8ff153Szfw 258675acc68SYinan Xu def bclr = "b000_0010".U // bclr: src1 & ~(1 << src2[5:0]) 259675acc68SYinan Xu def bset = "b000_0011".U // bset: src1 | (1 << src2[5:0]) 260675acc68SYinan Xu def binv = "b000_0100".U // binv: src1 ^ ~(1 << src2[5:0]) 261ee8ff153Szfw 262675acc68SYinan Xu def srl = "b000_0101".U // srl: src1 >> src2 263675acc68SYinan Xu def bext = "b000_0110".U // bext: (src1 >> src2)[0] 264675acc68SYinan Xu def sra = "b000_0111".U // sra: src1 >> src2 (arithmetic) 265ee8ff153Szfw 2667b441e5eSYinan Xu def rol = "b000_1001".U // rol: (src1 << src2) | (src1 >> (xlen - src2)) 2677b441e5eSYinan Xu def ror = "b000_1011".U // ror: (src1 >> src2) | (src1 << (xlen - src2)) 268184a1958Szfw 269ee8ff153Szfw // RV64 32bit optype 270675acc68SYinan Xu def addw = "b001_0000".U // addw: SEXT((src1 + src2)[31:0]) 271675acc68SYinan Xu def oddaddw = "b001_0001".U // oddaddw: SEXT((src1[0] + src2)[31:0]) 272675acc68SYinan Xu def subw = "b001_0010".U // subw: SEXT((src1 - src2)[31:0]) 273ee8ff153Szfw 274675acc68SYinan Xu def addwbit = "b001_0100".U // addwbit: (src1 + src2)[0] 275675acc68SYinan Xu def addwbyte = "b001_0101".U // addwbyte: (src1 + src2)[7:0] 276675acc68SYinan Xu def addwzexth = "b001_0110".U // addwzexth: ZEXT((src1 + src2)[15:0]) 277675acc68SYinan Xu def addwsexth = "b001_0111".U // addwsexth: SEXT((src1 + src2)[15:0]) 278ee8ff153Szfw 279675acc68SYinan Xu def sllw = "b001_1000".U // sllw: SEXT((src1 << src2)[31:0]) 280675acc68SYinan Xu def srlw = "b001_1001".U // srlw: SEXT((src1[31:0] >> src2)[31:0]) 281675acc68SYinan Xu def sraw = "b001_1010".U // sraw: SEXT((src1[31:0] >> src2)[31:0]) 282675acc68SYinan Xu def rolw = "b001_1100".U 283675acc68SYinan Xu def rorw = "b001_1101".U 284675acc68SYinan Xu 285675acc68SYinan Xu // ADD-op 286675acc68SYinan Xu def adduw = "b010_0000".U // adduw: src1[31:0] + src2 287675acc68SYinan Xu def add = "b010_0001".U // add: src1 + src2 288675acc68SYinan Xu def oddadd = "b010_0010".U // oddadd: src1[0] + src2 289675acc68SYinan Xu 290675acc68SYinan Xu def sr29add = "b010_0100".U // sr29add: src1[63:29] + src2 291675acc68SYinan Xu def sr30add = "b010_0101".U // sr30add: src1[63:30] + src2 292675acc68SYinan Xu def sr31add = "b010_0110".U // sr31add: src1[63:31] + src2 293675acc68SYinan Xu def sr32add = "b010_0111".U // sr32add: src1[63:32] + src2 294675acc68SYinan Xu 295675acc68SYinan Xu def sh1adduw = "b010_1000".U // sh1adduw: {src1[31:0], 1'b0} + src2 296675acc68SYinan Xu def sh1add = "b010_1001".U // sh1add: {src1[62:0], 1'b0} + src2 297675acc68SYinan Xu def sh2adduw = "b010_1010".U // sh2add_uw: {src1[31:0], 2'b0} + src2 298675acc68SYinan Xu def sh2add = "b010_1011".U // sh2add: {src1[61:0], 2'b0} + src2 299675acc68SYinan Xu def sh3adduw = "b010_1100".U // sh3add_uw: {src1[31:0], 3'b0} + src2 300675acc68SYinan Xu def sh3add = "b010_1101".U // sh3add: {src1[60:0], 3'b0} + src2 301675acc68SYinan Xu def sh4add = "b010_1111".U // sh4add: {src1[59:0], 4'b0} + src2 302675acc68SYinan Xu 303675acc68SYinan Xu // SUB-op: src1 - src2 304675acc68SYinan Xu def sub = "b011_0000".U 305675acc68SYinan Xu def sltu = "b011_0001".U 306675acc68SYinan Xu def slt = "b011_0010".U 307675acc68SYinan Xu def maxu = "b011_0100".U 308675acc68SYinan Xu def minu = "b011_0101".U 309675acc68SYinan Xu def max = "b011_0110".U 310675acc68SYinan Xu def min = "b011_0111".U 311675acc68SYinan Xu 312675acc68SYinan Xu // branch 313675acc68SYinan Xu def beq = "b111_0000".U 314675acc68SYinan Xu def bne = "b111_0010".U 315675acc68SYinan Xu def blt = "b111_1000".U 316675acc68SYinan Xu def bge = "b111_1010".U 317675acc68SYinan Xu def bltu = "b111_1100".U 318675acc68SYinan Xu def bgeu = "b111_1110".U 319675acc68SYinan Xu 320675acc68SYinan Xu // misc optype 321675acc68SYinan Xu def and = "b100_0000".U 322675acc68SYinan Xu def andn = "b100_0001".U 323675acc68SYinan Xu def or = "b100_0010".U 324675acc68SYinan Xu def orn = "b100_0011".U 325675acc68SYinan Xu def xor = "b100_0100".U 326675acc68SYinan Xu def xnor = "b100_0101".U 327675acc68SYinan Xu def orcb = "b100_0110".U 328675acc68SYinan Xu 329675acc68SYinan Xu def sextb = "b100_1000".U 330675acc68SYinan Xu def packh = "b100_1001".U 331675acc68SYinan Xu def sexth = "b100_1010".U 332675acc68SYinan Xu def packw = "b100_1011".U 333675acc68SYinan Xu 334675acc68SYinan Xu def revb = "b101_0000".U 335675acc68SYinan Xu def rev8 = "b101_0001".U 336675acc68SYinan Xu def pack = "b101_0010".U 337675acc68SYinan Xu def orh48 = "b101_0011".U 338675acc68SYinan Xu 339675acc68SYinan Xu def szewl1 = "b101_1000".U 340675acc68SYinan Xu def szewl2 = "b101_1001".U 341675acc68SYinan Xu def szewl3 = "b101_1010".U 342675acc68SYinan Xu def byte2 = "b101_1011".U 343675acc68SYinan Xu 344675acc68SYinan Xu def andlsb = "b110_0000".U 345675acc68SYinan Xu def andzexth = "b110_0001".U 346675acc68SYinan Xu def orlsb = "b110_0010".U 347675acc68SYinan Xu def orzexth = "b110_0011".U 348675acc68SYinan Xu def xorlsb = "b110_0100".U 349675acc68SYinan Xu def xorzexth = "b110_0101".U 350675acc68SYinan Xu def orcblsb = "b110_0110".U 351675acc68SYinan Xu def orcbzexth = "b110_0111".U 3524aa9ed34Sfdy def vsetvli1 = "b1000_0000".U 3534aa9ed34Sfdy def vsetvli2 = "b1000_0100".U 3544aa9ed34Sfdy def vsetvl1 = "b1000_0001".U 3554aa9ed34Sfdy def vsetvl2 = "b1000_0101".U 3564aa9ed34Sfdy def vsetivli1 = "b1000_0010".U 3574aa9ed34Sfdy def vsetivli2 = "b1000_0110".U 358675acc68SYinan Xu 359675acc68SYinan Xu def isAddw(func: UInt) = func(6, 4) === "b001".U && !func(3) && !func(1) 360675acc68SYinan Xu def isSimpleLogic(func: UInt) = func(6, 4) === "b100".U && !func(0) 361675acc68SYinan Xu def logicToLsb(func: UInt) = Cat("b110".U(3.W), func(3, 1), 0.U(1.W)) 362675acc68SYinan Xu def logicToZexth(func: UInt) = Cat("b110".U(3.W), func(3, 1), 1.U(1.W)) 3634aa9ed34Sfdy def isVset(func: UInt) = func(7, 3) === "b1000_0".U 3644aa9ed34Sfdy def isVsetvl(func: UInt) = isVset(func) && func(0) 3654aa9ed34Sfdy def isVsetvli(func: UInt) = isVset(func) && !func(1, 0).orR 3664aa9ed34Sfdy def vsetExchange(func: UInt) = Cat(func(7, 3), "b1".U, func(1, 0)) 367675acc68SYinan Xu 36857a10886SXuan Hu def apply() = UInt(FuOpTypeWidth.W) 3692225d46eSJiawei Lin } 3702225d46eSJiawei Lin 3713b739f49SXuan Hu object BRUOpType { 3723b739f49SXuan Hu // branch 3733b739f49SXuan Hu def beq = "b000_000".U 3743b739f49SXuan Hu def bne = "b000_001".U 3753b739f49SXuan Hu def blt = "b000_100".U 3763b739f49SXuan Hu def bge = "b000_101".U 3773b739f49SXuan Hu def bltu = "b001_000".U 3783b739f49SXuan Hu def bgeu = "b001_001".U 3793b739f49SXuan Hu 3803b739f49SXuan Hu def getBranchType(func: UInt) = func(3, 1) 3813b739f49SXuan Hu def isBranchInvert(func: UInt) = func(0) 3823b739f49SXuan Hu } 3833b739f49SXuan Hu 3843b739f49SXuan Hu object MULOpType { 3853b739f49SXuan Hu // mul 3863b739f49SXuan Hu // bit encoding: | type (2bit) | isWord(1bit) | opcode(2bit) | 3873b739f49SXuan Hu def mul = "b00000".U 3883b739f49SXuan Hu def mulh = "b00001".U 3893b739f49SXuan Hu def mulhsu = "b00010".U 3903b739f49SXuan Hu def mulhu = "b00011".U 3913b739f49SXuan Hu def mulw = "b00100".U 3923b739f49SXuan Hu 3933b739f49SXuan Hu def mulw7 = "b01100".U 3943b739f49SXuan Hu def isSign(op: UInt) = !op(1) 3953b739f49SXuan Hu def isW(op: UInt) = op(2) 3963b739f49SXuan Hu def isH(op: UInt) = op(1, 0) =/= 0.U 3973b739f49SXuan Hu def getOp(op: UInt) = Cat(op(3), op(1, 0)) 3983b739f49SXuan Hu } 3993b739f49SXuan Hu 4003b739f49SXuan Hu object DIVOpType { 4013b739f49SXuan Hu // div 4023b739f49SXuan Hu // bit encoding: | type (2bit) | isWord(1bit) | isSign(1bit) | opcode(1bit) | 4033b739f49SXuan Hu def div = "b10000".U 4043b739f49SXuan Hu def divu = "b10010".U 4053b739f49SXuan Hu def rem = "b10001".U 4063b739f49SXuan Hu def remu = "b10011".U 4073b739f49SXuan Hu 4083b739f49SXuan Hu def divw = "b10100".U 4093b739f49SXuan Hu def divuw = "b10110".U 4103b739f49SXuan Hu def remw = "b10101".U 4113b739f49SXuan Hu def remuw = "b10111".U 4123b739f49SXuan Hu 4133b739f49SXuan Hu def isSign(op: UInt) = !op(1) 4143b739f49SXuan Hu def isW(op: UInt) = op(2) 4153b739f49SXuan Hu def isH(op: UInt) = op(0) 4163b739f49SXuan Hu } 4173b739f49SXuan Hu 4182225d46eSJiawei Lin object MDUOpType { 4192225d46eSJiawei Lin // mul 4202225d46eSJiawei Lin // bit encoding: | type (2bit) | isWord(1bit) | opcode(2bit) | 4212225d46eSJiawei Lin def mul = "b00000".U 4222225d46eSJiawei Lin def mulh = "b00001".U 4232225d46eSJiawei Lin def mulhsu = "b00010".U 4242225d46eSJiawei Lin def mulhu = "b00011".U 4252225d46eSJiawei Lin def mulw = "b00100".U 4262225d46eSJiawei Lin 42788825c5cSYinan Xu def mulw7 = "b01100".U 42888825c5cSYinan Xu 4292225d46eSJiawei Lin // div 4302225d46eSJiawei Lin // bit encoding: | type (2bit) | isWord(1bit) | isSign(1bit) | opcode(1bit) | 43188825c5cSYinan Xu def div = "b10000".U 43288825c5cSYinan Xu def divu = "b10010".U 43388825c5cSYinan Xu def rem = "b10001".U 43488825c5cSYinan Xu def remu = "b10011".U 4352225d46eSJiawei Lin 43688825c5cSYinan Xu def divw = "b10100".U 43788825c5cSYinan Xu def divuw = "b10110".U 43888825c5cSYinan Xu def remw = "b10101".U 43988825c5cSYinan Xu def remuw = "b10111".U 4402225d46eSJiawei Lin 44188825c5cSYinan Xu def isMul(op: UInt) = !op(4) 44288825c5cSYinan Xu def isDiv(op: UInt) = op(4) 4432225d46eSJiawei Lin 4442225d46eSJiawei Lin def isDivSign(op: UInt) = isDiv(op) && !op(1) 4452225d46eSJiawei Lin def isW(op: UInt) = op(2) 4462225d46eSJiawei Lin def isH(op: UInt) = (isDiv(op) && op(0)) || (isMul(op) && op(1, 0) =/= 0.U) 4472225d46eSJiawei Lin def getMulOp(op: UInt) = op(1, 0) 4482225d46eSJiawei Lin } 4492225d46eSJiawei Lin 4502225d46eSJiawei Lin object LSUOpType { 451d200f594SWilliam Wang // load pipeline 4522225d46eSJiawei Lin 453d200f594SWilliam Wang // normal load 454d200f594SWilliam Wang // Note: bit(1, 0) are size, DO NOT CHANGE 455d200f594SWilliam Wang // bit encoding: | load 0 | is unsigned(1bit) | size(2bit) | 456d200f594SWilliam Wang def lb = "b0000".U 457d200f594SWilliam Wang def lh = "b0001".U 458d200f594SWilliam Wang def lw = "b0010".U 459d200f594SWilliam Wang def ld = "b0011".U 460d200f594SWilliam Wang def lbu = "b0100".U 461d200f594SWilliam Wang def lhu = "b0101".U 462d200f594SWilliam Wang def lwu = "b0110".U 463ca18a0b4SWilliam Wang 464d200f594SWilliam Wang // Zicbop software prefetch 465d200f594SWilliam Wang // bit encoding: | prefetch 1 | 0 | prefetch type (2bit) | 466d200f594SWilliam Wang def prefetch_i = "b1000".U // TODO 467d200f594SWilliam Wang def prefetch_r = "b1001".U 468d200f594SWilliam Wang def prefetch_w = "b1010".U 469ca18a0b4SWilliam Wang 470d200f594SWilliam Wang def isPrefetch(op: UInt): Bool = op(3) 471d200f594SWilliam Wang 472d200f594SWilliam Wang // store pipeline 473d200f594SWilliam Wang // normal store 474d200f594SWilliam Wang // bit encoding: | store 00 | size(2bit) | 475d200f594SWilliam Wang def sb = "b0000".U 476d200f594SWilliam Wang def sh = "b0001".U 477d200f594SWilliam Wang def sw = "b0010".U 478d200f594SWilliam Wang def sd = "b0011".U 479d200f594SWilliam Wang 480d200f594SWilliam Wang // l1 cache op 481d200f594SWilliam Wang // bit encoding: | cbo_zero 01 | size(2bit) 11 | 482d200f594SWilliam Wang def cbo_zero = "b0111".U 483d200f594SWilliam Wang 484d200f594SWilliam Wang // llc op 485d200f594SWilliam Wang // bit encoding: | prefetch 11 | suboptype(2bit) | 486d200f594SWilliam Wang def cbo_clean = "b1100".U 487d200f594SWilliam Wang def cbo_flush = "b1101".U 488d200f594SWilliam Wang def cbo_inval = "b1110".U 489d200f594SWilliam Wang 490d200f594SWilliam Wang def isCbo(op: UInt): Bool = op(3, 2) === "b11".U 4912225d46eSJiawei Lin 4922225d46eSJiawei Lin // atomics 4932225d46eSJiawei Lin // bit(1, 0) are size 4942225d46eSJiawei Lin // since atomics use a different fu type 4952225d46eSJiawei Lin // so we can safely reuse other load/store's encodings 496d200f594SWilliam Wang // bit encoding: | optype(4bit) | size (2bit) | 4972225d46eSJiawei Lin def lr_w = "b000010".U 4982225d46eSJiawei Lin def sc_w = "b000110".U 4992225d46eSJiawei Lin def amoswap_w = "b001010".U 5002225d46eSJiawei Lin def amoadd_w = "b001110".U 5012225d46eSJiawei Lin def amoxor_w = "b010010".U 5022225d46eSJiawei Lin def amoand_w = "b010110".U 5032225d46eSJiawei Lin def amoor_w = "b011010".U 5042225d46eSJiawei Lin def amomin_w = "b011110".U 5052225d46eSJiawei Lin def amomax_w = "b100010".U 5062225d46eSJiawei Lin def amominu_w = "b100110".U 5072225d46eSJiawei Lin def amomaxu_w = "b101010".U 5082225d46eSJiawei Lin 5092225d46eSJiawei Lin def lr_d = "b000011".U 5102225d46eSJiawei Lin def sc_d = "b000111".U 5112225d46eSJiawei Lin def amoswap_d = "b001011".U 5122225d46eSJiawei Lin def amoadd_d = "b001111".U 5132225d46eSJiawei Lin def amoxor_d = "b010011".U 5142225d46eSJiawei Lin def amoand_d = "b010111".U 5152225d46eSJiawei Lin def amoor_d = "b011011".U 5162225d46eSJiawei Lin def amomin_d = "b011111".U 5172225d46eSJiawei Lin def amomax_d = "b100011".U 5182225d46eSJiawei Lin def amominu_d = "b100111".U 5192225d46eSJiawei Lin def amomaxu_d = "b101011".U 520b6982e83SLemover 521b6982e83SLemover def size(op: UInt) = op(1,0) 5222225d46eSJiawei Lin } 5232225d46eSJiawei Lin 5243feeca58Szfw object BKUOpType { 525ee8ff153Szfw 5263feeca58Szfw def clmul = "b000000".U 5273feeca58Szfw def clmulh = "b000001".U 5283feeca58Szfw def clmulr = "b000010".U 5293feeca58Szfw def xpermn = "b000100".U 5303feeca58Szfw def xpermb = "b000101".U 531ee8ff153Szfw 5323feeca58Szfw def clz = "b001000".U 5333feeca58Szfw def clzw = "b001001".U 5343feeca58Szfw def ctz = "b001010".U 5353feeca58Szfw def ctzw = "b001011".U 5363feeca58Szfw def cpop = "b001100".U 5373feeca58Szfw def cpopw = "b001101".U 53807596dc6Szfw 5393feeca58Szfw // 01xxxx is reserve 5403feeca58Szfw def aes64es = "b100000".U 5413feeca58Szfw def aes64esm = "b100001".U 5423feeca58Szfw def aes64ds = "b100010".U 5433feeca58Szfw def aes64dsm = "b100011".U 5443feeca58Szfw def aes64im = "b100100".U 5453feeca58Szfw def aes64ks1i = "b100101".U 5463feeca58Szfw def aes64ks2 = "b100110".U 5473feeca58Szfw 5483feeca58Szfw // merge to two instruction sm4ks & sm4ed 54919bcce38SFawang Zhang def sm4ed0 = "b101000".U 55019bcce38SFawang Zhang def sm4ed1 = "b101001".U 55119bcce38SFawang Zhang def sm4ed2 = "b101010".U 55219bcce38SFawang Zhang def sm4ed3 = "b101011".U 55319bcce38SFawang Zhang def sm4ks0 = "b101100".U 55419bcce38SFawang Zhang def sm4ks1 = "b101101".U 55519bcce38SFawang Zhang def sm4ks2 = "b101110".U 55619bcce38SFawang Zhang def sm4ks3 = "b101111".U 5573feeca58Szfw 5583feeca58Szfw def sha256sum0 = "b110000".U 5593feeca58Szfw def sha256sum1 = "b110001".U 5603feeca58Szfw def sha256sig0 = "b110010".U 5613feeca58Szfw def sha256sig1 = "b110011".U 5623feeca58Szfw def sha512sum0 = "b110100".U 5633feeca58Szfw def sha512sum1 = "b110101".U 5643feeca58Szfw def sha512sig0 = "b110110".U 5653feeca58Szfw def sha512sig1 = "b110111".U 5663feeca58Szfw 5673feeca58Szfw def sm3p0 = "b111000".U 5683feeca58Szfw def sm3p1 = "b111001".U 569ee8ff153Szfw } 570ee8ff153Szfw 5712225d46eSJiawei Lin object BTBtype { 5722225d46eSJiawei Lin def B = "b00".U // branch 5732225d46eSJiawei Lin def J = "b01".U // jump 5742225d46eSJiawei Lin def I = "b10".U // indirect 5752225d46eSJiawei Lin def R = "b11".U // return 5762225d46eSJiawei Lin 5772225d46eSJiawei Lin def apply() = UInt(2.W) 5782225d46eSJiawei Lin } 5792225d46eSJiawei Lin 5802225d46eSJiawei Lin object SelImm { 581ee8ff153Szfw def IMM_X = "b0111".U 582ee8ff153Szfw def IMM_S = "b0000".U 583ee8ff153Szfw def IMM_SB = "b0001".U 584ee8ff153Szfw def IMM_U = "b0010".U 585ee8ff153Szfw def IMM_UJ = "b0011".U 586ee8ff153Szfw def IMM_I = "b0100".U 587ee8ff153Szfw def IMM_Z = "b0101".U 588ee8ff153Szfw def INVALID_INSTR = "b0110".U 589ee8ff153Szfw def IMM_B6 = "b1000".U 5902225d46eSJiawei Lin 59158c35d23Shuxuan0307 def IMM_OPIVIS = "b1001".U 59258c35d23Shuxuan0307 def IMM_OPIVIU = "b1010".U 593912e2179SXuan Hu def IMM_VSETVLI = "b1100".U 594912e2179SXuan Hu def IMM_VSETIVLI = "b1101".U 59558c35d23Shuxuan0307 59657a10886SXuan Hu def X = BitPat("b0000") 5976e7c9679Shuxuan0307 598ee8ff153Szfw def apply() = UInt(4.W) 5992225d46eSJiawei Lin } 6002225d46eSJiawei Lin 6016ab6918fSYinan Xu object ExceptionNO { 6026ab6918fSYinan Xu def instrAddrMisaligned = 0 6036ab6918fSYinan Xu def instrAccessFault = 1 6046ab6918fSYinan Xu def illegalInstr = 2 6056ab6918fSYinan Xu def breakPoint = 3 6066ab6918fSYinan Xu def loadAddrMisaligned = 4 6076ab6918fSYinan Xu def loadAccessFault = 5 6086ab6918fSYinan Xu def storeAddrMisaligned = 6 6096ab6918fSYinan Xu def storeAccessFault = 7 6106ab6918fSYinan Xu def ecallU = 8 6116ab6918fSYinan Xu def ecallS = 9 6126ab6918fSYinan Xu def ecallM = 11 6136ab6918fSYinan Xu def instrPageFault = 12 6146ab6918fSYinan Xu def loadPageFault = 13 6156ab6918fSYinan Xu // def singleStep = 14 6166ab6918fSYinan Xu def storePageFault = 15 6176ab6918fSYinan Xu def priorities = Seq( 6186ab6918fSYinan Xu breakPoint, // TODO: different BP has different priority 6196ab6918fSYinan Xu instrPageFault, 6206ab6918fSYinan Xu instrAccessFault, 6216ab6918fSYinan Xu illegalInstr, 6226ab6918fSYinan Xu instrAddrMisaligned, 6236ab6918fSYinan Xu ecallM, ecallS, ecallU, 624d880177dSYinan Xu storeAddrMisaligned, 625d880177dSYinan Xu loadAddrMisaligned, 6266ab6918fSYinan Xu storePageFault, 6276ab6918fSYinan Xu loadPageFault, 6286ab6918fSYinan Xu storeAccessFault, 629d880177dSYinan Xu loadAccessFault 6306ab6918fSYinan Xu ) 6316ab6918fSYinan Xu def all = priorities.distinct.sorted 6326ab6918fSYinan Xu def frontendSet = Seq( 6336ab6918fSYinan Xu instrAddrMisaligned, 6346ab6918fSYinan Xu instrAccessFault, 6356ab6918fSYinan Xu illegalInstr, 6366ab6918fSYinan Xu instrPageFault 6376ab6918fSYinan Xu ) 6386ab6918fSYinan Xu def partialSelect(vec: Vec[Bool], select: Seq[Int]): Vec[Bool] = { 6396ab6918fSYinan Xu val new_vec = Wire(ExceptionVec()) 6406ab6918fSYinan Xu new_vec.foreach(_ := false.B) 6416ab6918fSYinan Xu select.foreach(i => new_vec(i) := vec(i)) 6426ab6918fSYinan Xu new_vec 6436ab6918fSYinan Xu } 6446ab6918fSYinan Xu def selectFrontend(vec: Vec[Bool]): Vec[Bool] = partialSelect(vec, frontendSet) 6456ab6918fSYinan Xu def selectAll(vec: Vec[Bool]): Vec[Bool] = partialSelect(vec, ExceptionNO.all) 6466ab6918fSYinan Xu def selectByFu(vec:Vec[Bool], fuConfig: FuConfig): Vec[Bool] = 6476ab6918fSYinan Xu partialSelect(vec, fuConfig.exceptionOut) 6483b739f49SXuan Hu// def selectByExu(vec:Vec[Bool], exuConfig: ExuConfig): Vec[Bool] = 6493b739f49SXuan Hu// partialSelect(vec, exuConfig.exceptionOut) 6503b739f49SXuan Hu// def selectByExu(vec:Vec[Bool], exuConfigs: Seq[ExuConfig]): Vec[Bool] = 6513b739f49SXuan Hu// partialSelect(vec, exuConfigs.map(_.exceptionOut).reduce(_ ++ _).distinct.sorted) 6526ab6918fSYinan Xu } 6536ab6918fSYinan Xu 6543b739f49SXuan Hu// def dividerGen(p: Parameters) = new DividerWrapper(p(XLen))(p) 6553b739f49SXuan Hu// def multiplierGen(p: Parameters) = new ArrayMultiplier(p(XLen) + 1)(p) 6563b739f49SXuan Hu// def aluGen(p: Parameters) = new Alu()(p) 6573b739f49SXuan Hu// def bkuGen(p: Parameters) = new Bku()(p) 6583b739f49SXuan Hu// def jmpGen(p: Parameters) = new Jump()(p) 6593b739f49SXuan Hu// def fenceGen(p: Parameters) = new Fence()(p) 6603b739f49SXuan Hu// def csrGen(p: Parameters) = new CSR()(p) 6613b739f49SXuan Hu// def i2fGen(p: Parameters) = new IntToFP()(p) 6623b739f49SXuan Hu// def fmacGen(p: Parameters) = new FMA()(p) 6633b739f49SXuan Hu// def f2iGen(p: Parameters) = new FPToInt()(p) 6643b739f49SXuan Hu// def f2fGen(p: Parameters) = new FPToFP()(p) 6653b739f49SXuan Hu// def fdivSqrtGen(p: Parameters) = new FDivSqrt()(p) 6663b739f49SXuan Hu// def stdGen(p: Parameters) = new Std()(p) 6673b739f49SXuan Hu// def mouDataGen(p: Parameters) = new Std()(p) 6683b739f49SXuan Hu// def vipuGen(p: Parameters) = new VIPU()(p) 6693b739f49SXuan Hu// 6703b739f49SXuan Hu// def f2iSel(uop: MicroOp): Bool = { 6713b739f49SXuan Hu// uop.ctrl.rfWen 6723b739f49SXuan Hu// } 6733b739f49SXuan Hu// 6743b739f49SXuan Hu// def i2fSel(uop: MicroOp): Bool = { 6753b739f49SXuan Hu// uop.ctrl.fpu.fromInt 6763b739f49SXuan Hu// } 6773b739f49SXuan Hu// 6783b739f49SXuan Hu// def f2fSel(uop: MicroOp): Bool = { 6793b739f49SXuan Hu// val ctrl = uop.ctrl.fpu 6803b739f49SXuan Hu// ctrl.fpWen && !ctrl.div && !ctrl.sqrt 6813b739f49SXuan Hu// } 6823b739f49SXuan Hu// 6833b739f49SXuan Hu// def fdivSqrtSel(uop: MicroOp): Bool = { 6843b739f49SXuan Hu// val ctrl = uop.ctrl.fpu 6853b739f49SXuan Hu// ctrl.div || ctrl.sqrt 6863b739f49SXuan Hu// } 6873b739f49SXuan Hu// 6883b739f49SXuan Hu// val aluCfg = FuConfig( 6893b739f49SXuan Hu// name = "alu", 6903b739f49SXuan Hu// fuGen = aluGen, 6913b739f49SXuan Hu// fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.alu, 6923b739f49SXuan Hu// fuType = FuType.alu, 6933b739f49SXuan Hu// numIntSrc = 2, 6943b739f49SXuan Hu// numFpSrc = 0, 6953b739f49SXuan Hu// writeIntRf = true, 6963b739f49SXuan Hu// writeFpRf = false, 6973b739f49SXuan Hu// hasRedirect = true, 6983b739f49SXuan Hu// ) 6993b739f49SXuan Hu// 7003b739f49SXuan Hu// val jmpCfg = FuConfig( 7013b739f49SXuan Hu// name = "jmp", 7023b739f49SXuan Hu// fuGen = jmpGen, 7033b739f49SXuan Hu// fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.jmp, 7043b739f49SXuan Hu// fuType = FuType.jmp, 7053b739f49SXuan Hu// numIntSrc = 1, 7063b739f49SXuan Hu// numFpSrc = 0, 7073b739f49SXuan Hu// writeIntRf = true, 7083b739f49SXuan Hu// writeFpRf = false, 7093b739f49SXuan Hu// hasRedirect = true, 7103b739f49SXuan Hu// ) 7113b739f49SXuan Hu// 7123b739f49SXuan Hu// val fenceCfg = FuConfig( 7133b739f49SXuan Hu// name = "fence", 7143b739f49SXuan Hu// fuGen = fenceGen, 7153b739f49SXuan Hu// fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.fence, 7163b739f49SXuan Hu// FuType.fence, 2, 0, writeIntRf = false, writeFpRf = false, 7173b739f49SXuan Hu// latency = UncertainLatency(), exceptionOut = Seq(illegalInstr), // TODO: need rewrite latency structure, not just this value, 7183b739f49SXuan Hu// flushPipe = true 7193b739f49SXuan Hu// ) 7203b739f49SXuan Hu// 7213b739f49SXuan Hu// val csrCfg = FuConfig( 7223b739f49SXuan Hu// name = "csr", 7233b739f49SXuan Hu// fuGen = csrGen, 7243b739f49SXuan Hu// fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.csr, 7253b739f49SXuan Hu// fuType = FuType.csr, 7263b739f49SXuan Hu// numIntSrc = 1, 7273b739f49SXuan Hu// numFpSrc = 0, 7283b739f49SXuan Hu// writeIntRf = true, 7293b739f49SXuan Hu// writeFpRf = false, 7303b739f49SXuan Hu// exceptionOut = Seq(illegalInstr, breakPoint, ecallU, ecallS, ecallM), 7313b739f49SXuan Hu// flushPipe = true 7323b739f49SXuan Hu// ) 7333b739f49SXuan Hu// 7343b739f49SXuan Hu// val i2fCfg = FuConfig( 7353b739f49SXuan Hu// name = "i2f", 7363b739f49SXuan Hu// fuGen = i2fGen, 7373b739f49SXuan Hu// fuSel = i2fSel, 7383b739f49SXuan Hu// FuType.i2f, 7393b739f49SXuan Hu// numIntSrc = 1, 7403b739f49SXuan Hu// numFpSrc = 0, 7413b739f49SXuan Hu// writeIntRf = false, 7423b739f49SXuan Hu// writeFpRf = true, 7433b739f49SXuan Hu// writeFflags = true, 7443b739f49SXuan Hu// latency = CertainLatency(2), 7453b739f49SXuan Hu// fastUopOut = true, fastImplemented = true 7463b739f49SXuan Hu// ) 7473b739f49SXuan Hu// 7483b739f49SXuan Hu// val divCfg = FuConfig( 7493b739f49SXuan Hu// name = "div", 7503b739f49SXuan Hu// fuGen = dividerGen, 7513b739f49SXuan Hu// fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.div, 7523b739f49SXuan Hu// FuType.div, 7533b739f49SXuan Hu// 2, 7543b739f49SXuan Hu// 0, 7553b739f49SXuan Hu// writeIntRf = true, 7563b739f49SXuan Hu// writeFpRf = false, 7573b739f49SXuan Hu// latency = UncertainLatency(), 7583b739f49SXuan Hu// fastUopOut = true, 7593b739f49SXuan Hu// fastImplemented = true, 7603b739f49SXuan Hu// hasInputBuffer = (true, 4, true) 7613b739f49SXuan Hu// ) 7623b739f49SXuan Hu// 7633b739f49SXuan Hu// val mulCfg = FuConfig( 7643b739f49SXuan Hu// name = "mul", 7653b739f49SXuan Hu// fuGen = multiplierGen, 7663b739f49SXuan Hu// fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.mul, 7673b739f49SXuan Hu// FuType.mul, 7683b739f49SXuan Hu// 2, 7693b739f49SXuan Hu// 0, 7703b739f49SXuan Hu// writeIntRf = true, 7713b739f49SXuan Hu// writeFpRf = false, 7723b739f49SXuan Hu// latency = CertainLatency(2), 7733b739f49SXuan Hu// fastUopOut = true, 7743b739f49SXuan Hu// fastImplemented = true 7753b739f49SXuan Hu// ) 7763b739f49SXuan Hu// 7773b739f49SXuan Hu// val bkuCfg = FuConfig( 7783b739f49SXuan Hu// name = "bku", 7793b739f49SXuan Hu// fuGen = bkuGen, 7803b739f49SXuan Hu// fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.bku, 7813b739f49SXuan Hu// fuType = FuType.bku, 7823b739f49SXuan Hu// numIntSrc = 2, 7833b739f49SXuan Hu// numFpSrc = 0, 7843b739f49SXuan Hu// writeIntRf = true, 7853b739f49SXuan Hu// writeFpRf = false, 7863b739f49SXuan Hu// latency = CertainLatency(1), 7873b739f49SXuan Hu// fastUopOut = true, 7883b739f49SXuan Hu// fastImplemented = true 7893b739f49SXuan Hu// ) 7903b739f49SXuan Hu// 7913b739f49SXuan Hu// val fmacCfg = FuConfig( 7923b739f49SXuan Hu// name = "fmac", 7933b739f49SXuan Hu// fuGen = fmacGen, 7943b739f49SXuan Hu// fuSel = _ => true.B, 7953b739f49SXuan Hu// FuType.fmac, 0, 3, writeIntRf = false, writeFpRf = true, writeFflags = true, 7963b739f49SXuan Hu// latency = UncertainLatency(), fastUopOut = true, fastImplemented = true 7973b739f49SXuan Hu// ) 7983b739f49SXuan Hu// 7993b739f49SXuan Hu// val f2iCfg = FuConfig( 8003b739f49SXuan Hu// name = "f2i", 8013b739f49SXuan Hu// fuGen = f2iGen, 8023b739f49SXuan Hu// fuSel = f2iSel, 8033b739f49SXuan Hu// FuType.fmisc, 0, 1, writeIntRf = true, writeFpRf = false, writeFflags = true, latency = CertainLatency(2), 8043b739f49SXuan Hu// fastUopOut = true, fastImplemented = true 8053b739f49SXuan Hu// ) 8063b739f49SXuan Hu// 8073b739f49SXuan Hu// val f2fCfg = FuConfig( 8083b739f49SXuan Hu// name = "f2f", 8093b739f49SXuan Hu// fuGen = f2fGen, 8103b739f49SXuan Hu// fuSel = f2fSel, 8113b739f49SXuan Hu// FuType.fmisc, 0, 1, writeIntRf = false, writeFpRf = true, writeFflags = true, latency = CertainLatency(2), 8123b739f49SXuan Hu// fastUopOut = true, fastImplemented = true 8133b739f49SXuan Hu// ) 8143b739f49SXuan Hu// 8153b739f49SXuan Hu// val fdivSqrtCfg = FuConfig( 8163b739f49SXuan Hu// name = "fdivSqrt", 8173b739f49SXuan Hu// fuGen = fdivSqrtGen, 8183b739f49SXuan Hu// fuSel = fdivSqrtSel, 8193b739f49SXuan Hu// FuType.fDivSqrt, 0, 2, writeIntRf = false, writeFpRf = true, writeFflags = true, latency = UncertainLatency(), 8203b739f49SXuan Hu// fastUopOut = true, fastImplemented = true, hasInputBuffer = (true, 8, true) 8213b739f49SXuan Hu// ) 8223b739f49SXuan Hu// 8233b739f49SXuan Hu// val lduCfg = FuConfig( 8243b739f49SXuan Hu// "ldu", 8253b739f49SXuan Hu// null, // DontCare 8263b739f49SXuan Hu// (uop: MicroOp) => FuType.loadCanAccept(uop.ctrl.fuType), 8273b739f49SXuan Hu// FuType.ldu, 1, 0, writeIntRf = true, writeFpRf = true, 8283b739f49SXuan Hu// latency = UncertainLatency(), 8293b739f49SXuan Hu// exceptionOut = Seq(loadAddrMisaligned, loadAccessFault, loadPageFault), 8303b739f49SXuan Hu// flushPipe = true, 8313b739f49SXuan Hu// replayInst = true, 8323b739f49SXuan Hu// hasLoadError = true 8333b739f49SXuan Hu// ) 8343b739f49SXuan Hu// 8353b739f49SXuan Hu// val staCfg = FuConfig( 8363b739f49SXuan Hu// "sta", 8373b739f49SXuan Hu// null, 8383b739f49SXuan Hu// (uop: MicroOp) => FuType.storeCanAccept(uop.ctrl.fuType), 8393b739f49SXuan Hu// FuType.stu, 1, 0, writeIntRf = false, writeFpRf = false, 8403b739f49SXuan Hu// latency = UncertainLatency(), 8413b739f49SXuan Hu// exceptionOut = Seq(storeAddrMisaligned, storeAccessFault, storePageFault) 8423b739f49SXuan Hu// ) 8433b739f49SXuan Hu// 8443b739f49SXuan Hu// val stdCfg = FuConfig( 8453b739f49SXuan Hu// "std", 8463b739f49SXuan Hu// fuGen = stdGen, fuSel = (uop: MicroOp) => FuType.storeCanAccept(uop.ctrl.fuType), FuType.stu, 1, 1, 8473b739f49SXuan Hu// writeIntRf = false, writeFpRf = false, latency = CertainLatency(1) 8483b739f49SXuan Hu// ) 8493b739f49SXuan Hu// 8503b739f49SXuan Hu// val mouCfg = FuConfig( 8513b739f49SXuan Hu// "mou", 8523b739f49SXuan Hu// null, 8533b739f49SXuan Hu// (uop: MicroOp) => FuType.storeCanAccept(uop.ctrl.fuType), 8543b739f49SXuan Hu// FuType.mou, 1, 0, writeIntRf = false, writeFpRf = false, 8553b739f49SXuan Hu// latency = UncertainLatency(), exceptionOut = lduCfg.exceptionOut ++ staCfg.exceptionOut 8563b739f49SXuan Hu// ) 8573b739f49SXuan Hu// 8583b739f49SXuan Hu// val mouDataCfg = FuConfig( 8593b739f49SXuan Hu// "mou", 8603b739f49SXuan Hu// mouDataGen, 8613b739f49SXuan Hu// (uop: MicroOp) => FuType.storeCanAccept(uop.ctrl.fuType), 8623b739f49SXuan Hu// FuType.mou, 1, 0, writeIntRf = false, writeFpRf = false, 8633b739f49SXuan Hu// latency = UncertainLatency() 8643b739f49SXuan Hu// ) 8653b739f49SXuan Hu// 8663b739f49SXuan Hu// val vipuCfg = FuConfig( 8673b739f49SXuan Hu// name = "vipu", 8683b739f49SXuan Hu// fuGen = vipuGen, 8693b739f49SXuan Hu// fuSel = (uop: MicroOp) => FuType.vipu === uop.ctrl.fuType, 8703b739f49SXuan Hu// fuType = FuType.vipu, 8713b739f49SXuan Hu// numIntSrc = 0, numFpSrc = 0, writeIntRf = false, writeFpRf = false, writeFflags = false, 8723b739f49SXuan Hu// numVecSrc = 2, writeVecRf = true, 8733b739f49SXuan Hu// fastUopOut = true, // TODO: check 8743b739f49SXuan Hu// fastImplemented = true, //TODO: check 8753b739f49SXuan Hu// ) 8762225d46eSJiawei Lin 8773b739f49SXuan Hu// val JumpExeUnitCfg = ExuConfig("JmpExeUnit", "Int", Seq(jmpCfg, i2fCfg), 2, Int.MaxValue) 8783b739f49SXuan Hu// val AluExeUnitCfg = ExuConfig("AluExeUnit", "Int", Seq(aluCfg), 0, Int.MaxValue) 8793b739f49SXuan Hu// val JumpCSRExeUnitCfg = ExuConfig("JmpCSRExeUnit", "Int", Seq(jmpCfg, csrCfg, fenceCfg, i2fCfg), 2, Int.MaxValue) 8803b739f49SXuan Hu// val MulDivExeUnitCfg = ExuConfig("MulDivExeUnit", "Int", Seq(mulCfg, divCfg, bkuCfg), 1, Int.MaxValue) 8813b739f49SXuan Hu// val FmacExeUnitCfg = ExuConfig("FmacExeUnit", "Fp", Seq(fmacCfg, vipuCfg), Int.MaxValue, 0) 8823b739f49SXuan Hu// val FmiscExeUnitCfg = ExuConfig( 8833b739f49SXuan Hu// "FmiscExeUnit", 8843b739f49SXuan Hu// "Fp", 8853b739f49SXuan Hu// Seq(f2iCfg, f2fCfg, fdivSqrtCfg), 8863b739f49SXuan Hu// Int.MaxValue, 1 8873b739f49SXuan Hu// ) 8883b739f49SXuan Hu// val LdExeUnitCfg = ExuConfig("LoadExu", "Mem", Seq(lduCfg), wbIntPriority = 0, wbFpPriority = 0, extendsExu = false) 8893b739f49SXuan Hu// val StaExeUnitCfg = ExuConfig("StaExu", "Mem", Seq(staCfg, mouCfg), wbIntPriority = Int.MaxValue, wbFpPriority = Int.MaxValue, extendsExu = false) 8903b739f49SXuan Hu// val StdExeUnitCfg = ExuConfig("StdExu", "Mem", Seq(stdCfg, mouDataCfg), wbIntPriority = Int.MaxValue, wbFpPriority = Int.MaxValue, extendsExu = false) 89154034ccdSZhangZifei 892d16f4ea4SZhangZifei // def jumpRSWrapperGen(p: Parameters) = new JumpRSWrapper()(p) 893d16f4ea4SZhangZifei // def mulRSWrapperGen(p: Parameters) = new MulRSWrapper()(p) 894d16f4ea4SZhangZifei // def loadRSWrapperGen(p: Parameters) = new LoadRSWrapper()(p) 895d16f4ea4SZhangZifei // def stdRSWrapperGen(p: Parameters) = new StdRSWrapper()(p) 896d16f4ea4SZhangZifei // def staRSWrapperGen(p: Parameters) = new StaRSWrapper()(p) 897d16f4ea4SZhangZifei // def fmaRSWrapperGen(p: Parameters) = new FMARSWrapper()(p) 898d16f4ea4SZhangZifei // def fmiscRSWrapperGen(p: Parameters) = new FMiscRSWrapper()(p) 89954034ccdSZhangZifei 9003b739f49SXuan Hu// val aluRSMod = new RSMod( 9013b739f49SXuan Hu// rsWrapperGen = (modGen: RSMod, p: Parameters) => new ALURSWrapper(modGen)(p), 9023b739f49SXuan Hu// rsGen = (a: RSParams, b: Parameters) => new ALURS(a)(b), 9033b739f49SXuan Hu// immExtractorGen = (src: Int, width: Int, p: Parameters) => new AluImmExtractor()(p) 9043b739f49SXuan Hu// ) 9053b739f49SXuan Hu// val fmaRSMod = new RSMod( 9063b739f49SXuan Hu// rsWrapperGen = (modGen: RSMod, p: Parameters) => new FMARSWrapper(modGen)(p), 9073b739f49SXuan Hu// rsGen = (a: RSParams, b: Parameters) => new FMARS(a)(b), 9083b739f49SXuan Hu// ) 9093b739f49SXuan Hu// val fmiscRSMod = new RSMod( 9103b739f49SXuan Hu// rsWrapperGen = (modGen: RSMod, p: Parameters) => new FMiscRSWrapper(modGen)(p), 9113b739f49SXuan Hu// rsGen = (a: RSParams, b: Parameters) => new FMiscRS(a)(b), 9123b739f49SXuan Hu// ) 9133b739f49SXuan Hu// val jumpRSMod = new RSMod( 9143b739f49SXuan Hu// rsWrapperGen = (modGen: RSMod, p: Parameters) => new JumpRSWrapper(modGen)(p), 9153b739f49SXuan Hu// rsGen = (a: RSParams, b: Parameters) => new JumpRS(a)(b), 9163b739f49SXuan Hu// immExtractorGen = (src: Int, width: Int, p: Parameters) => new JumpImmExtractor()(p) 9173b739f49SXuan Hu// ) 9183b739f49SXuan Hu// val loadRSMod = new RSMod( 9193b739f49SXuan Hu// rsWrapperGen = (modGen: RSMod, p: Parameters) => new LoadRSWrapper(modGen)(p), 9203b739f49SXuan Hu// rsGen = (a: RSParams, b: Parameters) => new LoadRS(a)(b), 9213b739f49SXuan Hu// immExtractorGen = (src: Int, width: Int, p: Parameters) => new LoadImmExtractor()(p) 9223b739f49SXuan Hu// ) 9233b739f49SXuan Hu// val mulRSMod = new RSMod( 9243b739f49SXuan Hu// rsWrapperGen = (modGen: RSMod, p: Parameters) => new MulRSWrapper(modGen)(p), 9253b739f49SXuan Hu// rsGen = (a: RSParams, b: Parameters) => new MulRS(a)(b), 9263b739f49SXuan Hu// immExtractorGen = (src: Int, width: Int, p: Parameters) => new MduImmExtractor()(p) 9273b739f49SXuan Hu// ) 9283b739f49SXuan Hu// val staRSMod = new RSMod( 9293b739f49SXuan Hu// rsWrapperGen = (modGen: RSMod, p: Parameters) => new StaRSWrapper(modGen)(p), 9303b739f49SXuan Hu// rsGen = (a: RSParams, b: Parameters) => new StaRS(a)(b), 9313b739f49SXuan Hu// ) 9323b739f49SXuan Hu// val stdRSMod = new RSMod( 9333b739f49SXuan Hu// rsWrapperGen = (modGen: RSMod, p: Parameters) => new StdRSWrapper(modGen)(p), 9343b739f49SXuan Hu// rsGen = (a: RSParams, b: Parameters) => new StdRS(a)(b), 9353b739f49SXuan Hu// ) 9369a2e6b8aSLinJiawei} 937