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._ 192225d46eSJiawei Linimport chipsalliance.rocketchip.config.Parameters 202225d46eSJiawei Linimport freechips.rocketchip.tile.XLen 216ab6918fSYinan Xuimport xiangshan.ExceptionNO._ 2254034ccdSZhangZifeiimport xiangshan.backend.issue._ 232225d46eSJiawei Linimport xiangshan.backend.fu._ 242225d46eSJiawei Linimport xiangshan.backend.fu.fpu._ 256827759bSZhangZifeiimport xiangshan.backend.fu.vector._ 262225d46eSJiawei Linimport xiangshan.backend.exu._ 2754034ccdSZhangZifeiimport xiangshan.backend.{Std, ScheLaneConfig} 282225d46eSJiawei Lin 299a2e6b8aSLinJiaweipackage object xiangshan { 309ee9f926SYikeZhou object SrcType { 311285b047SXuan Hu def imm = "b000".U 321285b047SXuan Hu def pc = "b000".U 331285b047SXuan Hu def xp = "b001".U 341285b047SXuan Hu def fp = "b010".U 351285b047SXuan Hu def vp = "b100".U 3604b56283SZhangZifei 371285b047SXuan Hu // alias 381285b047SXuan Hu def reg = this.xp 391a3df1feSYikeZhou def DC = imm // Don't Care 4057a10886SXuan Hu def X = BitPat("b000") 414d24c305SYikeZhou 4204b56283SZhangZifei def isPc(srcType: UInt) = srcType===pc 4304b56283SZhangZifei def isImm(srcType: UInt) = srcType===imm 441285b047SXuan Hu def isReg(srcType: UInt) = srcType(0) 452b4e8253SYinan Xu def isFp(srcType: UInt) = srcType(1) 461285b047SXuan Hu def isVp(srcType: UInt) = srcType(2) 471285b047SXuan Hu def isPcOrImm(srcType: UInt) = isPc(srcType) || isImm(srcType) 4804b56283SZhangZifei 49f062e05dSZhangZifei def isNull(srcType: UInt) = !(isPcOrImm(srcType) || isReg(srcType) || 50f062e05dSZhangZifei isFp(srcType) || isVp(srcType)) 51f062e05dSZhangZifei 521285b047SXuan Hu def apply() = UInt(3.W) 539a2e6b8aSLinJiawei } 549a2e6b8aSLinJiawei 559a2e6b8aSLinJiawei object SrcState { 56100aa93cSYinan Xu def busy = "b0".U 57100aa93cSYinan Xu def rdy = "b1".U 58100aa93cSYinan Xu // def specRdy = "b10".U // speculative ready, for future use 59100aa93cSYinan Xu def apply() = UInt(1.W) 609a2e6b8aSLinJiawei } 619a2e6b8aSLinJiawei 627f2b7720SXuan Hu // Todo: Use OH instead 632225d46eSJiawei Lin object FuType { 6457a10886SXuan Hu def jmp = "b00000".U 6557a10886SXuan Hu def i2f = "b00001".U 6657a10886SXuan Hu def csr = "b00010".U 6757a10886SXuan Hu def alu = "b00110".U 6857a10886SXuan Hu def mul = "b00100".U 6957a10886SXuan Hu def div = "b00101".U 7057a10886SXuan Hu def fence = "b00011".U 7157a10886SXuan Hu def bku = "b00111".U 72cafb3558SLinJiawei 7357a10886SXuan Hu def fmac = "b01000".U 7457a10886SXuan Hu def fmisc = "b01011".U 7557a10886SXuan Hu def fDivSqrt = "b01010".U 76cafb3558SLinJiawei 7757a10886SXuan Hu def ldu = "b01100".U 7857a10886SXuan Hu def stu = "b01101".U 7957a10886SXuan Hu def mou = "b01111".U // for amo, lr, sc, fence 8099e169c5Sczw 8157a10886SXuan Hu def vipu = "b10000".U 82*adf68ff3Sczw def vimac = "b10010".U // for VIMacU 83876aa65bSczw def vialuF = "b10001".U // for VIALU Fixed-Point instructions 8457a10886SXuan Hu def vfpu = "b11000".U 857f2b7720SXuan Hu def vldu = "b11100".U 867f2b7720SXuan Hu def vstu = "b11101".U 8799e169c5Sczw def vppu = "b11001".U // for Permutation Unit 8899e169c5Sczw def X = BitPat("b00000") // TODO: It may be a potential bug 896e7c9679Shuxuan0307 9099e169c5Sczw def num = 19 912225d46eSJiawei Lin 929a2e6b8aSLinJiawei def apply() = UInt(log2Up(num).W) 939a2e6b8aSLinJiawei 940f038924SZhangZifei // TODO: Optimize FuTpye and its method 950f038924SZhangZifei // FIXME: Vector FuType coding is not ready 960f038924SZhangZifei def isVecExu(fuType: UInt) = fuType(4) 970f038924SZhangZifei def isIntExu(fuType: UInt) = !isVecExu(fuType) && !fuType(3) 986ac289b3SLinJiawei def isJumpExu(fuType: UInt) = fuType === jmp 990f038924SZhangZifei def isFpExu(fuType: UInt) = !isVecExu(fuType) && (fuType(3, 2) === "b10".U) 1000f038924SZhangZifei def isMemExu(fuType: UInt) = !isVecExu(fuType) && (fuType(3, 2) === "b11".U) 10192ab24ebSYinan Xu def isLoadStore(fuType: UInt) = isMemExu(fuType) && !fuType(1) 10292ab24ebSYinan Xu def isStoreExu(fuType: UInt) = isMemExu(fuType) && fuType(0) 1030f9d3717SYinan Xu def isAMO(fuType: UInt) = fuType(1) 104af2f7849Shappy-lx def isFence(fuType: UInt) = fuType === fence 105af2f7849Shappy-lx def isSvinvalBegin(fuType: UInt, func: UInt, flush: Bool) = isFence(fuType) && func === FenceOpType.nofence && !flush 106af2f7849Shappy-lx def isSvinval(fuType: UInt, func: UInt, flush: Bool) = isFence(fuType) && func === FenceOpType.sfence && !flush 107af2f7849Shappy-lx def isSvinvalEnd(fuType: UInt, func: UInt, flush: Bool) = isFence(fuType) && func === FenceOpType.nofence && flush 10892ab24ebSYinan Xu 10992ab24ebSYinan Xu def jmpCanAccept(fuType: UInt) = !fuType(2) 110ee8ff153Szfw def mduCanAccept(fuType: UInt) = fuType(2) && !fuType(1) || fuType(2) && fuType(1) && fuType(0) 111ee8ff153Szfw def aluCanAccept(fuType: UInt) = fuType(2) && fuType(1) && !fuType(0) 11292ab24ebSYinan Xu 11392ab24ebSYinan Xu def fmacCanAccept(fuType: UInt) = !fuType(1) 11492ab24ebSYinan Xu def fmiscCanAccept(fuType: UInt) = fuType(1) 11592ab24ebSYinan Xu 11692ab24ebSYinan Xu def loadCanAccept(fuType: UInt) = !fuType(0) 11792ab24ebSYinan Xu def storeCanAccept(fuType: UInt) = fuType(0) 11892ab24ebSYinan Xu 11992ab24ebSYinan Xu def storeIsAMO(fuType: UInt) = fuType(1) 120cafb3558SLinJiawei 121cafb3558SLinJiawei val functionNameMap = Map( 122cafb3558SLinJiawei jmp.litValue() -> "jmp", 123ebb8ebf8SYinan Xu i2f.litValue() -> "int_to_float", 124cafb3558SLinJiawei csr.litValue() -> "csr", 125cafb3558SLinJiawei alu.litValue() -> "alu", 126cafb3558SLinJiawei mul.litValue() -> "mul", 127cafb3558SLinJiawei div.litValue() -> "div", 128b8f08ca0SZhangZifei fence.litValue() -> "fence", 1293feeca58Szfw bku.litValue() -> "bku", 130cafb3558SLinJiawei fmac.litValue() -> "fmac", 131cafb3558SLinJiawei fmisc.litValue() -> "fmisc", 132d18dc7e6Swakafa fDivSqrt.litValue() -> "fdiv_fsqrt", 133cafb3558SLinJiawei ldu.litValue() -> "load", 134ebb8ebf8SYinan Xu stu.litValue() -> "store", 135ebb8ebf8SYinan Xu mou.litValue() -> "mou" 136cafb3558SLinJiawei ) 1379a2e6b8aSLinJiawei } 1389a2e6b8aSLinJiawei 13957a10886SXuan Hu def FuOpTypeWidth = 8 1402225d46eSJiawei Lin object FuOpType { 14157a10886SXuan Hu def apply() = UInt(FuOpTypeWidth.W) 14257a10886SXuan Hu def X = BitPat("b00000000") 143ebd97ecbSzhanglinjuan } 144518d8658SYinan Xu 1453a2e64c4SZhangZifei // move VipuType and VfpuType into YunSuan/package.scala 1463a2e64c4SZhangZifei // object VipuType { 1473a2e64c4SZhangZifei // def dummy = 0.U(7.W) 1483a2e64c4SZhangZifei // } 1497f2b7720SXuan Hu 1503a2e64c4SZhangZifei // object VfpuType { 1513a2e64c4SZhangZifei // def dummy = 0.U(7.W) 1523a2e64c4SZhangZifei // } 1537f2b7720SXuan Hu 1547f2b7720SXuan Hu object VlduType { 15557a10886SXuan Hu def dummy = 0.U 1567f2b7720SXuan Hu } 1577f2b7720SXuan Hu 1587f2b7720SXuan Hu object VstuType { 15957a10886SXuan Hu def dummy = 0.U 1607f2b7720SXuan Hu } 1617f2b7720SXuan Hu 162a3edac52SYinan Xu object CommitType { 163c3abb8b6SYinan Xu def NORMAL = "b000".U // int/fp 164c3abb8b6SYinan Xu def BRANCH = "b001".U // branch 165c3abb8b6SYinan Xu def LOAD = "b010".U // load 166c3abb8b6SYinan Xu def STORE = "b011".U // store 167518d8658SYinan Xu 168c3abb8b6SYinan Xu def apply() = UInt(3.W) 169c3abb8b6SYinan Xu def isFused(commitType: UInt): Bool = commitType(2) 170c3abb8b6SYinan Xu def isLoadStore(commitType: UInt): Bool = !isFused(commitType) && commitType(1) 171c3abb8b6SYinan Xu def lsInstIsStore(commitType: UInt): Bool = commitType(0) 172c3abb8b6SYinan Xu def isStore(commitType: UInt): Bool = isLoadStore(commitType) && lsInstIsStore(commitType) 173c3abb8b6SYinan Xu def isBranch(commitType: UInt): Bool = commitType(0) && !commitType(1) && !isFused(commitType) 174518d8658SYinan Xu } 175bfb958a3SYinan Xu 176bfb958a3SYinan Xu object RedirectLevel { 1772d7c7105SYinan Xu def flushAfter = "b0".U 1782d7c7105SYinan Xu def flush = "b1".U 179bfb958a3SYinan Xu 1802d7c7105SYinan Xu def apply() = UInt(1.W) 1812d7c7105SYinan Xu // def isUnconditional(level: UInt) = level(1) 182bfb958a3SYinan Xu def flushItself(level: UInt) = level(0) 1832d7c7105SYinan Xu // def isException(level: UInt) = level(1) && level(0) 184bfb958a3SYinan Xu } 185baf8def6SYinan Xu 186baf8def6SYinan Xu object ExceptionVec { 187baf8def6SYinan Xu def apply() = Vec(16, Bool()) 188baf8def6SYinan Xu } 189a8e04b1dSYinan Xu 190c60c1ab4SWilliam Wang object PMAMode { 1918d9a04fcSWilliam Wang def R = "b1".U << 0 //readable 1928d9a04fcSWilliam Wang def W = "b1".U << 1 //writeable 1938d9a04fcSWilliam Wang def X = "b1".U << 2 //executable 1948d9a04fcSWilliam Wang def I = "b1".U << 3 //cacheable: icache 1958d9a04fcSWilliam Wang def D = "b1".U << 4 //cacheable: dcache 1968d9a04fcSWilliam Wang def S = "b1".U << 5 //enable speculative access 197cff68e26SWilliam Wang def A = "b1".U << 6 //enable atomic operation, A imply R & W 1988d9a04fcSWilliam Wang def C = "b1".U << 7 //if it is cacheable is configable 199c60c1ab4SWilliam Wang def Reserved = "b0".U 200c60c1ab4SWilliam Wang 201c60c1ab4SWilliam Wang def apply() = UInt(7.W) 202c60c1ab4SWilliam Wang 203c60c1ab4SWilliam Wang def read(mode: UInt) = mode(0) 204c60c1ab4SWilliam Wang def write(mode: UInt) = mode(1) 205c60c1ab4SWilliam Wang def execute(mode: UInt) = mode(2) 206c60c1ab4SWilliam Wang def icache(mode: UInt) = mode(3) 207c60c1ab4SWilliam Wang def dcache(mode: UInt) = mode(4) 208c60c1ab4SWilliam Wang def speculate(mode: UInt) = mode(5) 209c60c1ab4SWilliam Wang def atomic(mode: UInt) = mode(6) 210c60c1ab4SWilliam Wang def configable_cache(mode: UInt) = mode(7) 211c60c1ab4SWilliam Wang 212c60c1ab4SWilliam Wang def strToMode(s: String) = { 213423b9255SWilliam Wang var result = 0.U(8.W) 214c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("R") >= 0) result = result + R 215c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("W") >= 0) result = result + W 216c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("X") >= 0) result = result + X 217c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("I") >= 0) result = result + I 218c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("D") >= 0) result = result + D 219c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("S") >= 0) result = result + S 220c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("A") >= 0) result = result + A 221c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("C") >= 0) result = result + C 222c60c1ab4SWilliam Wang result 223c60c1ab4SWilliam Wang } 224c60c1ab4SWilliam Wang } 2252225d46eSJiawei Lin 2262225d46eSJiawei Lin 2272225d46eSJiawei Lin object CSROpType { 2282225d46eSJiawei Lin def jmp = "b000".U 2292225d46eSJiawei Lin def wrt = "b001".U 2302225d46eSJiawei Lin def set = "b010".U 2312225d46eSJiawei Lin def clr = "b011".U 232b6900d94SYinan Xu def wfi = "b100".U 2332225d46eSJiawei Lin def wrti = "b101".U 2342225d46eSJiawei Lin def seti = "b110".U 2352225d46eSJiawei Lin def clri = "b111".U 2365d669833SYinan Xu def needAccess(op: UInt): Bool = op(1, 0) =/= 0.U 2372225d46eSJiawei Lin } 2382225d46eSJiawei Lin 2392225d46eSJiawei Lin // jump 2402225d46eSJiawei Lin object JumpOpType { 2412225d46eSJiawei Lin def jal = "b00".U 2422225d46eSJiawei Lin def jalr = "b01".U 2432225d46eSJiawei Lin def auipc = "b10".U 2442225d46eSJiawei Lin// def call = "b11_011".U 2452225d46eSJiawei Lin// def ret = "b11_100".U 2462225d46eSJiawei Lin def jumpOpisJalr(op: UInt) = op(0) 2472225d46eSJiawei Lin def jumpOpisAuipc(op: UInt) = op(1) 2482225d46eSJiawei Lin } 2492225d46eSJiawei Lin 2502225d46eSJiawei Lin object FenceOpType { 2512225d46eSJiawei Lin def fence = "b10000".U 2522225d46eSJiawei Lin def sfence = "b10001".U 2532225d46eSJiawei Lin def fencei = "b10010".U 254af2f7849Shappy-lx def nofence= "b00000".U 2552225d46eSJiawei Lin } 2562225d46eSJiawei Lin 2572225d46eSJiawei Lin object ALUOpType { 258ee8ff153Szfw // shift optype 259675acc68SYinan Xu def slliuw = "b000_0000".U // slliuw: ZEXT(src1[31:0]) << shamt 260675acc68SYinan Xu def sll = "b000_0001".U // sll: src1 << src2 261ee8ff153Szfw 262675acc68SYinan Xu def bclr = "b000_0010".U // bclr: src1 & ~(1 << src2[5:0]) 263675acc68SYinan Xu def bset = "b000_0011".U // bset: src1 | (1 << src2[5:0]) 264675acc68SYinan Xu def binv = "b000_0100".U // binv: src1 ^ ~(1 << src2[5:0]) 265ee8ff153Szfw 266675acc68SYinan Xu def srl = "b000_0101".U // srl: src1 >> src2 267675acc68SYinan Xu def bext = "b000_0110".U // bext: (src1 >> src2)[0] 268675acc68SYinan Xu def sra = "b000_0111".U // sra: src1 >> src2 (arithmetic) 269ee8ff153Szfw 2707b441e5eSYinan Xu def rol = "b000_1001".U // rol: (src1 << src2) | (src1 >> (xlen - src2)) 2717b441e5eSYinan Xu def ror = "b000_1011".U // ror: (src1 >> src2) | (src1 << (xlen - src2)) 272184a1958Szfw 273ee8ff153Szfw // RV64 32bit optype 274675acc68SYinan Xu def addw = "b001_0000".U // addw: SEXT((src1 + src2)[31:0]) 275675acc68SYinan Xu def oddaddw = "b001_0001".U // oddaddw: SEXT((src1[0] + src2)[31:0]) 276675acc68SYinan Xu def subw = "b001_0010".U // subw: SEXT((src1 - src2)[31:0]) 277ee8ff153Szfw 278675acc68SYinan Xu def addwbit = "b001_0100".U // addwbit: (src1 + src2)[0] 279675acc68SYinan Xu def addwbyte = "b001_0101".U // addwbyte: (src1 + src2)[7:0] 280675acc68SYinan Xu def addwzexth = "b001_0110".U // addwzexth: ZEXT((src1 + src2)[15:0]) 281675acc68SYinan Xu def addwsexth = "b001_0111".U // addwsexth: SEXT((src1 + src2)[15:0]) 282ee8ff153Szfw 283675acc68SYinan Xu def sllw = "b001_1000".U // sllw: SEXT((src1 << src2)[31:0]) 284675acc68SYinan Xu def srlw = "b001_1001".U // srlw: SEXT((src1[31:0] >> src2)[31:0]) 285675acc68SYinan Xu def sraw = "b001_1010".U // sraw: SEXT((src1[31:0] >> src2)[31:0]) 286675acc68SYinan Xu def rolw = "b001_1100".U 287675acc68SYinan Xu def rorw = "b001_1101".U 288675acc68SYinan Xu 289675acc68SYinan Xu // ADD-op 290675acc68SYinan Xu def adduw = "b010_0000".U // adduw: src1[31:0] + src2 291675acc68SYinan Xu def add = "b010_0001".U // add: src1 + src2 292675acc68SYinan Xu def oddadd = "b010_0010".U // oddadd: src1[0] + src2 293675acc68SYinan Xu 294675acc68SYinan Xu def sr29add = "b010_0100".U // sr29add: src1[63:29] + src2 295675acc68SYinan Xu def sr30add = "b010_0101".U // sr30add: src1[63:30] + src2 296675acc68SYinan Xu def sr31add = "b010_0110".U // sr31add: src1[63:31] + src2 297675acc68SYinan Xu def sr32add = "b010_0111".U // sr32add: src1[63:32] + src2 298675acc68SYinan Xu 299675acc68SYinan Xu def sh1adduw = "b010_1000".U // sh1adduw: {src1[31:0], 1'b0} + src2 300675acc68SYinan Xu def sh1add = "b010_1001".U // sh1add: {src1[62:0], 1'b0} + src2 301675acc68SYinan Xu def sh2adduw = "b010_1010".U // sh2add_uw: {src1[31:0], 2'b0} + src2 302675acc68SYinan Xu def sh2add = "b010_1011".U // sh2add: {src1[61:0], 2'b0} + src2 303675acc68SYinan Xu def sh3adduw = "b010_1100".U // sh3add_uw: {src1[31:0], 3'b0} + src2 304675acc68SYinan Xu def sh3add = "b010_1101".U // sh3add: {src1[60:0], 3'b0} + src2 305675acc68SYinan Xu def sh4add = "b010_1111".U // sh4add: {src1[59:0], 4'b0} + src2 306675acc68SYinan Xu 307675acc68SYinan Xu // SUB-op: src1 - src2 308675acc68SYinan Xu def sub = "b011_0000".U 309675acc68SYinan Xu def sltu = "b011_0001".U 310675acc68SYinan Xu def slt = "b011_0010".U 311675acc68SYinan Xu def maxu = "b011_0100".U 312675acc68SYinan Xu def minu = "b011_0101".U 313675acc68SYinan Xu def max = "b011_0110".U 314675acc68SYinan Xu def min = "b011_0111".U 315675acc68SYinan Xu 316675acc68SYinan Xu // branch 317675acc68SYinan Xu def beq = "b111_0000".U 318675acc68SYinan Xu def bne = "b111_0010".U 319675acc68SYinan Xu def blt = "b111_1000".U 320675acc68SYinan Xu def bge = "b111_1010".U 321675acc68SYinan Xu def bltu = "b111_1100".U 322675acc68SYinan Xu def bgeu = "b111_1110".U 323675acc68SYinan Xu 324675acc68SYinan Xu // misc optype 325675acc68SYinan Xu def and = "b100_0000".U 326675acc68SYinan Xu def andn = "b100_0001".U 327675acc68SYinan Xu def or = "b100_0010".U 328675acc68SYinan Xu def orn = "b100_0011".U 329675acc68SYinan Xu def xor = "b100_0100".U 330675acc68SYinan Xu def xnor = "b100_0101".U 331675acc68SYinan Xu def orcb = "b100_0110".U 332675acc68SYinan Xu 333675acc68SYinan Xu def sextb = "b100_1000".U 334675acc68SYinan Xu def packh = "b100_1001".U 335675acc68SYinan Xu def sexth = "b100_1010".U 336675acc68SYinan Xu def packw = "b100_1011".U 337675acc68SYinan Xu 338675acc68SYinan Xu def revb = "b101_0000".U 339675acc68SYinan Xu def rev8 = "b101_0001".U 340675acc68SYinan Xu def pack = "b101_0010".U 341675acc68SYinan Xu def orh48 = "b101_0011".U 342675acc68SYinan Xu 343675acc68SYinan Xu def szewl1 = "b101_1000".U 344675acc68SYinan Xu def szewl2 = "b101_1001".U 345675acc68SYinan Xu def szewl3 = "b101_1010".U 346675acc68SYinan Xu def byte2 = "b101_1011".U 347675acc68SYinan Xu 348675acc68SYinan Xu def andlsb = "b110_0000".U 349675acc68SYinan Xu def andzexth = "b110_0001".U 350675acc68SYinan Xu def orlsb = "b110_0010".U 351675acc68SYinan Xu def orzexth = "b110_0011".U 352675acc68SYinan Xu def xorlsb = "b110_0100".U 353675acc68SYinan Xu def xorzexth = "b110_0101".U 354675acc68SYinan Xu def orcblsb = "b110_0110".U 355675acc68SYinan Xu def orcbzexth = "b110_0111".U 3564aa9ed34Sfdy def vsetvli1 = "b1000_0000".U 3574aa9ed34Sfdy def vsetvli2 = "b1000_0100".U 3584aa9ed34Sfdy def vsetvl1 = "b1000_0001".U 3594aa9ed34Sfdy def vsetvl2 = "b1000_0101".U 3604aa9ed34Sfdy def vsetivli1 = "b1000_0010".U 3614aa9ed34Sfdy def vsetivli2 = "b1000_0110".U 362675acc68SYinan Xu 363675acc68SYinan Xu def isAddw(func: UInt) = func(6, 4) === "b001".U && !func(3) && !func(1) 364675acc68SYinan Xu def isSimpleLogic(func: UInt) = func(6, 4) === "b100".U && !func(0) 365675acc68SYinan Xu def logicToLsb(func: UInt) = Cat("b110".U(3.W), func(3, 1), 0.U(1.W)) 366675acc68SYinan Xu def logicToZexth(func: UInt) = Cat("b110".U(3.W), func(3, 1), 1.U(1.W)) 367675acc68SYinan Xu def isBranch(func: UInt) = func(6, 4) === "b111".U 368675acc68SYinan Xu def getBranchType(func: UInt) = func(3, 2) 369675acc68SYinan Xu def isBranchInvert(func: UInt) = func(1) 3704aa9ed34Sfdy def isVset(func: UInt) = func(7, 3) === "b1000_0".U 3714aa9ed34Sfdy def isVsetvl(func: UInt) = isVset(func) && func(0) 3724aa9ed34Sfdy def isVsetvli(func: UInt) = isVset(func) && !func(1, 0).orR 3734aa9ed34Sfdy def vsetExchange(func: UInt) = Cat(func(7, 3), "b1".U, func(1, 0)) 374675acc68SYinan Xu 37557a10886SXuan Hu def apply() = UInt(FuOpTypeWidth.W) 3762225d46eSJiawei Lin } 3772225d46eSJiawei Lin 3782225d46eSJiawei Lin object MDUOpType { 3792225d46eSJiawei Lin // mul 3802225d46eSJiawei Lin // bit encoding: | type (2bit) | isWord(1bit) | opcode(2bit) | 3812225d46eSJiawei Lin def mul = "b00000".U 3822225d46eSJiawei Lin def mulh = "b00001".U 3832225d46eSJiawei Lin def mulhsu = "b00010".U 3842225d46eSJiawei Lin def mulhu = "b00011".U 3852225d46eSJiawei Lin def mulw = "b00100".U 3862225d46eSJiawei Lin 38788825c5cSYinan Xu def mulw7 = "b01100".U 38888825c5cSYinan Xu 3892225d46eSJiawei Lin // div 3902225d46eSJiawei Lin // bit encoding: | type (2bit) | isWord(1bit) | isSign(1bit) | opcode(1bit) | 39188825c5cSYinan Xu def div = "b10000".U 39288825c5cSYinan Xu def divu = "b10010".U 39388825c5cSYinan Xu def rem = "b10001".U 39488825c5cSYinan Xu def remu = "b10011".U 3952225d46eSJiawei Lin 39688825c5cSYinan Xu def divw = "b10100".U 39788825c5cSYinan Xu def divuw = "b10110".U 39888825c5cSYinan Xu def remw = "b10101".U 39988825c5cSYinan Xu def remuw = "b10111".U 4002225d46eSJiawei Lin 40188825c5cSYinan Xu def isMul(op: UInt) = !op(4) 40288825c5cSYinan Xu def isDiv(op: UInt) = op(4) 4032225d46eSJiawei Lin 4042225d46eSJiawei Lin def isDivSign(op: UInt) = isDiv(op) && !op(1) 4052225d46eSJiawei Lin def isW(op: UInt) = op(2) 4062225d46eSJiawei Lin def isH(op: UInt) = (isDiv(op) && op(0)) || (isMul(op) && op(1, 0) =/= 0.U) 4072225d46eSJiawei Lin def getMulOp(op: UInt) = op(1, 0) 4082225d46eSJiawei Lin } 4092225d46eSJiawei Lin 4102225d46eSJiawei Lin object LSUOpType { 411d200f594SWilliam Wang // load pipeline 4122225d46eSJiawei Lin 413d200f594SWilliam Wang // normal load 414d200f594SWilliam Wang // Note: bit(1, 0) are size, DO NOT CHANGE 415d200f594SWilliam Wang // bit encoding: | load 0 | is unsigned(1bit) | size(2bit) | 416d200f594SWilliam Wang def lb = "b0000".U 417d200f594SWilliam Wang def lh = "b0001".U 418d200f594SWilliam Wang def lw = "b0010".U 419d200f594SWilliam Wang def ld = "b0011".U 420d200f594SWilliam Wang def lbu = "b0100".U 421d200f594SWilliam Wang def lhu = "b0101".U 422d200f594SWilliam Wang def lwu = "b0110".U 423ca18a0b4SWilliam Wang 424d200f594SWilliam Wang // Zicbop software prefetch 425d200f594SWilliam Wang // bit encoding: | prefetch 1 | 0 | prefetch type (2bit) | 426d200f594SWilliam Wang def prefetch_i = "b1000".U // TODO 427d200f594SWilliam Wang def prefetch_r = "b1001".U 428d200f594SWilliam Wang def prefetch_w = "b1010".U 429ca18a0b4SWilliam Wang 430d200f594SWilliam Wang def isPrefetch(op: UInt): Bool = op(3) 431d200f594SWilliam Wang 432d200f594SWilliam Wang // store pipeline 433d200f594SWilliam Wang // normal store 434d200f594SWilliam Wang // bit encoding: | store 00 | size(2bit) | 435d200f594SWilliam Wang def sb = "b0000".U 436d200f594SWilliam Wang def sh = "b0001".U 437d200f594SWilliam Wang def sw = "b0010".U 438d200f594SWilliam Wang def sd = "b0011".U 439d200f594SWilliam Wang 440d200f594SWilliam Wang // l1 cache op 441d200f594SWilliam Wang // bit encoding: | cbo_zero 01 | size(2bit) 11 | 442d200f594SWilliam Wang def cbo_zero = "b0111".U 443d200f594SWilliam Wang 444d200f594SWilliam Wang // llc op 445d200f594SWilliam Wang // bit encoding: | prefetch 11 | suboptype(2bit) | 446d200f594SWilliam Wang def cbo_clean = "b1100".U 447d200f594SWilliam Wang def cbo_flush = "b1101".U 448d200f594SWilliam Wang def cbo_inval = "b1110".U 449d200f594SWilliam Wang 450d200f594SWilliam Wang def isCbo(op: UInt): Bool = op(3, 2) === "b11".U 4512225d46eSJiawei Lin 4522225d46eSJiawei Lin // atomics 4532225d46eSJiawei Lin // bit(1, 0) are size 4542225d46eSJiawei Lin // since atomics use a different fu type 4552225d46eSJiawei Lin // so we can safely reuse other load/store's encodings 456d200f594SWilliam Wang // bit encoding: | optype(4bit) | size (2bit) | 4572225d46eSJiawei Lin def lr_w = "b000010".U 4582225d46eSJiawei Lin def sc_w = "b000110".U 4592225d46eSJiawei Lin def amoswap_w = "b001010".U 4602225d46eSJiawei Lin def amoadd_w = "b001110".U 4612225d46eSJiawei Lin def amoxor_w = "b010010".U 4622225d46eSJiawei Lin def amoand_w = "b010110".U 4632225d46eSJiawei Lin def amoor_w = "b011010".U 4642225d46eSJiawei Lin def amomin_w = "b011110".U 4652225d46eSJiawei Lin def amomax_w = "b100010".U 4662225d46eSJiawei Lin def amominu_w = "b100110".U 4672225d46eSJiawei Lin def amomaxu_w = "b101010".U 4682225d46eSJiawei Lin 4692225d46eSJiawei Lin def lr_d = "b000011".U 4702225d46eSJiawei Lin def sc_d = "b000111".U 4712225d46eSJiawei Lin def amoswap_d = "b001011".U 4722225d46eSJiawei Lin def amoadd_d = "b001111".U 4732225d46eSJiawei Lin def amoxor_d = "b010011".U 4742225d46eSJiawei Lin def amoand_d = "b010111".U 4752225d46eSJiawei Lin def amoor_d = "b011011".U 4762225d46eSJiawei Lin def amomin_d = "b011111".U 4772225d46eSJiawei Lin def amomax_d = "b100011".U 4782225d46eSJiawei Lin def amominu_d = "b100111".U 4792225d46eSJiawei Lin def amomaxu_d = "b101011".U 480b6982e83SLemover 481b6982e83SLemover def size(op: UInt) = op(1,0) 4822225d46eSJiawei Lin } 4832225d46eSJiawei Lin 4843feeca58Szfw object BKUOpType { 485ee8ff153Szfw 4863feeca58Szfw def clmul = "b000000".U 4873feeca58Szfw def clmulh = "b000001".U 4883feeca58Szfw def clmulr = "b000010".U 4893feeca58Szfw def xpermn = "b000100".U 4903feeca58Szfw def xpermb = "b000101".U 491ee8ff153Szfw 4923feeca58Szfw def clz = "b001000".U 4933feeca58Szfw def clzw = "b001001".U 4943feeca58Szfw def ctz = "b001010".U 4953feeca58Szfw def ctzw = "b001011".U 4963feeca58Szfw def cpop = "b001100".U 4973feeca58Szfw def cpopw = "b001101".U 49807596dc6Szfw 4993feeca58Szfw // 01xxxx is reserve 5003feeca58Szfw def aes64es = "b100000".U 5013feeca58Szfw def aes64esm = "b100001".U 5023feeca58Szfw def aes64ds = "b100010".U 5033feeca58Szfw def aes64dsm = "b100011".U 5043feeca58Szfw def aes64im = "b100100".U 5053feeca58Szfw def aes64ks1i = "b100101".U 5063feeca58Szfw def aes64ks2 = "b100110".U 5073feeca58Szfw 5083feeca58Szfw // merge to two instruction sm4ks & sm4ed 50919bcce38SFawang Zhang def sm4ed0 = "b101000".U 51019bcce38SFawang Zhang def sm4ed1 = "b101001".U 51119bcce38SFawang Zhang def sm4ed2 = "b101010".U 51219bcce38SFawang Zhang def sm4ed3 = "b101011".U 51319bcce38SFawang Zhang def sm4ks0 = "b101100".U 51419bcce38SFawang Zhang def sm4ks1 = "b101101".U 51519bcce38SFawang Zhang def sm4ks2 = "b101110".U 51619bcce38SFawang Zhang def sm4ks3 = "b101111".U 5173feeca58Szfw 5183feeca58Szfw def sha256sum0 = "b110000".U 5193feeca58Szfw def sha256sum1 = "b110001".U 5203feeca58Szfw def sha256sig0 = "b110010".U 5213feeca58Szfw def sha256sig1 = "b110011".U 5223feeca58Szfw def sha512sum0 = "b110100".U 5233feeca58Szfw def sha512sum1 = "b110101".U 5243feeca58Szfw def sha512sig0 = "b110110".U 5253feeca58Szfw def sha512sig1 = "b110111".U 5263feeca58Szfw 5273feeca58Szfw def sm3p0 = "b111000".U 5283feeca58Szfw def sm3p1 = "b111001".U 529ee8ff153Szfw } 530ee8ff153Szfw 5312225d46eSJiawei Lin object BTBtype { 5322225d46eSJiawei Lin def B = "b00".U // branch 5332225d46eSJiawei Lin def J = "b01".U // jump 5342225d46eSJiawei Lin def I = "b10".U // indirect 5352225d46eSJiawei Lin def R = "b11".U // return 5362225d46eSJiawei Lin 5372225d46eSJiawei Lin def apply() = UInt(2.W) 5382225d46eSJiawei Lin } 5392225d46eSJiawei Lin 5402225d46eSJiawei Lin object SelImm { 541ee8ff153Szfw def IMM_X = "b0111".U 54266ce8f52Sczw def IMM_S = "b1110".U 543ee8ff153Szfw def IMM_SB = "b0001".U 544ee8ff153Szfw def IMM_U = "b0010".U 545ee8ff153Szfw def IMM_UJ = "b0011".U 546ee8ff153Szfw def IMM_I = "b0100".U 547ee8ff153Szfw def IMM_Z = "b0101".U 548ee8ff153Szfw def INVALID_INSTR = "b0110".U 549ee8ff153Szfw def IMM_B6 = "b1000".U 5502225d46eSJiawei Lin 55158c35d23Shuxuan0307 def IMM_OPIVIS = "b1001".U 55258c35d23Shuxuan0307 def IMM_OPIVIU = "b1010".U 553912e2179SXuan Hu def IMM_VSETVLI = "b1100".U 554912e2179SXuan Hu def IMM_VSETIVLI = "b1101".U 55558c35d23Shuxuan0307 55657a10886SXuan Hu def X = BitPat("b0000") 5576e7c9679Shuxuan0307 558ee8ff153Szfw def apply() = UInt(4.W) 5592225d46eSJiawei Lin } 5602225d46eSJiawei Lin 561e2695e90SzhanglyGit object UopSplitType { 562b238ab97SzhanglyGit def SCA_SIM = "b000000".U // 563b238ab97SzhanglyGit def DIR = "b010001".U // dirty: vset 564b238ab97SzhanglyGit def VEC_VVV = "b010010".U // VEC_VVV 565b238ab97SzhanglyGit def VEC_VXV = "b010011".U // VEC_VXV 566b238ab97SzhanglyGit def VEC_0XV = "b010100".U // VEC_0XV 567b238ab97SzhanglyGit def VEC_VVW = "b010101".U // VEC_VVW 568b238ab97SzhanglyGit def VEC_WVW = "b010110".U // VEC_WVW 569b238ab97SzhanglyGit def VEC_VXW = "b010111".U // VEC_VXW 570b238ab97SzhanglyGit def VEC_WXW = "b011000".U // VEC_WXW 571b238ab97SzhanglyGit def VEC_WVV = "b011001".U // VEC_WVV 572b238ab97SzhanglyGit def VEC_WXV = "b011010".U // VEC_WXV 573b238ab97SzhanglyGit def VEC_EXT2 = "b011011".U // VF2 0 -> V 574b238ab97SzhanglyGit def VEC_EXT4 = "b011100".U // VF4 0 -> V 575b238ab97SzhanglyGit def VEC_EXT8 = "b011101".U // VF8 0 -> V 576b238ab97SzhanglyGit def VEC_VVM = "b011110".U // VEC_VVM 577b238ab97SzhanglyGit def VEC_VXM = "b011111".U // VEC_VXM 5784365a7a7Sczw def VEC_SLIDE1UP = "b100000".U // vslide1up.vx 5794365a7a7Sczw def VEC_FSLIDE1UP = "b100001".U // vfslide1up.vf 5804365a7a7Sczw def VEC_SLIDE1DOWN = "b100010".U // vslide1down.vx 5814365a7a7Sczw def VEC_FSLIDE1DOWN = "b100011".U // vfslide1down.vf 582b8298242Sczw def VEC_VRED = "b100100".U // VEC_VRED 583fbc24a91Sczw def VEC_SLIDEUP = "b100101".U // VEC_SLIDEUP 584fbc24a91Sczw def VEC_ISLIDEUP = "b100110".U // VEC_ISLIDEUP 585fbc24a91Sczw def VEC_SLIDEDOWN = "b100111".U // VEC_SLIDEDOWN 586fbc24a91Sczw def VEC_ISLIDEDOWN = "b101000".U // VEC_ISLIDEDOWN 5872b4b6de4Sczw def VEC_M0X = "b101001".U // VEC_M0X 0MV 5882b4b6de4Sczw def VEC_MVV = "b101010".U // VEC_MVV VMV 5892b4b6de4Sczw def VEC_M0X_VFIRST = "b101011".U // 59084260280Sczw def VEC_VWW = "b101100".U // 59165df1368Sczw def VEC_RGATHER = "b101101".U // vrgather.vv, vrgather.vi 59265df1368Sczw def VEC_RGATHER_VX = "b101110".U // vrgather.vx 59365df1368Sczw def VEC_RGATHEREI16 = "b101111".U // vrgatherei16.vv 594*adf68ff3Sczw def VEC_COMPRESS = "b110000".U // vcompress.vm 5952b4b6de4Sczw def VEC_M0M = "b000000".U // VEC_M0M 596b238ab97SzhanglyGit def VEC_MMM = "b000000".U // VEC_MMM 597b238ab97SzhanglyGit def dummy = "b111111".U 598acbea6c4SzhanglyGit 599b238ab97SzhanglyGit def X = BitPat("b000000") 600acbea6c4SzhanglyGit 601b238ab97SzhanglyGit def apply() = UInt(6.W) 602e2695e90SzhanglyGit def needSplit(UopSplitType: UInt) = UopSplitType(4) || UopSplitType(5) 603acbea6c4SzhanglyGit } 604acbea6c4SzhanglyGit 6056ab6918fSYinan Xu object ExceptionNO { 6066ab6918fSYinan Xu def instrAddrMisaligned = 0 6076ab6918fSYinan Xu def instrAccessFault = 1 6086ab6918fSYinan Xu def illegalInstr = 2 6096ab6918fSYinan Xu def breakPoint = 3 6106ab6918fSYinan Xu def loadAddrMisaligned = 4 6116ab6918fSYinan Xu def loadAccessFault = 5 6126ab6918fSYinan Xu def storeAddrMisaligned = 6 6136ab6918fSYinan Xu def storeAccessFault = 7 6146ab6918fSYinan Xu def ecallU = 8 6156ab6918fSYinan Xu def ecallS = 9 6166ab6918fSYinan Xu def ecallM = 11 6176ab6918fSYinan Xu def instrPageFault = 12 6186ab6918fSYinan Xu def loadPageFault = 13 6196ab6918fSYinan Xu // def singleStep = 14 6206ab6918fSYinan Xu def storePageFault = 15 6216ab6918fSYinan Xu def priorities = Seq( 6226ab6918fSYinan Xu breakPoint, // TODO: different BP has different priority 6236ab6918fSYinan Xu instrPageFault, 6246ab6918fSYinan Xu instrAccessFault, 6256ab6918fSYinan Xu illegalInstr, 6266ab6918fSYinan Xu instrAddrMisaligned, 6276ab6918fSYinan Xu ecallM, ecallS, ecallU, 628d880177dSYinan Xu storeAddrMisaligned, 629d880177dSYinan Xu loadAddrMisaligned, 6306ab6918fSYinan Xu storePageFault, 6316ab6918fSYinan Xu loadPageFault, 6326ab6918fSYinan Xu storeAccessFault, 633d880177dSYinan Xu loadAccessFault 6346ab6918fSYinan Xu ) 6356ab6918fSYinan Xu def all = priorities.distinct.sorted 6366ab6918fSYinan Xu def frontendSet = Seq( 6376ab6918fSYinan Xu instrAddrMisaligned, 6386ab6918fSYinan Xu instrAccessFault, 6396ab6918fSYinan Xu illegalInstr, 6406ab6918fSYinan Xu instrPageFault 6416ab6918fSYinan Xu ) 6426ab6918fSYinan Xu def partialSelect(vec: Vec[Bool], select: Seq[Int]): Vec[Bool] = { 6436ab6918fSYinan Xu val new_vec = Wire(ExceptionVec()) 6446ab6918fSYinan Xu new_vec.foreach(_ := false.B) 6456ab6918fSYinan Xu select.foreach(i => new_vec(i) := vec(i)) 6466ab6918fSYinan Xu new_vec 6476ab6918fSYinan Xu } 6486ab6918fSYinan Xu def selectFrontend(vec: Vec[Bool]): Vec[Bool] = partialSelect(vec, frontendSet) 6496ab6918fSYinan Xu def selectAll(vec: Vec[Bool]): Vec[Bool] = partialSelect(vec, ExceptionNO.all) 6506ab6918fSYinan Xu def selectByFu(vec:Vec[Bool], fuConfig: FuConfig): Vec[Bool] = 6516ab6918fSYinan Xu partialSelect(vec, fuConfig.exceptionOut) 6526ab6918fSYinan Xu def selectByExu(vec:Vec[Bool], exuConfig: ExuConfig): Vec[Bool] = 6536ab6918fSYinan Xu partialSelect(vec, exuConfig.exceptionOut) 6546ab6918fSYinan Xu def selectByExu(vec:Vec[Bool], exuConfigs: Seq[ExuConfig]): Vec[Bool] = 6556ab6918fSYinan Xu partialSelect(vec, exuConfigs.map(_.exceptionOut).reduce(_ ++ _).distinct.sorted) 6566ab6918fSYinan Xu } 6576ab6918fSYinan Xu 6581c62c387SYinan Xu def dividerGen(p: Parameters) = new DividerWrapper(p(XLen))(p) 659c3d7991bSJiawei Lin def multiplierGen(p: Parameters) = new ArrayMultiplier(p(XLen) + 1)(p) 6602225d46eSJiawei Lin def aluGen(p: Parameters) = new Alu()(p) 6613feeca58Szfw def bkuGen(p: Parameters) = new Bku()(p) 6622225d46eSJiawei Lin def jmpGen(p: Parameters) = new Jump()(p) 6632225d46eSJiawei Lin def fenceGen(p: Parameters) = new Fence()(p) 6642225d46eSJiawei Lin def csrGen(p: Parameters) = new CSR()(p) 6652225d46eSJiawei Lin def i2fGen(p: Parameters) = new IntToFP()(p) 6662225d46eSJiawei Lin def fmacGen(p: Parameters) = new FMA()(p) 6672225d46eSJiawei Lin def f2iGen(p: Parameters) = new FPToInt()(p) 6682225d46eSJiawei Lin def f2fGen(p: Parameters) = new FPToFP()(p) 6692225d46eSJiawei Lin def fdivSqrtGen(p: Parameters) = new FDivSqrt()(p) 67085b4cd54SYinan Xu def stdGen(p: Parameters) = new Std()(p) 6716ab6918fSYinan Xu def mouDataGen(p: Parameters) = new Std()(p) 6726827759bSZhangZifei def vipuGen(p: Parameters) = new VIPU()(p) 673*adf68ff3Sczw def vimacGen(p: Parameters) = new VIMacU()(p) 674876aa65bSczw def vialuFGen(p: Parameters) = new VIAluFix()(p) 675de9e1949Sczw def vppuGen(p: Parameters) = new VPerm()(p) 67694c0d8cfSczw def vfpuGen(p: Parameters) = new VFPU()(p) 6772225d46eSJiawei Lin 6786cdd85d9SYinan Xu def f2iSel(uop: MicroOp): Bool = { 6796cdd85d9SYinan Xu uop.ctrl.rfWen 6802225d46eSJiawei Lin } 6812225d46eSJiawei Lin 6826cdd85d9SYinan Xu def i2fSel(uop: MicroOp): Bool = { 6836cdd85d9SYinan Xu uop.ctrl.fpu.fromInt 6842225d46eSJiawei Lin } 6852225d46eSJiawei Lin 6866cdd85d9SYinan Xu def f2fSel(uop: MicroOp): Bool = { 6876cdd85d9SYinan Xu val ctrl = uop.ctrl.fpu 6882225d46eSJiawei Lin ctrl.fpWen && !ctrl.div && !ctrl.sqrt 6892225d46eSJiawei Lin } 6902225d46eSJiawei Lin 6916cdd85d9SYinan Xu def fdivSqrtSel(uop: MicroOp): Bool = { 6926cdd85d9SYinan Xu val ctrl = uop.ctrl.fpu 6932225d46eSJiawei Lin ctrl.div || ctrl.sqrt 6942225d46eSJiawei Lin } 6952225d46eSJiawei Lin 6962225d46eSJiawei Lin val aluCfg = FuConfig( 6971a0f06eeSYinan Xu name = "alu", 6982225d46eSJiawei Lin fuGen = aluGen, 6996cdd85d9SYinan Xu fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.alu, 7002225d46eSJiawei Lin fuType = FuType.alu, 7012225d46eSJiawei Lin numIntSrc = 2, 7022225d46eSJiawei Lin numFpSrc = 0, 7032225d46eSJiawei Lin writeIntRf = true, 7042225d46eSJiawei Lin writeFpRf = false, 7052225d46eSJiawei Lin hasRedirect = true, 7062225d46eSJiawei Lin ) 7072225d46eSJiawei Lin 7082225d46eSJiawei Lin val jmpCfg = FuConfig( 7091a0f06eeSYinan Xu name = "jmp", 7102225d46eSJiawei Lin fuGen = jmpGen, 7116cdd85d9SYinan Xu fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.jmp, 7122225d46eSJiawei Lin fuType = FuType.jmp, 7132225d46eSJiawei Lin numIntSrc = 1, 7142225d46eSJiawei Lin numFpSrc = 0, 7152225d46eSJiawei Lin writeIntRf = true, 7162225d46eSJiawei Lin writeFpRf = false, 7172225d46eSJiawei Lin hasRedirect = true, 7182225d46eSJiawei Lin ) 7192225d46eSJiawei Lin 7202225d46eSJiawei Lin val fenceCfg = FuConfig( 7211a0f06eeSYinan Xu name = "fence", 7222225d46eSJiawei Lin fuGen = fenceGen, 7236cdd85d9SYinan Xu fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.fence, 7246ab6918fSYinan Xu FuType.fence, 2, 0, writeIntRf = false, writeFpRf = false, 725f1fe8698SLemover latency = UncertainLatency(), exceptionOut = Seq(illegalInstr), // TODO: need rewrite latency structure, not just this value, 726f1fe8698SLemover flushPipe = true 7272225d46eSJiawei Lin ) 7282225d46eSJiawei Lin 7292225d46eSJiawei Lin val csrCfg = FuConfig( 7301a0f06eeSYinan Xu name = "csr", 7312225d46eSJiawei Lin fuGen = csrGen, 7326cdd85d9SYinan Xu fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.csr, 7332225d46eSJiawei Lin fuType = FuType.csr, 7342225d46eSJiawei Lin numIntSrc = 1, 7352225d46eSJiawei Lin numFpSrc = 0, 7362225d46eSJiawei Lin writeIntRf = true, 7372225d46eSJiawei Lin writeFpRf = false, 7386ab6918fSYinan Xu exceptionOut = Seq(illegalInstr, breakPoint, ecallU, ecallS, ecallM), 7396ab6918fSYinan Xu flushPipe = true 7402225d46eSJiawei Lin ) 7412225d46eSJiawei Lin 7422225d46eSJiawei Lin val i2fCfg = FuConfig( 7431a0f06eeSYinan Xu name = "i2f", 7442225d46eSJiawei Lin fuGen = i2fGen, 7452225d46eSJiawei Lin fuSel = i2fSel, 7462225d46eSJiawei Lin FuType.i2f, 7472225d46eSJiawei Lin numIntSrc = 1, 7482225d46eSJiawei Lin numFpSrc = 0, 7492225d46eSJiawei Lin writeIntRf = false, 7502225d46eSJiawei Lin writeFpRf = true, 7516ab6918fSYinan Xu writeFflags = true, 752e174d629SJiawei Lin latency = CertainLatency(2), 753e174d629SJiawei Lin fastUopOut = true, fastImplemented = true 7542225d46eSJiawei Lin ) 7552225d46eSJiawei Lin 7562225d46eSJiawei Lin val divCfg = FuConfig( 7571a0f06eeSYinan Xu name = "div", 7582225d46eSJiawei Lin fuGen = dividerGen, 75907596dc6Szfw fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.div, 7602225d46eSJiawei Lin FuType.div, 7612225d46eSJiawei Lin 2, 7622225d46eSJiawei Lin 0, 7632225d46eSJiawei Lin writeIntRf = true, 7642225d46eSJiawei Lin writeFpRf = false, 765f83b578aSYinan Xu latency = UncertainLatency(), 766f83b578aSYinan Xu fastUopOut = true, 7671c62c387SYinan Xu fastImplemented = true, 7685ee7cabeSYinan Xu hasInputBuffer = (true, 4, true) 7692225d46eSJiawei Lin ) 7702225d46eSJiawei Lin 7712225d46eSJiawei Lin val mulCfg = FuConfig( 7721a0f06eeSYinan Xu name = "mul", 7732225d46eSJiawei Lin fuGen = multiplierGen, 77407596dc6Szfw fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.mul, 7752225d46eSJiawei Lin FuType.mul, 7762225d46eSJiawei Lin 2, 7772225d46eSJiawei Lin 0, 7782225d46eSJiawei Lin writeIntRf = true, 7792225d46eSJiawei Lin writeFpRf = false, 780b2482bc1SYinan Xu latency = CertainLatency(2), 781f83b578aSYinan Xu fastUopOut = true, 782b2482bc1SYinan Xu fastImplemented = true 7832225d46eSJiawei Lin ) 7842225d46eSJiawei Lin 7853feeca58Szfw val bkuCfg = FuConfig( 7863feeca58Szfw name = "bku", 7873feeca58Szfw fuGen = bkuGen, 7883feeca58Szfw fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.bku, 7893feeca58Szfw fuType = FuType.bku, 790ee8ff153Szfw numIntSrc = 2, 791ee8ff153Szfw numFpSrc = 0, 792ee8ff153Szfw writeIntRf = true, 793ee8ff153Szfw writeFpRf = false, 794f83b578aSYinan Xu latency = CertainLatency(1), 795f83b578aSYinan Xu fastUopOut = true, 79607596dc6Szfw fastImplemented = true 797ee8ff153Szfw ) 798ee8ff153Szfw 7992225d46eSJiawei Lin val fmacCfg = FuConfig( 8001a0f06eeSYinan Xu name = "fmac", 8012225d46eSJiawei Lin fuGen = fmacGen, 8020f038924SZhangZifei fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.fmac, 8036ab6918fSYinan Xu FuType.fmac, 0, 3, writeIntRf = false, writeFpRf = true, writeFflags = true, 8044b65fc7eSJiawei Lin latency = UncertainLatency(), fastUopOut = true, fastImplemented = true 8052225d46eSJiawei Lin ) 8062225d46eSJiawei Lin 8072225d46eSJiawei Lin val f2iCfg = FuConfig( 8081a0f06eeSYinan Xu name = "f2i", 8092225d46eSJiawei Lin fuGen = f2iGen, 8102225d46eSJiawei Lin fuSel = f2iSel, 8116ab6918fSYinan Xu FuType.fmisc, 0, 1, writeIntRf = true, writeFpRf = false, writeFflags = true, latency = CertainLatency(2), 812b2482bc1SYinan Xu fastUopOut = true, fastImplemented = true 8132225d46eSJiawei Lin ) 8142225d46eSJiawei Lin 8152225d46eSJiawei Lin val f2fCfg = FuConfig( 8161a0f06eeSYinan Xu name = "f2f", 8172225d46eSJiawei Lin fuGen = f2fGen, 8182225d46eSJiawei Lin fuSel = f2fSel, 8196ab6918fSYinan Xu FuType.fmisc, 0, 1, writeIntRf = false, writeFpRf = true, writeFflags = true, latency = CertainLatency(2), 820b2482bc1SYinan Xu fastUopOut = true, fastImplemented = true 8212225d46eSJiawei Lin ) 8222225d46eSJiawei Lin 8232225d46eSJiawei Lin val fdivSqrtCfg = FuConfig( 8241a0f06eeSYinan Xu name = "fdivSqrt", 8252225d46eSJiawei Lin fuGen = fdivSqrtGen, 8262225d46eSJiawei Lin fuSel = fdivSqrtSel, 8276ab6918fSYinan Xu FuType.fDivSqrt, 0, 2, writeIntRf = false, writeFpRf = true, writeFflags = true, latency = UncertainLatency(), 828140aff85SYinan Xu fastUopOut = true, fastImplemented = true, hasInputBuffer = (true, 8, true) 8292225d46eSJiawei Lin ) 8302225d46eSJiawei Lin 8312225d46eSJiawei Lin val lduCfg = FuConfig( 8321a0f06eeSYinan Xu "ldu", 8332225d46eSJiawei Lin null, // DontCare 8342b4e8253SYinan Xu (uop: MicroOp) => FuType.loadCanAccept(uop.ctrl.fuType), 8356ab6918fSYinan Xu FuType.ldu, 1, 0, writeIntRf = true, writeFpRf = true, 8366ab6918fSYinan Xu latency = UncertainLatency(), 8376ab6918fSYinan Xu exceptionOut = Seq(loadAddrMisaligned, loadAccessFault, loadPageFault), 8386ab6918fSYinan Xu flushPipe = true, 8396786cfb7SWilliam Wang replayInst = true, 8406786cfb7SWilliam Wang hasLoadError = true 8412225d46eSJiawei Lin ) 8422225d46eSJiawei Lin 84385b4cd54SYinan Xu val staCfg = FuConfig( 8441a0f06eeSYinan Xu "sta", 8452225d46eSJiawei Lin null, 8462b4e8253SYinan Xu (uop: MicroOp) => FuType.storeCanAccept(uop.ctrl.fuType), 8476ab6918fSYinan Xu FuType.stu, 1, 0, writeIntRf = false, writeFpRf = false, 8486ab6918fSYinan Xu latency = UncertainLatency(), 8496ab6918fSYinan Xu exceptionOut = Seq(storeAddrMisaligned, storeAccessFault, storePageFault) 8502225d46eSJiawei Lin ) 8512225d46eSJiawei Lin 85285b4cd54SYinan Xu val stdCfg = FuConfig( 8531a0f06eeSYinan Xu "std", 8542b4e8253SYinan Xu fuGen = stdGen, fuSel = (uop: MicroOp) => FuType.storeCanAccept(uop.ctrl.fuType), FuType.stu, 1, 1, 8556ab6918fSYinan Xu writeIntRf = false, writeFpRf = false, latency = CertainLatency(1) 85685b4cd54SYinan Xu ) 85785b4cd54SYinan Xu 8582225d46eSJiawei Lin val mouCfg = FuConfig( 8591a0f06eeSYinan Xu "mou", 8602225d46eSJiawei Lin null, 8612b4e8253SYinan Xu (uop: MicroOp) => FuType.storeCanAccept(uop.ctrl.fuType), 8626ab6918fSYinan Xu FuType.mou, 1, 0, writeIntRf = false, writeFpRf = false, 8636ab6918fSYinan Xu latency = UncertainLatency(), exceptionOut = lduCfg.exceptionOut ++ staCfg.exceptionOut 8642b4e8253SYinan Xu ) 8652b4e8253SYinan Xu 8662b4e8253SYinan Xu val mouDataCfg = FuConfig( 8672b4e8253SYinan Xu "mou", 8682b4e8253SYinan Xu mouDataGen, 8692b4e8253SYinan Xu (uop: MicroOp) => FuType.storeCanAccept(uop.ctrl.fuType), 8706ab6918fSYinan Xu FuType.mou, 1, 0, writeIntRf = false, writeFpRf = false, 8716ab6918fSYinan Xu latency = UncertainLatency() 8722225d46eSJiawei Lin ) 8732225d46eSJiawei Lin 8746827759bSZhangZifei val vipuCfg = FuConfig( 8756827759bSZhangZifei name = "vipu", 8766827759bSZhangZifei fuGen = vipuGen, 8776827759bSZhangZifei fuSel = (uop: MicroOp) => FuType.vipu === uop.ctrl.fuType, 8786827759bSZhangZifei fuType = FuType.vipu, 8796355a2b7Sczw numIntSrc = 0, numFpSrc = 0, writeIntRf = false, writeFpRf = false, writeFflags = false, writeVxsat = true, 880822120dfSczw numVecSrc = 4, writeVecRf = true, 8810f038924SZhangZifei fastUopOut = false, // TODO: check 8826827759bSZhangZifei fastImplemented = true, //TODO: check 8836827759bSZhangZifei ) 8846827759bSZhangZifei 885*adf68ff3Sczw val vimacCfg = FuConfig( 886*adf68ff3Sczw name = "vimac", 887*adf68ff3Sczw fuGen = vimacGen, 888*adf68ff3Sczw fuSel = (uop: MicroOp) => FuType.vimac === uop.ctrl.fuType, 889*adf68ff3Sczw fuType = FuType.vimac, 890*adf68ff3Sczw numIntSrc = 0, numFpSrc = 0, writeIntRf = false, writeFpRf = false, writeFflags = false, writeVxsat = true, 891*adf68ff3Sczw numVecSrc = 4, writeVecRf = true, 892*adf68ff3Sczw fastUopOut = false, // TODO: check 893*adf68ff3Sczw fastImplemented = true, //TODO: check 894*adf68ff3Sczw ) 895*adf68ff3Sczw 896876aa65bSczw val vialuFCfg = FuConfig( 897876aa65bSczw name = "vialuF", 898876aa65bSczw fuGen = vialuFGen, 899876aa65bSczw fuSel = (uop: MicroOp) => FuType.vialuF === uop.ctrl.fuType, 900876aa65bSczw fuType = FuType.vialuF, 901876aa65bSczw numIntSrc = 0, numFpSrc = 0, writeIntRf = false, writeFpRf = false, writeFflags = false, writeVxsat = true, 902876aa65bSczw numVecSrc = 4, writeVecRf = true, 903876aa65bSczw fastUopOut = false, // TODO: check 904876aa65bSczw fastImplemented = true, //TODO: check 905876aa65bSczw ) 906876aa65bSczw 90799e169c5Sczw val vppuCfg = FuConfig( 90899e169c5Sczw name = "vppu", 90999e169c5Sczw fuGen = vppuGen, 91099e169c5Sczw fuSel = (uop: MicroOp) => FuType.vppu === uop.ctrl.fuType, 91199e169c5Sczw fuType = FuType.vppu, 91299e169c5Sczw numIntSrc = 0, numFpSrc = 1, writeIntRf = false, writeFpRf = false, writeFflags = false, 91399e169c5Sczw numVecSrc = 1, writeVecRf = true, 91499e169c5Sczw fastUopOut = false, // TODO: check 91599e169c5Sczw fastImplemented = true, //TODO: check 91699e169c5Sczw ) 91799e169c5Sczw 91894c0d8cfSczw val vfpuCfg = FuConfig( 91994c0d8cfSczw name = "vfpu", 92094c0d8cfSczw fuGen = vfpuGen, 92194c0d8cfSczw fuSel = (uop: MicroOp) => FuType.vfpu === uop.ctrl.fuType, 92294c0d8cfSczw fuType = FuType.vfpu, 92394c0d8cfSczw numIntSrc = 0, numFpSrc = 1, writeIntRf = false, writeFpRf = false, writeFflags = true, 924822120dfSczw numVecSrc = 3, writeVecRf = true, 92594c0d8cfSczw fastUopOut = false, // TODO: check 92694c0d8cfSczw fastImplemented = true, //TODO: check 92794c0d8cfSczw // latency = CertainLatency(2) 92894c0d8cfSczw ) 92994c0d8cfSczw 930adb5df20SYinan Xu val JumpExeUnitCfg = ExuConfig("JmpExeUnit", "Int", Seq(jmpCfg, i2fCfg), 2, Int.MaxValue) 931b6220f0dSLemover val AluExeUnitCfg = ExuConfig("AluExeUnit", "Int", Seq(aluCfg), 0, Int.MaxValue) 932adb5df20SYinan Xu val JumpCSRExeUnitCfg = ExuConfig("JmpCSRExeUnit", "Int", Seq(jmpCfg, csrCfg, fenceCfg, i2fCfg), 2, Int.MaxValue) 9333feeca58Szfw val MulDivExeUnitCfg = ExuConfig("MulDivExeUnit", "Int", Seq(mulCfg, divCfg, bkuCfg), 1, Int.MaxValue) 934*adf68ff3Sczw val FmacExeUnitCfg = ExuConfig("FmacExeUnit", "Fp", Seq(fmacCfg, vipuCfg, vimacCfg, vppuCfg, vfpuCfg, vialuFCfg), Int.MaxValue, 0) 9352225d46eSJiawei Lin val FmiscExeUnitCfg = ExuConfig( 9362225d46eSJiawei Lin "FmiscExeUnit", 937b6220f0dSLemover "Fp", 9382225d46eSJiawei Lin Seq(f2iCfg, f2fCfg, fdivSqrtCfg), 9392225d46eSJiawei Lin Int.MaxValue, 1 9402225d46eSJiawei Lin ) 9412b4e8253SYinan Xu val LdExeUnitCfg = ExuConfig("LoadExu", "Mem", Seq(lduCfg), wbIntPriority = 0, wbFpPriority = 0, extendsExu = false) 9422b4e8253SYinan Xu val StaExeUnitCfg = ExuConfig("StaExu", "Mem", Seq(staCfg, mouCfg), wbIntPriority = Int.MaxValue, wbFpPriority = Int.MaxValue, extendsExu = false) 9432b4e8253SYinan Xu val StdExeUnitCfg = ExuConfig("StdExu", "Mem", Seq(stdCfg, mouDataCfg), wbIntPriority = Int.MaxValue, wbFpPriority = Int.MaxValue, extendsExu = false) 94454034ccdSZhangZifei 945d16f4ea4SZhangZifei // def jumpRSWrapperGen(p: Parameters) = new JumpRSWrapper()(p) 946d16f4ea4SZhangZifei // def mulRSWrapperGen(p: Parameters) = new MulRSWrapper()(p) 947d16f4ea4SZhangZifei // def loadRSWrapperGen(p: Parameters) = new LoadRSWrapper()(p) 948d16f4ea4SZhangZifei // def stdRSWrapperGen(p: Parameters) = new StdRSWrapper()(p) 949d16f4ea4SZhangZifei // def staRSWrapperGen(p: Parameters) = new StaRSWrapper()(p) 950d16f4ea4SZhangZifei // def fmaRSWrapperGen(p: Parameters) = new FMARSWrapper()(p) 951d16f4ea4SZhangZifei // def fmiscRSWrapperGen(p: Parameters) = new FMiscRSWrapper()(p) 95254034ccdSZhangZifei 953d16f4ea4SZhangZifei val aluRSMod = new RSMod( 954d16f4ea4SZhangZifei rsWrapperGen = (modGen: RSMod, p: Parameters) => new ALURSWrapper(modGen)(p), 955d16f4ea4SZhangZifei rsGen = (a: RSParams, b: Parameters) => new ALURS(a)(b), 956d16f4ea4SZhangZifei immExtractorGen = (src: Int, width: Int, p: Parameters) => new AluImmExtractor()(p) 957d16f4ea4SZhangZifei ) 958d16f4ea4SZhangZifei val fmaRSMod = new RSMod( 959d16f4ea4SZhangZifei rsWrapperGen = (modGen: RSMod, p: Parameters) => new FMARSWrapper(modGen)(p), 960d16f4ea4SZhangZifei rsGen = (a: RSParams, b: Parameters) => new FMARS(a)(b), 961d16f4ea4SZhangZifei ) 962d16f4ea4SZhangZifei val fmiscRSMod = new RSMod( 963d16f4ea4SZhangZifei rsWrapperGen = (modGen: RSMod, p: Parameters) => new FMiscRSWrapper(modGen)(p), 964d16f4ea4SZhangZifei rsGen = (a: RSParams, b: Parameters) => new FMiscRS(a)(b), 965d16f4ea4SZhangZifei ) 966d16f4ea4SZhangZifei val jumpRSMod = new RSMod( 967d16f4ea4SZhangZifei rsWrapperGen = (modGen: RSMod, p: Parameters) => new JumpRSWrapper(modGen)(p), 968d16f4ea4SZhangZifei rsGen = (a: RSParams, b: Parameters) => new JumpRS(a)(b), 969d16f4ea4SZhangZifei immExtractorGen = (src: Int, width: Int, p: Parameters) => new JumpImmExtractor()(p) 970d16f4ea4SZhangZifei ) 971d16f4ea4SZhangZifei val loadRSMod = new RSMod( 972d16f4ea4SZhangZifei rsWrapperGen = (modGen: RSMod, p: Parameters) => new LoadRSWrapper(modGen)(p), 973d16f4ea4SZhangZifei rsGen = (a: RSParams, b: Parameters) => new LoadRS(a)(b), 974d16f4ea4SZhangZifei immExtractorGen = (src: Int, width: Int, p: Parameters) => new LoadImmExtractor()(p) 975d16f4ea4SZhangZifei ) 976d16f4ea4SZhangZifei val mulRSMod = new RSMod( 977d16f4ea4SZhangZifei rsWrapperGen = (modGen: RSMod, p: Parameters) => new MulRSWrapper(modGen)(p), 978d16f4ea4SZhangZifei rsGen = (a: RSParams, b: Parameters) => new MulRS(a)(b), 979d16f4ea4SZhangZifei immExtractorGen = (src: Int, width: Int, p: Parameters) => new MduImmExtractor()(p) 980d16f4ea4SZhangZifei ) 981d16f4ea4SZhangZifei val staRSMod = new RSMod( 982d16f4ea4SZhangZifei rsWrapperGen = (modGen: RSMod, p: Parameters) => new StaRSWrapper(modGen)(p), 983d16f4ea4SZhangZifei rsGen = (a: RSParams, b: Parameters) => new StaRS(a)(b), 984d16f4ea4SZhangZifei ) 985d16f4ea4SZhangZifei val stdRSMod = new RSMod( 986d16f4ea4SZhangZifei rsWrapperGen = (modGen: RSMod, p: Parameters) => new StdRSWrapper(modGen)(p), 987d16f4ea4SZhangZifei rsGen = (a: RSParams, b: Parameters) => new StdRS(a)(b), 988d16f4ea4SZhangZifei ) 9899a2e6b8aSLinJiawei} 990