19a2e6b8aSLinJiaweiimport chisel3._ 29a2e6b8aSLinJiaweiimport chisel3.util._ 39a2e6b8aSLinJiawei 49a2e6b8aSLinJiaweipackage object xiangshan { 59ee9f926SYikeZhou object SrcType { 69a2e6b8aSLinJiawei def reg = "b00".U 79a2e6b8aSLinJiawei def pc = "b01".U 89a2e6b8aSLinJiawei def imm = "b01".U 99a2e6b8aSLinJiawei def fp = "b10".U 1004b56283SZhangZifei 111a3df1feSYikeZhou def DC = imm // Don't Care 124d24c305SYikeZhou 1304b56283SZhangZifei def isReg(srcType: UInt) = srcType===reg 1404b56283SZhangZifei def isPc(srcType: UInt) = srcType===pc 1504b56283SZhangZifei def isImm(srcType: UInt) = srcType===imm 1604b56283SZhangZifei def isFp(srcType: UInt) = srcType===fp 175c321a22SZhangZifei def isPcImm(srcType: UInt) = isPc(srcType) || isImm(srcType) 185c321a22SZhangZifei def isRegFp(srcType: UInt) = isReg(srcType) || isFp(srcType) 1904b56283SZhangZifei 209a2e6b8aSLinJiawei def apply() = UInt(2.W) 219a2e6b8aSLinJiawei } 229a2e6b8aSLinJiawei 239a2e6b8aSLinJiawei object SrcState { 24100aa93cSYinan Xu def busy = "b0".U 25100aa93cSYinan Xu def rdy = "b1".U 26100aa93cSYinan Xu // def specRdy = "b10".U // speculative ready, for future use 27100aa93cSYinan Xu def apply() = UInt(1.W) 289a2e6b8aSLinJiawei } 299a2e6b8aSLinJiawei 309a2e6b8aSLinJiawei object FuType extends HasXSParameter { 31cafb3558SLinJiawei def num = exuParameters.NRFuType 32cafb3558SLinJiawei 33cafb3558SLinJiawei def jmp = "b0000".U 34cafb3558SLinJiawei def i2f = "b0001".U 35cafb3558SLinJiawei def csr = "b0010".U 36975b9ea3SYinan Xu def alu = "b0110".U 37cafb3558SLinJiawei def mul = "b0100".U 38cafb3558SLinJiawei def div = "b0101".U 39975b9ea3SYinan Xu def fence = "b0011".U 40cafb3558SLinJiawei 41cafb3558SLinJiawei def fmac = "b1000".U 4292ab24ebSYinan Xu def fmisc = "b1011".U 43cafb3558SLinJiawei def fDivSqrt = "b1010".U 44cafb3558SLinJiawei 45cafb3558SLinJiawei def ldu = "b1100".U 46cafb3558SLinJiawei def stu = "b1101".U 4792ab24ebSYinan Xu def mou = "b1111".U // for amo, lr, sc, fence 489a2e6b8aSLinJiawei 499a2e6b8aSLinJiawei def apply() = UInt(log2Up(num).W) 509a2e6b8aSLinJiawei 51cafb3558SLinJiawei def isIntExu(fuType: UInt) = !fuType(3) 526ac289b3SLinJiawei def isJumpExu(fuType: UInt) = fuType === jmp 53cafb3558SLinJiawei def isFpExu(fuType: UInt) = fuType(3, 2) === "b10".U 54cafb3558SLinJiawei def isMemExu(fuType: UInt) = fuType(3, 2) === "b11".U 5592ab24ebSYinan Xu def isLoadStore(fuType: UInt) = isMemExu(fuType) && !fuType(1) 5692ab24ebSYinan Xu def isStoreExu(fuType: UInt) = isMemExu(fuType) && fuType(0) 57*0f9d3717SYinan Xu def isAMO(fuType: UInt) = fuType(1) 5892ab24ebSYinan Xu 5992ab24ebSYinan Xu def jmpCanAccept(fuType: UInt) = !fuType(2) 6092ab24ebSYinan Xu def mduCanAccept(fuType: UInt) = fuType(2) && !fuType(1) 6192ab24ebSYinan Xu def aluCanAccept(fuType: UInt) = fuType(2) && fuType(1) 6292ab24ebSYinan Xu 6392ab24ebSYinan Xu def fmacCanAccept(fuType: UInt) = !fuType(1) 6492ab24ebSYinan Xu def fmiscCanAccept(fuType: UInt) = fuType(1) 6592ab24ebSYinan Xu 6692ab24ebSYinan Xu def loadCanAccept(fuType: UInt) = !fuType(0) 6792ab24ebSYinan Xu def storeCanAccept(fuType: UInt) = fuType(0) 6892ab24ebSYinan Xu 6992ab24ebSYinan Xu def storeIsAMO(fuType: UInt) = fuType(1) 70cafb3558SLinJiawei 71cafb3558SLinJiawei val functionNameMap = Map( 72cafb3558SLinJiawei jmp.litValue() -> "jmp", 73cafb3558SLinJiawei i2f.litValue() -> "int to float", 74cafb3558SLinJiawei csr.litValue() -> "csr", 75cafb3558SLinJiawei alu.litValue() -> "alu", 76cafb3558SLinJiawei mul.litValue() -> "mul", 77cafb3558SLinJiawei div.litValue() -> "div", 78b8f08ca0SZhangZifei fence.litValue() -> "fence", 79cafb3558SLinJiawei fmac.litValue() -> "fmac", 80cafb3558SLinJiawei fmisc.litValue() -> "fmisc", 81cafb3558SLinJiawei fDivSqrt.litValue() -> "fdiv/fsqrt", 82cafb3558SLinJiawei ldu.litValue() -> "load", 83cafb3558SLinJiawei stu.litValue() -> "store" 84cafb3558SLinJiawei ) 85cafb3558SLinJiawei 869a2e6b8aSLinJiawei } 879a2e6b8aSLinJiawei 889a2e6b8aSLinJiawei object FuOpType extends HasXSParameter { 89cafb3558SLinJiawei def apply() = UInt(exuParameters.FuOpWidth.W) 909a2e6b8aSLinJiawei } 91ebd97ecbSzhanglinjuan 92ebd97ecbSzhanglinjuan object BTBtype { 93ebd97ecbSzhanglinjuan def B = "b00".U // branch 94ebd97ecbSzhanglinjuan def J = "b01".U // jump 95ebd97ecbSzhanglinjuan def I = "b10".U // indirect 96ebd97ecbSzhanglinjuan def R = "b11".U // return 97ebd97ecbSzhanglinjuan 98ebd97ecbSzhanglinjuan def apply() = UInt(2.W) 99ebd97ecbSzhanglinjuan } 100518d8658SYinan Xu 101a3edac52SYinan Xu object CommitType { 102fe6452fcSYinan Xu def NORMAL = "b00".U // int/fp 103fe6452fcSYinan Xu def BRANCH = "b01".U // branch 104a3edac52SYinan Xu def LOAD = "b10".U // load 105a3edac52SYinan Xu def STORE = "b11".U // store 106518d8658SYinan Xu 107518d8658SYinan Xu def apply() = UInt(2.W) 108a3edac52SYinan Xu def isLoadStore(commitType: UInt) = commitType(1) 1094fb541a1SYinan Xu def lsInstIsStore(commitType: UInt) = commitType(0) 1101abe60b3SYinan Xu def isStore(commitType: UInt) = isLoadStore(commitType) && lsInstIsStore(commitType) 111fe6452fcSYinan Xu def isBranch(commitType: UInt) = commitType(0) && !commitType(1) 112518d8658SYinan Xu } 113bfb958a3SYinan Xu 114bfb958a3SYinan Xu object RedirectLevel { 115bfb958a3SYinan Xu def flushAfter = "b00".U 116bfb958a3SYinan Xu def flush = "b01".U 117bfb958a3SYinan Xu def flushAll = "b10".U 118bfb958a3SYinan Xu def exception = "b11".U 119bfb958a3SYinan Xu 120bfb958a3SYinan Xu def apply() = UInt(2.W) 121bfb958a3SYinan Xu def isUnconditional(level: UInt) = level(1) 122bfb958a3SYinan Xu def flushItself(level: UInt) = level(0) 123bfb958a3SYinan Xu def isException(level: UInt) = level(1) && level(0) 124bfb958a3SYinan Xu } 125baf8def6SYinan Xu 126baf8def6SYinan Xu object ExceptionVec { 127baf8def6SYinan Xu def apply() = Vec(16, Bool()) 128baf8def6SYinan Xu } 129a8e04b1dSYinan Xu 130c60c1ab4SWilliam Wang object PMAMode { 1318d9a04fcSWilliam Wang def R = "b1".U << 0 //readable 1328d9a04fcSWilliam Wang def W = "b1".U << 1 //writeable 1338d9a04fcSWilliam Wang def X = "b1".U << 2 //executable 1348d9a04fcSWilliam Wang def I = "b1".U << 3 //cacheable: icache 1358d9a04fcSWilliam Wang def D = "b1".U << 4 //cacheable: dcache 1368d9a04fcSWilliam Wang def S = "b1".U << 5 //enable speculative access 137cff68e26SWilliam Wang def A = "b1".U << 6 //enable atomic operation, A imply R & W 1388d9a04fcSWilliam Wang def C = "b1".U << 7 //if it is cacheable is configable 139c60c1ab4SWilliam Wang def Reserved = "b0".U 140c60c1ab4SWilliam Wang 141c60c1ab4SWilliam Wang def apply() = UInt(7.W) 142c60c1ab4SWilliam Wang 143c60c1ab4SWilliam Wang def read(mode: UInt) = mode(0) 144c60c1ab4SWilliam Wang def write(mode: UInt) = mode(1) 145c60c1ab4SWilliam Wang def execute(mode: UInt) = mode(2) 146c60c1ab4SWilliam Wang def icache(mode: UInt) = mode(3) 147c60c1ab4SWilliam Wang def dcache(mode: UInt) = mode(4) 148c60c1ab4SWilliam Wang def speculate(mode: UInt) = mode(5) 149c60c1ab4SWilliam Wang def atomic(mode: UInt) = mode(6) 150c60c1ab4SWilliam Wang def configable_cache(mode: UInt) = mode(7) 151c60c1ab4SWilliam Wang 152c60c1ab4SWilliam Wang def strToMode(s: String) = { 153c60c1ab4SWilliam Wang var result = 0.U << 8 154c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("R") >= 0) result = result + R 155c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("W") >= 0) result = result + W 156c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("X") >= 0) result = result + X 157c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("I") >= 0) result = result + I 158c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("D") >= 0) result = result + D 159c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("S") >= 0) result = result + S 160c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("A") >= 0) result = result + A 161c60c1ab4SWilliam Wang if (s.toUpperCase.indexOf("C") >= 0) result = result + C 162c60c1ab4SWilliam Wang result 163c60c1ab4SWilliam Wang } 164c60c1ab4SWilliam Wang } 1659a2e6b8aSLinJiawei} 166