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._ 222225d46eSJiawei Linimport xiangshan.backend.fu._ 232225d46eSJiawei Linimport xiangshan.backend.fu.fpu._ 242225d46eSJiawei Linimport xiangshan.backend.exu._ 256ab6918fSYinan Xuimport xiangshan.backend.Std 262225d46eSJiawei Lin 279a2e6b8aSLinJiaweipackage object xiangshan { 289ee9f926SYikeZhou object SrcType { 299a2e6b8aSLinJiawei def reg = "b00".U 309a2e6b8aSLinJiawei def pc = "b01".U 319a2e6b8aSLinJiawei def imm = "b01".U 329a2e6b8aSLinJiawei def fp = "b10".U 3304b56283SZhangZifei 341a3df1feSYikeZhou def DC = imm // Don't Care 354d24c305SYikeZhou 3604b56283SZhangZifei def isReg(srcType: UInt) = srcType===reg 3704b56283SZhangZifei def isPc(srcType: UInt) = srcType===pc 3804b56283SZhangZifei def isImm(srcType: UInt) = srcType===imm 392b4e8253SYinan Xu def isFp(srcType: UInt) = srcType(1) 40c9ebdf90SYinan Xu def isPcOrImm(srcType: UInt) = srcType(0) 412b4e8253SYinan Xu def isRegOrFp(srcType: UInt) = !srcType(0) 42c9ebdf90SYinan Xu def regIsFp(srcType: UInt) = srcType(1) 4304b56283SZhangZifei 449a2e6b8aSLinJiawei def apply() = UInt(2.W) 459a2e6b8aSLinJiawei } 469a2e6b8aSLinJiawei 479a2e6b8aSLinJiawei object SrcState { 48100aa93cSYinan Xu def busy = "b0".U 49100aa93cSYinan Xu def rdy = "b1".U 50100aa93cSYinan Xu // def specRdy = "b10".U // speculative ready, for future use 51100aa93cSYinan Xu def apply() = UInt(1.W) 529a2e6b8aSLinJiawei } 539a2e6b8aSLinJiawei 542225d46eSJiawei Lin object FuType { 55cafb3558SLinJiawei def jmp = "b0000".U 56cafb3558SLinJiawei def i2f = "b0001".U 57cafb3558SLinJiawei def csr = "b0010".U 58975b9ea3SYinan Xu def alu = "b0110".U 59cafb3558SLinJiawei def mul = "b0100".U 60cafb3558SLinJiawei def div = "b0101".U 61975b9ea3SYinan Xu def fence = "b0011".U 623feeca58Szfw def bku = "b0111".U 63cafb3558SLinJiawei 64cafb3558SLinJiawei def fmac = "b1000".U 6592ab24ebSYinan Xu def fmisc = "b1011".U 66cafb3558SLinJiawei def fDivSqrt = "b1010".U 67cafb3558SLinJiawei 68cafb3558SLinJiawei def ldu = "b1100".U 69cafb3558SLinJiawei def stu = "b1101".U 7092ab24ebSYinan Xu def mou = "b1111".U // for amo, lr, sc, fence 719a2e6b8aSLinJiawei 72ee8ff153Szfw def num = 14 732225d46eSJiawei Lin 749a2e6b8aSLinJiawei def apply() = UInt(log2Up(num).W) 759a2e6b8aSLinJiawei 76cafb3558SLinJiawei def isIntExu(fuType: UInt) = !fuType(3) 776ac289b3SLinJiawei def isJumpExu(fuType: UInt) = fuType === jmp 78cafb3558SLinJiawei def isFpExu(fuType: UInt) = fuType(3, 2) === "b10".U 79cafb3558SLinJiawei def isMemExu(fuType: UInt) = fuType(3, 2) === "b11".U 8092ab24ebSYinan Xu def isLoadStore(fuType: UInt) = isMemExu(fuType) && !fuType(1) 8192ab24ebSYinan Xu def isStoreExu(fuType: UInt) = isMemExu(fuType) && fuType(0) 820f9d3717SYinan Xu def isAMO(fuType: UInt) = fuType(1) 83af2f7849Shappy-lx def isFence(fuType: UInt) = fuType === fence 84af2f7849Shappy-lx def isSvinvalBegin(fuType: UInt, func: UInt, flush: Bool) = isFence(fuType) && func === FenceOpType.nofence && !flush 85af2f7849Shappy-lx def isSvinval(fuType: UInt, func: UInt, flush: Bool) = isFence(fuType) && func === FenceOpType.sfence && !flush 86af2f7849Shappy-lx def isSvinvalEnd(fuType: UInt, func: UInt, flush: Bool) = isFence(fuType) && func === FenceOpType.nofence && flush 87af2f7849Shappy-lx 8892ab24ebSYinan Xu 8992ab24ebSYinan Xu def jmpCanAccept(fuType: UInt) = !fuType(2) 90ee8ff153Szfw def mduCanAccept(fuType: UInt) = fuType(2) && !fuType(1) || fuType(2) && fuType(1) && fuType(0) 91ee8ff153Szfw def aluCanAccept(fuType: UInt) = fuType(2) && fuType(1) && !fuType(0) 9292ab24ebSYinan Xu 9392ab24ebSYinan Xu def fmacCanAccept(fuType: UInt) = !fuType(1) 9492ab24ebSYinan Xu def fmiscCanAccept(fuType: UInt) = fuType(1) 9592ab24ebSYinan Xu 9692ab24ebSYinan Xu def loadCanAccept(fuType: UInt) = !fuType(0) 9792ab24ebSYinan Xu def storeCanAccept(fuType: UInt) = fuType(0) 9892ab24ebSYinan Xu 9992ab24ebSYinan Xu def storeIsAMO(fuType: UInt) = fuType(1) 100cafb3558SLinJiawei 101cafb3558SLinJiawei val functionNameMap = Map( 102cafb3558SLinJiawei jmp.litValue() -> "jmp", 103ebb8ebf8SYinan Xu i2f.litValue() -> "int_to_float", 104cafb3558SLinJiawei csr.litValue() -> "csr", 105cafb3558SLinJiawei alu.litValue() -> "alu", 106cafb3558SLinJiawei mul.litValue() -> "mul", 107cafb3558SLinJiawei div.litValue() -> "div", 108b8f08ca0SZhangZifei fence.litValue() -> "fence", 1093feeca58Szfw bku.litValue() -> "bku", 110cafb3558SLinJiawei fmac.litValue() -> "fmac", 111cafb3558SLinJiawei fmisc.litValue() -> "fmisc", 112cafb3558SLinJiawei fDivSqrt.litValue() -> "fdiv/fsqrt", 113cafb3558SLinJiawei ldu.litValue() -> "load", 114ebb8ebf8SYinan Xu stu.litValue() -> "store", 115ebb8ebf8SYinan Xu mou.litValue() -> "mou" 116cafb3558SLinJiawei ) 1179a2e6b8aSLinJiawei } 1189a2e6b8aSLinJiawei 1192225d46eSJiawei Lin object FuOpType { 120675acc68SYinan Xu def apply() = UInt(7.W) 121ebd97ecbSzhanglinjuan } 122518d8658SYinan Xu 123a3edac52SYinan Xu object CommitType { 124c3abb8b6SYinan Xu def NORMAL = "b000".U // int/fp 125c3abb8b6SYinan Xu def BRANCH = "b001".U // branch 126c3abb8b6SYinan Xu def LOAD = "b010".U // load 127c3abb8b6SYinan Xu def STORE = "b011".U // store 128518d8658SYinan Xu 129c3abb8b6SYinan Xu def apply() = UInt(3.W) 130c3abb8b6SYinan Xu def isFused(commitType: UInt): Bool = commitType(2) 131c3abb8b6SYinan Xu def isLoadStore(commitType: UInt): Bool = !isFused(commitType) && commitType(1) 132c3abb8b6SYinan Xu def lsInstIsStore(commitType: UInt): Bool = commitType(0) 133c3abb8b6SYinan Xu def isStore(commitType: UInt): Bool = isLoadStore(commitType) && lsInstIsStore(commitType) 134c3abb8b6SYinan Xu def isBranch(commitType: UInt): Bool = commitType(0) && !commitType(1) && !isFused(commitType) 135518d8658SYinan Xu } 136bfb958a3SYinan Xu 137bfb958a3SYinan Xu object RedirectLevel { 1382d7c7105SYinan Xu def flushAfter = "b0".U 1392d7c7105SYinan Xu def flush = "b1".U 140bfb958a3SYinan Xu 1412d7c7105SYinan Xu def apply() = UInt(1.W) 1422d7c7105SYinan Xu // def isUnconditional(level: UInt) = level(1) 143bfb958a3SYinan Xu def flushItself(level: UInt) = level(0) 1442d7c7105SYinan Xu // def isException(level: UInt) = level(1) && level(0) 145bfb958a3SYinan Xu } 146baf8def6SYinan Xu 147baf8def6SYinan Xu object ExceptionVec { 148baf8def6SYinan Xu def apply() = Vec(16, Bool()) 149baf8def6SYinan Xu } 150a8e04b1dSYinan Xu 151c60c1ab4SWilliam Wang object PMAMode { 1528d9a04fcSWilliam Wang def R = "b1".U << 0 //readable 1538d9a04fcSWilliam Wang def W = "b1".U << 1 //writeable 1548d9a04fcSWilliam Wang def X = "b1".U << 2 //executable 1558d9a04fcSWilliam Wang def I = "b1".U << 3 //cacheable: icache 1568d9a04fcSWilliam Wang def D = "b1".U << 4 //cacheable: dcache 1578d9a04fcSWilliam Wang def S = "b1".U << 5 //enable speculative access 158cff68e26SWilliam Wang def A = "b1".U << 6 //enable atomic operation, A imply R & W 1598d9a04fcSWilliam Wang def C = "b1".U << 7 //if it is cacheable is configable 160c60c1ab4SWilliam Wang def Reserved = "b0".U 161c60c1ab4SWilliam Wang 162c60c1ab4SWilliam Wang def apply() = UInt(7.W) 163c60c1ab4SWilliam Wang 164c60c1ab4SWilliam Wang def read(mode: UInt) = mode(0) 165c60c1ab4SWilliam Wang def write(mode: UInt) = mode(1) 166c60c1ab4SWilliam Wang def execute(mode: UInt) = mode(2) 167c60c1ab4SWilliam Wang def icache(mode: UInt) = mode(3) 168c60c1ab4SWilliam Wang def dcache(mode: UInt) = mode(4) 169c60c1ab4SWilliam Wang def speculate(mode: UInt) = mode(5) 170c60c1ab4SWilliam Wang def atomic(mode: UInt) = mode(6) 171c60c1ab4SWilliam Wang def configable_cache(mode: UInt) = mode(7) 172c60c1ab4SWilliam Wang 173c60c1ab4SWilliam Wang def strToMode(s: String) = { 174423b9255SWilliam Wang var result = 0.U(8.W) 175c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("R") >= 0) result = result + R 176c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("W") >= 0) result = result + W 177c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("X") >= 0) result = result + X 178c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("I") >= 0) result = result + I 179c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("D") >= 0) result = result + D 180c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("S") >= 0) result = result + S 181c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("A") >= 0) result = result + A 182c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("C") >= 0) result = result + C 183c60c1ab4SWilliam Wang result 184c60c1ab4SWilliam Wang } 185c60c1ab4SWilliam Wang } 1862225d46eSJiawei Lin 1872225d46eSJiawei Lin 1882225d46eSJiawei Lin object CSROpType { 1892225d46eSJiawei Lin def jmp = "b000".U 1902225d46eSJiawei Lin def wrt = "b001".U 1912225d46eSJiawei Lin def set = "b010".U 1922225d46eSJiawei Lin def clr = "b011".U 193b6900d94SYinan Xu def wfi = "b100".U 1942225d46eSJiawei Lin def wrti = "b101".U 1952225d46eSJiawei Lin def seti = "b110".U 1962225d46eSJiawei Lin def clri = "b111".U 197*5d669833SYinan Xu def needAccess(op: UInt): Bool = op(1, 0) =/= 0.U 1982225d46eSJiawei Lin } 1992225d46eSJiawei Lin 2002225d46eSJiawei Lin // jump 2012225d46eSJiawei Lin object JumpOpType { 2022225d46eSJiawei Lin def jal = "b00".U 2032225d46eSJiawei Lin def jalr = "b01".U 2042225d46eSJiawei Lin def auipc = "b10".U 2052225d46eSJiawei Lin// def call = "b11_011".U 2062225d46eSJiawei Lin// def ret = "b11_100".U 2072225d46eSJiawei Lin def jumpOpisJalr(op: UInt) = op(0) 2082225d46eSJiawei Lin def jumpOpisAuipc(op: UInt) = op(1) 2092225d46eSJiawei Lin } 2102225d46eSJiawei Lin 2112225d46eSJiawei Lin object FenceOpType { 2122225d46eSJiawei Lin def fence = "b10000".U 2132225d46eSJiawei Lin def sfence = "b10001".U 2142225d46eSJiawei Lin def fencei = "b10010".U 215af2f7849Shappy-lx def nofence= "b00000".U 2162225d46eSJiawei Lin } 2172225d46eSJiawei Lin 2182225d46eSJiawei Lin object ALUOpType { 219ee8ff153Szfw // shift optype 220675acc68SYinan Xu def slliuw = "b000_0000".U // slliuw: ZEXT(src1[31:0]) << shamt 221675acc68SYinan Xu def sll = "b000_0001".U // sll: src1 << src2 222ee8ff153Szfw 223675acc68SYinan Xu def bclr = "b000_0010".U // bclr: src1 & ~(1 << src2[5:0]) 224675acc68SYinan Xu def bset = "b000_0011".U // bset: src1 | (1 << src2[5:0]) 225675acc68SYinan Xu def binv = "b000_0100".U // binv: src1 ^ ~(1 << src2[5:0]) 226ee8ff153Szfw 227675acc68SYinan Xu def srl = "b000_0101".U // srl: src1 >> src2 228675acc68SYinan Xu def bext = "b000_0110".U // bext: (src1 >> src2)[0] 229675acc68SYinan Xu def sra = "b000_0111".U // sra: src1 >> src2 (arithmetic) 230ee8ff153Szfw 2317b441e5eSYinan Xu def rol = "b000_1001".U // rol: (src1 << src2) | (src1 >> (xlen - src2)) 2327b441e5eSYinan Xu def ror = "b000_1011".U // ror: (src1 >> src2) | (src1 << (xlen - src2)) 233184a1958Szfw 234ee8ff153Szfw // RV64 32bit optype 235675acc68SYinan Xu def addw = "b001_0000".U // addw: SEXT((src1 + src2)[31:0]) 236675acc68SYinan Xu def oddaddw = "b001_0001".U // oddaddw: SEXT((src1[0] + src2)[31:0]) 237675acc68SYinan Xu def subw = "b001_0010".U // subw: SEXT((src1 - src2)[31:0]) 238ee8ff153Szfw 239675acc68SYinan Xu def addwbit = "b001_0100".U // addwbit: (src1 + src2)[0] 240675acc68SYinan Xu def addwbyte = "b001_0101".U // addwbyte: (src1 + src2)[7:0] 241675acc68SYinan Xu def addwzexth = "b001_0110".U // addwzexth: ZEXT((src1 + src2)[15:0]) 242675acc68SYinan Xu def addwsexth = "b001_0111".U // addwsexth: SEXT((src1 + src2)[15:0]) 243ee8ff153Szfw 244675acc68SYinan Xu def sllw = "b001_1000".U // sllw: SEXT((src1 << src2)[31:0]) 245675acc68SYinan Xu def srlw = "b001_1001".U // srlw: SEXT((src1[31:0] >> src2)[31:0]) 246675acc68SYinan Xu def sraw = "b001_1010".U // sraw: SEXT((src1[31:0] >> src2)[31:0]) 247675acc68SYinan Xu def rolw = "b001_1100".U 248675acc68SYinan Xu def rorw = "b001_1101".U 249675acc68SYinan Xu 250675acc68SYinan Xu // ADD-op 251675acc68SYinan Xu def adduw = "b010_0000".U // adduw: src1[31:0] + src2 252675acc68SYinan Xu def add = "b010_0001".U // add: src1 + src2 253675acc68SYinan Xu def oddadd = "b010_0010".U // oddadd: src1[0] + src2 254675acc68SYinan Xu 255675acc68SYinan Xu def sr29add = "b010_0100".U // sr29add: src1[63:29] + src2 256675acc68SYinan Xu def sr30add = "b010_0101".U // sr30add: src1[63:30] + src2 257675acc68SYinan Xu def sr31add = "b010_0110".U // sr31add: src1[63:31] + src2 258675acc68SYinan Xu def sr32add = "b010_0111".U // sr32add: src1[63:32] + src2 259675acc68SYinan Xu 260675acc68SYinan Xu def sh1adduw = "b010_1000".U // sh1adduw: {src1[31:0], 1'b0} + src2 261675acc68SYinan Xu def sh1add = "b010_1001".U // sh1add: {src1[62:0], 1'b0} + src2 262675acc68SYinan Xu def sh2adduw = "b010_1010".U // sh2add_uw: {src1[31:0], 2'b0} + src2 263675acc68SYinan Xu def sh2add = "b010_1011".U // sh2add: {src1[61:0], 2'b0} + src2 264675acc68SYinan Xu def sh3adduw = "b010_1100".U // sh3add_uw: {src1[31:0], 3'b0} + src2 265675acc68SYinan Xu def sh3add = "b010_1101".U // sh3add: {src1[60:0], 3'b0} + src2 266675acc68SYinan Xu def sh4add = "b010_1111".U // sh4add: {src1[59:0], 4'b0} + src2 267675acc68SYinan Xu 268675acc68SYinan Xu // SUB-op: src1 - src2 269675acc68SYinan Xu def sub = "b011_0000".U 270675acc68SYinan Xu def sltu = "b011_0001".U 271675acc68SYinan Xu def slt = "b011_0010".U 272675acc68SYinan Xu def maxu = "b011_0100".U 273675acc68SYinan Xu def minu = "b011_0101".U 274675acc68SYinan Xu def max = "b011_0110".U 275675acc68SYinan Xu def min = "b011_0111".U 276675acc68SYinan Xu 277675acc68SYinan Xu // branch 278675acc68SYinan Xu def beq = "b111_0000".U 279675acc68SYinan Xu def bne = "b111_0010".U 280675acc68SYinan Xu def blt = "b111_1000".U 281675acc68SYinan Xu def bge = "b111_1010".U 282675acc68SYinan Xu def bltu = "b111_1100".U 283675acc68SYinan Xu def bgeu = "b111_1110".U 284675acc68SYinan Xu 285675acc68SYinan Xu // misc optype 286675acc68SYinan Xu def and = "b100_0000".U 287675acc68SYinan Xu def andn = "b100_0001".U 288675acc68SYinan Xu def or = "b100_0010".U 289675acc68SYinan Xu def orn = "b100_0011".U 290675acc68SYinan Xu def xor = "b100_0100".U 291675acc68SYinan Xu def xnor = "b100_0101".U 292675acc68SYinan Xu def orcb = "b100_0110".U 293675acc68SYinan Xu 294675acc68SYinan Xu def sextb = "b100_1000".U 295675acc68SYinan Xu def packh = "b100_1001".U 296675acc68SYinan Xu def sexth = "b100_1010".U 297675acc68SYinan Xu def packw = "b100_1011".U 298675acc68SYinan Xu 299675acc68SYinan Xu def revb = "b101_0000".U 300675acc68SYinan Xu def rev8 = "b101_0001".U 301675acc68SYinan Xu def pack = "b101_0010".U 302675acc68SYinan Xu def orh48 = "b101_0011".U 303675acc68SYinan Xu 304675acc68SYinan Xu def szewl1 = "b101_1000".U 305675acc68SYinan Xu def szewl2 = "b101_1001".U 306675acc68SYinan Xu def szewl3 = "b101_1010".U 307675acc68SYinan Xu def byte2 = "b101_1011".U 308675acc68SYinan Xu 309675acc68SYinan Xu def andlsb = "b110_0000".U 310675acc68SYinan Xu def andzexth = "b110_0001".U 311675acc68SYinan Xu def orlsb = "b110_0010".U 312675acc68SYinan Xu def orzexth = "b110_0011".U 313675acc68SYinan Xu def xorlsb = "b110_0100".U 314675acc68SYinan Xu def xorzexth = "b110_0101".U 315675acc68SYinan Xu def orcblsb = "b110_0110".U 316675acc68SYinan Xu def orcbzexth = "b110_0111".U 317675acc68SYinan Xu 318675acc68SYinan Xu def isAddw(func: UInt) = func(6, 4) === "b001".U && !func(3) && !func(1) 319675acc68SYinan Xu def isSimpleLogic(func: UInt) = func(6, 4) === "b100".U && !func(0) 320675acc68SYinan Xu def logicToLsb(func: UInt) = Cat("b110".U(3.W), func(3, 1), 0.U(1.W)) 321675acc68SYinan Xu def logicToZexth(func: UInt) = Cat("b110".U(3.W), func(3, 1), 1.U(1.W)) 322675acc68SYinan Xu def isBranch(func: UInt) = func(6, 4) === "b111".U 323675acc68SYinan Xu def getBranchType(func: UInt) = func(3, 2) 324675acc68SYinan Xu def isBranchInvert(func: UInt) = func(1) 325675acc68SYinan Xu 326675acc68SYinan Xu def apply() = UInt(7.W) 3272225d46eSJiawei Lin } 3282225d46eSJiawei Lin 3292225d46eSJiawei Lin object MDUOpType { 3302225d46eSJiawei Lin // mul 3312225d46eSJiawei Lin // bit encoding: | type (2bit) | isWord(1bit) | opcode(2bit) | 3322225d46eSJiawei Lin def mul = "b00000".U 3332225d46eSJiawei Lin def mulh = "b00001".U 3342225d46eSJiawei Lin def mulhsu = "b00010".U 3352225d46eSJiawei Lin def mulhu = "b00011".U 3362225d46eSJiawei Lin def mulw = "b00100".U 3372225d46eSJiawei Lin 33888825c5cSYinan Xu def mulw7 = "b01100".U 33988825c5cSYinan Xu 3402225d46eSJiawei Lin // div 3412225d46eSJiawei Lin // bit encoding: | type (2bit) | isWord(1bit) | isSign(1bit) | opcode(1bit) | 34288825c5cSYinan Xu def div = "b10000".U 34388825c5cSYinan Xu def divu = "b10010".U 34488825c5cSYinan Xu def rem = "b10001".U 34588825c5cSYinan Xu def remu = "b10011".U 3462225d46eSJiawei Lin 34788825c5cSYinan Xu def divw = "b10100".U 34888825c5cSYinan Xu def divuw = "b10110".U 34988825c5cSYinan Xu def remw = "b10101".U 35088825c5cSYinan Xu def remuw = "b10111".U 3512225d46eSJiawei Lin 35288825c5cSYinan Xu def isMul(op: UInt) = !op(4) 35388825c5cSYinan Xu def isDiv(op: UInt) = op(4) 3542225d46eSJiawei Lin 3552225d46eSJiawei Lin def isDivSign(op: UInt) = isDiv(op) && !op(1) 3562225d46eSJiawei Lin def isW(op: UInt) = op(2) 3572225d46eSJiawei Lin def isH(op: UInt) = (isDiv(op) && op(0)) || (isMul(op) && op(1, 0) =/= 0.U) 3582225d46eSJiawei Lin def getMulOp(op: UInt) = op(1, 0) 3592225d46eSJiawei Lin } 3602225d46eSJiawei Lin 3612225d46eSJiawei Lin object LSUOpType { 362d200f594SWilliam Wang // load pipeline 3632225d46eSJiawei Lin 364d200f594SWilliam Wang // normal load 365d200f594SWilliam Wang // Note: bit(1, 0) are size, DO NOT CHANGE 366d200f594SWilliam Wang // bit encoding: | load 0 | is unsigned(1bit) | size(2bit) | 367d200f594SWilliam Wang def lb = "b0000".U 368d200f594SWilliam Wang def lh = "b0001".U 369d200f594SWilliam Wang def lw = "b0010".U 370d200f594SWilliam Wang def ld = "b0011".U 371d200f594SWilliam Wang def lbu = "b0100".U 372d200f594SWilliam Wang def lhu = "b0101".U 373d200f594SWilliam Wang def lwu = "b0110".U 374ca18a0b4SWilliam Wang 375d200f594SWilliam Wang // Zicbop software prefetch 376d200f594SWilliam Wang // bit encoding: | prefetch 1 | 0 | prefetch type (2bit) | 377d200f594SWilliam Wang def prefetch_i = "b1000".U // TODO 378d200f594SWilliam Wang def prefetch_r = "b1001".U 379d200f594SWilliam Wang def prefetch_w = "b1010".U 380ca18a0b4SWilliam Wang 381d200f594SWilliam Wang def isPrefetch(op: UInt): Bool = op(3) 382d200f594SWilliam Wang 383d200f594SWilliam Wang // store pipeline 384d200f594SWilliam Wang // normal store 385d200f594SWilliam Wang // bit encoding: | store 00 | size(2bit) | 386d200f594SWilliam Wang def sb = "b0000".U 387d200f594SWilliam Wang def sh = "b0001".U 388d200f594SWilliam Wang def sw = "b0010".U 389d200f594SWilliam Wang def sd = "b0011".U 390d200f594SWilliam Wang 391d200f594SWilliam Wang // l1 cache op 392d200f594SWilliam Wang // bit encoding: | cbo_zero 01 | size(2bit) 11 | 393d200f594SWilliam Wang def cbo_zero = "b0111".U 394d200f594SWilliam Wang 395d200f594SWilliam Wang // llc op 396d200f594SWilliam Wang // bit encoding: | prefetch 11 | suboptype(2bit) | 397d200f594SWilliam Wang def cbo_clean = "b1100".U 398d200f594SWilliam Wang def cbo_flush = "b1101".U 399d200f594SWilliam Wang def cbo_inval = "b1110".U 400d200f594SWilliam Wang 401d200f594SWilliam Wang def isCbo(op: UInt): Bool = op(3, 2) === "b11".U 4022225d46eSJiawei Lin 4032225d46eSJiawei Lin // atomics 4042225d46eSJiawei Lin // bit(1, 0) are size 4052225d46eSJiawei Lin // since atomics use a different fu type 4062225d46eSJiawei Lin // so we can safely reuse other load/store's encodings 407d200f594SWilliam Wang // bit encoding: | optype(4bit) | size (2bit) | 4082225d46eSJiawei Lin def lr_w = "b000010".U 4092225d46eSJiawei Lin def sc_w = "b000110".U 4102225d46eSJiawei Lin def amoswap_w = "b001010".U 4112225d46eSJiawei Lin def amoadd_w = "b001110".U 4122225d46eSJiawei Lin def amoxor_w = "b010010".U 4132225d46eSJiawei Lin def amoand_w = "b010110".U 4142225d46eSJiawei Lin def amoor_w = "b011010".U 4152225d46eSJiawei Lin def amomin_w = "b011110".U 4162225d46eSJiawei Lin def amomax_w = "b100010".U 4172225d46eSJiawei Lin def amominu_w = "b100110".U 4182225d46eSJiawei Lin def amomaxu_w = "b101010".U 4192225d46eSJiawei Lin 4202225d46eSJiawei Lin def lr_d = "b000011".U 4212225d46eSJiawei Lin def sc_d = "b000111".U 4222225d46eSJiawei Lin def amoswap_d = "b001011".U 4232225d46eSJiawei Lin def amoadd_d = "b001111".U 4242225d46eSJiawei Lin def amoxor_d = "b010011".U 4252225d46eSJiawei Lin def amoand_d = "b010111".U 4262225d46eSJiawei Lin def amoor_d = "b011011".U 4272225d46eSJiawei Lin def amomin_d = "b011111".U 4282225d46eSJiawei Lin def amomax_d = "b100011".U 4292225d46eSJiawei Lin def amominu_d = "b100111".U 4302225d46eSJiawei Lin def amomaxu_d = "b101011".U 431b6982e83SLemover 432b6982e83SLemover def size(op: UInt) = op(1,0) 4332225d46eSJiawei Lin } 4342225d46eSJiawei Lin 4353feeca58Szfw object BKUOpType { 436ee8ff153Szfw 4373feeca58Szfw def clmul = "b000000".U 4383feeca58Szfw def clmulh = "b000001".U 4393feeca58Szfw def clmulr = "b000010".U 4403feeca58Szfw def xpermn = "b000100".U 4413feeca58Szfw def xpermb = "b000101".U 442ee8ff153Szfw 4433feeca58Szfw def clz = "b001000".U 4443feeca58Szfw def clzw = "b001001".U 4453feeca58Szfw def ctz = "b001010".U 4463feeca58Szfw def ctzw = "b001011".U 4473feeca58Szfw def cpop = "b001100".U 4483feeca58Szfw def cpopw = "b001101".U 44907596dc6Szfw 4503feeca58Szfw // 01xxxx is reserve 4513feeca58Szfw def aes64es = "b100000".U 4523feeca58Szfw def aes64esm = "b100001".U 4533feeca58Szfw def aes64ds = "b100010".U 4543feeca58Szfw def aes64dsm = "b100011".U 4553feeca58Szfw def aes64im = "b100100".U 4563feeca58Szfw def aes64ks1i = "b100101".U 4573feeca58Szfw def aes64ks2 = "b100110".U 4583feeca58Szfw 4593feeca58Szfw // merge to two instruction sm4ks & sm4ed 46019bcce38SFawang Zhang def sm4ed0 = "b101000".U 46119bcce38SFawang Zhang def sm4ed1 = "b101001".U 46219bcce38SFawang Zhang def sm4ed2 = "b101010".U 46319bcce38SFawang Zhang def sm4ed3 = "b101011".U 46419bcce38SFawang Zhang def sm4ks0 = "b101100".U 46519bcce38SFawang Zhang def sm4ks1 = "b101101".U 46619bcce38SFawang Zhang def sm4ks2 = "b101110".U 46719bcce38SFawang Zhang def sm4ks3 = "b101111".U 4683feeca58Szfw 4693feeca58Szfw def sha256sum0 = "b110000".U 4703feeca58Szfw def sha256sum1 = "b110001".U 4713feeca58Szfw def sha256sig0 = "b110010".U 4723feeca58Szfw def sha256sig1 = "b110011".U 4733feeca58Szfw def sha512sum0 = "b110100".U 4743feeca58Szfw def sha512sum1 = "b110101".U 4753feeca58Szfw def sha512sig0 = "b110110".U 4763feeca58Szfw def sha512sig1 = "b110111".U 4773feeca58Szfw 4783feeca58Szfw def sm3p0 = "b111000".U 4793feeca58Szfw def sm3p1 = "b111001".U 480ee8ff153Szfw } 481ee8ff153Szfw 4822225d46eSJiawei Lin object BTBtype { 4832225d46eSJiawei Lin def B = "b00".U // branch 4842225d46eSJiawei Lin def J = "b01".U // jump 4852225d46eSJiawei Lin def I = "b10".U // indirect 4862225d46eSJiawei Lin def R = "b11".U // return 4872225d46eSJiawei Lin 4882225d46eSJiawei Lin def apply() = UInt(2.W) 4892225d46eSJiawei Lin } 4902225d46eSJiawei Lin 4912225d46eSJiawei Lin object SelImm { 492ee8ff153Szfw def IMM_X = "b0111".U 493ee8ff153Szfw def IMM_S = "b0000".U 494ee8ff153Szfw def IMM_SB = "b0001".U 495ee8ff153Szfw def IMM_U = "b0010".U 496ee8ff153Szfw def IMM_UJ = "b0011".U 497ee8ff153Szfw def IMM_I = "b0100".U 498ee8ff153Szfw def IMM_Z = "b0101".U 499ee8ff153Szfw def INVALID_INSTR = "b0110".U 500ee8ff153Szfw def IMM_B6 = "b1000".U 5012225d46eSJiawei Lin 502ee8ff153Szfw def apply() = UInt(4.W) 5032225d46eSJiawei Lin } 5042225d46eSJiawei Lin 5056ab6918fSYinan Xu object ExceptionNO { 5066ab6918fSYinan Xu def instrAddrMisaligned = 0 5076ab6918fSYinan Xu def instrAccessFault = 1 5086ab6918fSYinan Xu def illegalInstr = 2 5096ab6918fSYinan Xu def breakPoint = 3 5106ab6918fSYinan Xu def loadAddrMisaligned = 4 5116ab6918fSYinan Xu def loadAccessFault = 5 5126ab6918fSYinan Xu def storeAddrMisaligned = 6 5136ab6918fSYinan Xu def storeAccessFault = 7 5146ab6918fSYinan Xu def ecallU = 8 5156ab6918fSYinan Xu def ecallS = 9 5166ab6918fSYinan Xu def ecallM = 11 5176ab6918fSYinan Xu def instrPageFault = 12 5186ab6918fSYinan Xu def loadPageFault = 13 5196ab6918fSYinan Xu // def singleStep = 14 5206ab6918fSYinan Xu def storePageFault = 15 5216ab6918fSYinan Xu def priorities = Seq( 5226ab6918fSYinan Xu breakPoint, // TODO: different BP has different priority 5236ab6918fSYinan Xu instrPageFault, 5246ab6918fSYinan Xu instrAccessFault, 5256ab6918fSYinan Xu illegalInstr, 5266ab6918fSYinan Xu instrAddrMisaligned, 5276ab6918fSYinan Xu ecallM, ecallS, ecallU, 5286ab6918fSYinan Xu storePageFault, 5296ab6918fSYinan Xu loadPageFault, 5306ab6918fSYinan Xu storeAccessFault, 5316ab6918fSYinan Xu loadAccessFault, 5326ab6918fSYinan Xu storeAddrMisaligned, 5336ab6918fSYinan Xu loadAddrMisaligned 5346ab6918fSYinan Xu ) 5356ab6918fSYinan Xu def all = priorities.distinct.sorted 5366ab6918fSYinan Xu def frontendSet = Seq( 5376ab6918fSYinan Xu instrAddrMisaligned, 5386ab6918fSYinan Xu instrAccessFault, 5396ab6918fSYinan Xu illegalInstr, 5406ab6918fSYinan Xu instrPageFault 5416ab6918fSYinan Xu ) 5426ab6918fSYinan Xu def partialSelect(vec: Vec[Bool], select: Seq[Int]): Vec[Bool] = { 5436ab6918fSYinan Xu val new_vec = Wire(ExceptionVec()) 5446ab6918fSYinan Xu new_vec.foreach(_ := false.B) 5456ab6918fSYinan Xu select.foreach(i => new_vec(i) := vec(i)) 5466ab6918fSYinan Xu new_vec 5476ab6918fSYinan Xu } 5486ab6918fSYinan Xu def selectFrontend(vec: Vec[Bool]): Vec[Bool] = partialSelect(vec, frontendSet) 5496ab6918fSYinan Xu def selectAll(vec: Vec[Bool]): Vec[Bool] = partialSelect(vec, ExceptionNO.all) 5506ab6918fSYinan Xu def selectByFu(vec:Vec[Bool], fuConfig: FuConfig): Vec[Bool] = 5516ab6918fSYinan Xu partialSelect(vec, fuConfig.exceptionOut) 5526ab6918fSYinan Xu def selectByExu(vec:Vec[Bool], exuConfig: ExuConfig): Vec[Bool] = 5536ab6918fSYinan Xu partialSelect(vec, exuConfig.exceptionOut) 5546ab6918fSYinan Xu def selectByExu(vec:Vec[Bool], exuConfigs: Seq[ExuConfig]): Vec[Bool] = 5556ab6918fSYinan Xu partialSelect(vec, exuConfigs.map(_.exceptionOut).reduce(_ ++ _).distinct.sorted) 5566ab6918fSYinan Xu } 5576ab6918fSYinan Xu 558a58e3351SLi Qianruo def dividerGen(p: Parameters) = new SRT16Divider(p(XLen))(p) 559c3d7991bSJiawei Lin def multiplierGen(p: Parameters) = new ArrayMultiplier(p(XLen) + 1)(p) 5602225d46eSJiawei Lin def aluGen(p: Parameters) = new Alu()(p) 5613feeca58Szfw def bkuGen(p: Parameters) = new Bku()(p) 5622225d46eSJiawei Lin def jmpGen(p: Parameters) = new Jump()(p) 5632225d46eSJiawei Lin def fenceGen(p: Parameters) = new Fence()(p) 5642225d46eSJiawei Lin def csrGen(p: Parameters) = new CSR()(p) 5652225d46eSJiawei Lin def i2fGen(p: Parameters) = new IntToFP()(p) 5662225d46eSJiawei Lin def fmacGen(p: Parameters) = new FMA()(p) 5672225d46eSJiawei Lin def f2iGen(p: Parameters) = new FPToInt()(p) 5682225d46eSJiawei Lin def f2fGen(p: Parameters) = new FPToFP()(p) 5692225d46eSJiawei Lin def fdivSqrtGen(p: Parameters) = new FDivSqrt()(p) 57085b4cd54SYinan Xu def stdGen(p: Parameters) = new Std()(p) 5716ab6918fSYinan Xu def mouDataGen(p: Parameters) = new Std()(p) 5722225d46eSJiawei Lin 5736cdd85d9SYinan Xu def f2iSel(uop: MicroOp): Bool = { 5746cdd85d9SYinan Xu uop.ctrl.rfWen 5752225d46eSJiawei Lin } 5762225d46eSJiawei Lin 5776cdd85d9SYinan Xu def i2fSel(uop: MicroOp): Bool = { 5786cdd85d9SYinan Xu uop.ctrl.fpu.fromInt 5792225d46eSJiawei Lin } 5802225d46eSJiawei Lin 5816cdd85d9SYinan Xu def f2fSel(uop: MicroOp): Bool = { 5826cdd85d9SYinan Xu val ctrl = uop.ctrl.fpu 5832225d46eSJiawei Lin ctrl.fpWen && !ctrl.div && !ctrl.sqrt 5842225d46eSJiawei Lin } 5852225d46eSJiawei Lin 5866cdd85d9SYinan Xu def fdivSqrtSel(uop: MicroOp): Bool = { 5876cdd85d9SYinan Xu val ctrl = uop.ctrl.fpu 5882225d46eSJiawei Lin ctrl.div || ctrl.sqrt 5892225d46eSJiawei Lin } 5902225d46eSJiawei Lin 5912225d46eSJiawei Lin val aluCfg = FuConfig( 5921a0f06eeSYinan Xu name = "alu", 5932225d46eSJiawei Lin fuGen = aluGen, 5946cdd85d9SYinan Xu fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.alu, 5952225d46eSJiawei Lin fuType = FuType.alu, 5962225d46eSJiawei Lin numIntSrc = 2, 5972225d46eSJiawei Lin numFpSrc = 0, 5982225d46eSJiawei Lin writeIntRf = true, 5992225d46eSJiawei Lin writeFpRf = false, 6002225d46eSJiawei Lin hasRedirect = true, 6012225d46eSJiawei Lin ) 6022225d46eSJiawei Lin 6032225d46eSJiawei Lin val jmpCfg = FuConfig( 6041a0f06eeSYinan Xu name = "jmp", 6052225d46eSJiawei Lin fuGen = jmpGen, 6066cdd85d9SYinan Xu fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.jmp, 6072225d46eSJiawei Lin fuType = FuType.jmp, 6082225d46eSJiawei Lin numIntSrc = 1, 6092225d46eSJiawei Lin numFpSrc = 0, 6102225d46eSJiawei Lin writeIntRf = true, 6112225d46eSJiawei Lin writeFpRf = false, 6122225d46eSJiawei Lin hasRedirect = true, 6132225d46eSJiawei Lin ) 6142225d46eSJiawei Lin 6152225d46eSJiawei Lin val fenceCfg = FuConfig( 6161a0f06eeSYinan Xu name = "fence", 6172225d46eSJiawei Lin fuGen = fenceGen, 6186cdd85d9SYinan Xu fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.fence, 6196ab6918fSYinan Xu FuType.fence, 2, 0, writeIntRf = false, writeFpRf = false, 6206ab6918fSYinan Xu latency = UncertainLatency(), exceptionOut = Seq(illegalInstr) // TODO: need rewrite latency structure, not just this value, 6212225d46eSJiawei Lin ) 6222225d46eSJiawei Lin 6232225d46eSJiawei Lin val csrCfg = FuConfig( 6241a0f06eeSYinan Xu name = "csr", 6252225d46eSJiawei Lin fuGen = csrGen, 6266cdd85d9SYinan Xu fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.csr, 6272225d46eSJiawei Lin fuType = FuType.csr, 6282225d46eSJiawei Lin numIntSrc = 1, 6292225d46eSJiawei Lin numFpSrc = 0, 6302225d46eSJiawei Lin writeIntRf = true, 6312225d46eSJiawei Lin writeFpRf = false, 6326ab6918fSYinan Xu exceptionOut = Seq(illegalInstr, breakPoint, ecallU, ecallS, ecallM), 6336ab6918fSYinan Xu flushPipe = true 6342225d46eSJiawei Lin ) 6352225d46eSJiawei Lin 6362225d46eSJiawei Lin val i2fCfg = FuConfig( 6371a0f06eeSYinan Xu name = "i2f", 6382225d46eSJiawei Lin fuGen = i2fGen, 6392225d46eSJiawei Lin fuSel = i2fSel, 6402225d46eSJiawei Lin FuType.i2f, 6412225d46eSJiawei Lin numIntSrc = 1, 6422225d46eSJiawei Lin numFpSrc = 0, 6432225d46eSJiawei Lin writeIntRf = false, 6442225d46eSJiawei Lin writeFpRf = true, 6456ab6918fSYinan Xu writeFflags = true, 646e174d629SJiawei Lin latency = CertainLatency(2), 647e174d629SJiawei Lin fastUopOut = true, fastImplemented = true 6482225d46eSJiawei Lin ) 6492225d46eSJiawei Lin 6502225d46eSJiawei Lin val divCfg = FuConfig( 6511a0f06eeSYinan Xu name = "div", 6522225d46eSJiawei Lin fuGen = dividerGen, 65307596dc6Szfw fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.div, 6542225d46eSJiawei Lin FuType.div, 6552225d46eSJiawei Lin 2, 6562225d46eSJiawei Lin 0, 6572225d46eSJiawei Lin writeIntRf = true, 6582225d46eSJiawei Lin writeFpRf = false, 659f83b578aSYinan Xu latency = UncertainLatency(), 660f83b578aSYinan Xu fastUopOut = true, 66181cc0e81SYinan Xu fastImplemented = true 6622225d46eSJiawei Lin ) 6632225d46eSJiawei Lin 6642225d46eSJiawei Lin val mulCfg = FuConfig( 6651a0f06eeSYinan Xu name = "mul", 6662225d46eSJiawei Lin fuGen = multiplierGen, 66707596dc6Szfw fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.mul, 6682225d46eSJiawei Lin FuType.mul, 6692225d46eSJiawei Lin 2, 6702225d46eSJiawei Lin 0, 6712225d46eSJiawei Lin writeIntRf = true, 6722225d46eSJiawei Lin writeFpRf = false, 673b2482bc1SYinan Xu latency = CertainLatency(2), 674f83b578aSYinan Xu fastUopOut = true, 675b2482bc1SYinan Xu fastImplemented = true 6762225d46eSJiawei Lin ) 6772225d46eSJiawei Lin 6783feeca58Szfw val bkuCfg = FuConfig( 6793feeca58Szfw name = "bku", 6803feeca58Szfw fuGen = bkuGen, 6813feeca58Szfw fuSel = (uop: MicroOp) => uop.ctrl.fuType === FuType.bku, 6823feeca58Szfw fuType = FuType.bku, 683ee8ff153Szfw numIntSrc = 2, 684ee8ff153Szfw numFpSrc = 0, 685ee8ff153Szfw writeIntRf = true, 686ee8ff153Szfw writeFpRf = false, 687f83b578aSYinan Xu latency = CertainLatency(1), 688f83b578aSYinan Xu fastUopOut = true, 68907596dc6Szfw fastImplemented = true 690ee8ff153Szfw ) 691ee8ff153Szfw 6922225d46eSJiawei Lin val fmacCfg = FuConfig( 6931a0f06eeSYinan Xu name = "fmac", 6942225d46eSJiawei Lin fuGen = fmacGen, 6952225d46eSJiawei Lin fuSel = _ => true.B, 6966ab6918fSYinan Xu FuType.fmac, 0, 3, writeIntRf = false, writeFpRf = true, writeFflags = true, 6974b65fc7eSJiawei Lin latency = UncertainLatency(), fastUopOut = true, fastImplemented = true 6982225d46eSJiawei Lin ) 6992225d46eSJiawei Lin 7002225d46eSJiawei Lin val f2iCfg = FuConfig( 7011a0f06eeSYinan Xu name = "f2i", 7022225d46eSJiawei Lin fuGen = f2iGen, 7032225d46eSJiawei Lin fuSel = f2iSel, 7046ab6918fSYinan Xu FuType.fmisc, 0, 1, writeIntRf = true, writeFpRf = false, writeFflags = true, latency = CertainLatency(2), 705b2482bc1SYinan Xu fastUopOut = true, fastImplemented = true 7062225d46eSJiawei Lin ) 7072225d46eSJiawei Lin 7082225d46eSJiawei Lin val f2fCfg = FuConfig( 7091a0f06eeSYinan Xu name = "f2f", 7102225d46eSJiawei Lin fuGen = f2fGen, 7112225d46eSJiawei Lin fuSel = f2fSel, 7126ab6918fSYinan Xu FuType.fmisc, 0, 1, writeIntRf = false, writeFpRf = true, writeFflags = true, latency = CertainLatency(2), 713b2482bc1SYinan Xu fastUopOut = true, fastImplemented = true 7142225d46eSJiawei Lin ) 7152225d46eSJiawei Lin 7162225d46eSJiawei Lin val fdivSqrtCfg = FuConfig( 7171a0f06eeSYinan Xu name = "fdivSqrt", 7182225d46eSJiawei Lin fuGen = fdivSqrtGen, 7192225d46eSJiawei Lin fuSel = fdivSqrtSel, 7206ab6918fSYinan Xu FuType.fDivSqrt, 0, 2, writeIntRf = false, writeFpRf = true, writeFflags = true, latency = UncertainLatency(), 721dcbc69cbSYinan Xu fastUopOut = true, fastImplemented = true, hasInputBuffer = true 7222225d46eSJiawei Lin ) 7232225d46eSJiawei Lin 7242225d46eSJiawei Lin val lduCfg = FuConfig( 7251a0f06eeSYinan Xu "ldu", 7262225d46eSJiawei Lin null, // DontCare 7272b4e8253SYinan Xu (uop: MicroOp) => FuType.loadCanAccept(uop.ctrl.fuType), 7286ab6918fSYinan Xu FuType.ldu, 1, 0, writeIntRf = true, writeFpRf = true, 7296ab6918fSYinan Xu latency = UncertainLatency(), 7306ab6918fSYinan Xu exceptionOut = Seq(loadAddrMisaligned, loadAccessFault, loadPageFault), 7316ab6918fSYinan Xu flushPipe = true, 7326ab6918fSYinan Xu replayInst = true 7332225d46eSJiawei Lin ) 7342225d46eSJiawei Lin 73585b4cd54SYinan Xu val staCfg = FuConfig( 7361a0f06eeSYinan Xu "sta", 7372225d46eSJiawei Lin null, 7382b4e8253SYinan Xu (uop: MicroOp) => FuType.storeCanAccept(uop.ctrl.fuType), 7396ab6918fSYinan Xu FuType.stu, 1, 0, writeIntRf = false, writeFpRf = false, 7406ab6918fSYinan Xu latency = UncertainLatency(), 7416ab6918fSYinan Xu exceptionOut = Seq(storeAddrMisaligned, storeAccessFault, storePageFault) 7422225d46eSJiawei Lin ) 7432225d46eSJiawei Lin 74485b4cd54SYinan Xu val stdCfg = FuConfig( 7451a0f06eeSYinan Xu "std", 7462b4e8253SYinan Xu fuGen = stdGen, fuSel = (uop: MicroOp) => FuType.storeCanAccept(uop.ctrl.fuType), FuType.stu, 1, 1, 7476ab6918fSYinan Xu writeIntRf = false, writeFpRf = false, latency = CertainLatency(1) 74885b4cd54SYinan Xu ) 74985b4cd54SYinan Xu 7502225d46eSJiawei Lin val mouCfg = FuConfig( 7511a0f06eeSYinan Xu "mou", 7522225d46eSJiawei Lin null, 7532b4e8253SYinan Xu (uop: MicroOp) => FuType.storeCanAccept(uop.ctrl.fuType), 7546ab6918fSYinan Xu FuType.mou, 1, 0, writeIntRf = false, writeFpRf = false, 7556ab6918fSYinan Xu latency = UncertainLatency(), exceptionOut = lduCfg.exceptionOut ++ staCfg.exceptionOut 7562b4e8253SYinan Xu ) 7572b4e8253SYinan Xu 7582b4e8253SYinan Xu val mouDataCfg = FuConfig( 7592b4e8253SYinan Xu "mou", 7602b4e8253SYinan Xu mouDataGen, 7612b4e8253SYinan Xu (uop: MicroOp) => FuType.storeCanAccept(uop.ctrl.fuType), 7626ab6918fSYinan Xu FuType.mou, 1, 0, writeIntRf = false, writeFpRf = false, 7636ab6918fSYinan Xu latency = UncertainLatency() 7642225d46eSJiawei Lin ) 7652225d46eSJiawei Lin 766adb5df20SYinan Xu val JumpExeUnitCfg = ExuConfig("JmpExeUnit", "Int", Seq(jmpCfg, i2fCfg), 2, Int.MaxValue) 767b6220f0dSLemover val AluExeUnitCfg = ExuConfig("AluExeUnit", "Int", Seq(aluCfg), 0, Int.MaxValue) 768adb5df20SYinan Xu val JumpCSRExeUnitCfg = ExuConfig("JmpCSRExeUnit", "Int", Seq(jmpCfg, csrCfg, fenceCfg, i2fCfg), 2, Int.MaxValue) 7693feeca58Szfw val MulDivExeUnitCfg = ExuConfig("MulDivExeUnit", "Int", Seq(mulCfg, divCfg, bkuCfg), 1, Int.MaxValue) 770b6220f0dSLemover val FmacExeUnitCfg = ExuConfig("FmacExeUnit", "Fp", Seq(fmacCfg), Int.MaxValue, 0) 7712225d46eSJiawei Lin val FmiscExeUnitCfg = ExuConfig( 7722225d46eSJiawei Lin "FmiscExeUnit", 773b6220f0dSLemover "Fp", 7742225d46eSJiawei Lin Seq(f2iCfg, f2fCfg, fdivSqrtCfg), 7752225d46eSJiawei Lin Int.MaxValue, 1 7762225d46eSJiawei Lin ) 7772b4e8253SYinan Xu val LdExeUnitCfg = ExuConfig("LoadExu", "Mem", Seq(lduCfg), wbIntPriority = 0, wbFpPriority = 0, extendsExu = false) 7782b4e8253SYinan Xu val StaExeUnitCfg = ExuConfig("StaExu", "Mem", Seq(staCfg, mouCfg), wbIntPriority = Int.MaxValue, wbFpPriority = Int.MaxValue, extendsExu = false) 7792b4e8253SYinan Xu val StdExeUnitCfg = ExuConfig("StdExu", "Mem", Seq(stdCfg, mouDataCfg), wbIntPriority = Int.MaxValue, wbFpPriority = Int.MaxValue, extendsExu = false) 7809a2e6b8aSLinJiawei} 781