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 17db988794Swangkaifanpackage xiangshan.backend.fu.util 18db988794Swangkaifan 19db988794Swangkaifanimport chisel3._ 20db988794Swangkaifanimport chisel3.util._ 21075d4937Sjunxiong-jiimport freechips.rocketchip.rocket.CSRs 22db988794Swangkaifan 23db988794Swangkaifantrait HasCSRConst { 2435a47a38SYinan Xu // Supervisor Custom Read/Write 25eedc2e58SSteve Gou val Sbpctl = 0x5C0 26eedc2e58SSteve Gou val Spfctl = 0x5C1 272b8b2e7aSWilliam Wang val Slvpredctl = 0x5C2 28f3f22d72SYinan Xu val Smblockctl = 0x5C3 29aac4464eSYinan Xu val Srnctl = 0x5C4 30ad3ba452Szhanglinjuan /** 0x5C5-0x5E5 for cache instruction register*/ 31c157cf71SGuokai Chen val Scachebase = 0x5C5 322b8b2e7aSWilliam Wang 33075d4937Sjunxiong-ji // Machine level PMA TODO: remove this 34ca2f90a6SLemover val PmacfgBase = 0x7C0 357d9edc86SLemover val PmaaddrBase = 0x7C8 // 64 entry at most 36db988794Swangkaifan 37*8882eb68SXin Tian // Machine level Bitmap Check(Custom Read/Write) 38*8882eb68SXin Tian val Mbmc = 0xBC2 39*8882eb68SXin Tian 40db988794Swangkaifan def privEcall = 0x000.U 41db988794Swangkaifan def privEbreak = 0x001.U 42c2a2229dSlewislzh def privMNret = 0x702.U 43db988794Swangkaifan def privMret = 0x302.U 44db988794Swangkaifan def privSret = 0x102.U 45db988794Swangkaifan def privUret = 0x002.U 46d4aca96cSlqre def privDret = 0x7b2.U 47db988794Swangkaifan 48db988794Swangkaifan def ModeM = 0x3.U 49db988794Swangkaifan def ModeH = 0x2.U 50db988794Swangkaifan def ModeS = 0x1.U 51db988794Swangkaifan def ModeU = 0x0.U 52db988794Swangkaifan 5343171c7aSwakafa def IRQ_USIP = 0 5443171c7aSwakafa def IRQ_SSIP = 1 55d0de7e4aSpeixiaokun def IRQ_VSSIP = 2 5643171c7aSwakafa def IRQ_MSIP = 3 57db988794Swangkaifan 58db988794Swangkaifan def IRQ_UTIP = 4 59db988794Swangkaifan def IRQ_STIP = 5 60d0de7e4aSpeixiaokun def IRQ_VSTIP = 6 61db988794Swangkaifan def IRQ_MTIP = 7 62db988794Swangkaifan 6343171c7aSwakafa def IRQ_UEIP = 8 6443171c7aSwakafa def IRQ_SEIP = 9 65d0de7e4aSpeixiaokun def IRQ_VSEIP = 10 6643171c7aSwakafa def IRQ_MEIP = 11 67db988794Swangkaifan 68d0de7e4aSpeixiaokun def IRQ_SGEIP = 12 69a7a6d0a6Schengguanghui def IRQ_DEBUG = 17 70d0de7e4aSpeixiaokun 71d0de7e4aSpeixiaokun val Hgatp_Mode_len = 4 72a1d4b4bfSpeixiaokun val Hgatp_Vmid_len = 16 73d0de7e4aSpeixiaokun val Hgatp_Addr_len = 44 74d4aca96cSlqre 75705cbec3SLemover val Satp_Mode_len = 4 76705cbec3SLemover val Satp_Asid_len = 16 77705cbec3SLemover val Satp_Addr_len = 44 78705cbec3SLemover def satp_part_wmask(max_length: Int, length: Int) : UInt = { 79705cbec3SLemover require(length > 0 && length <= max_length) 80705cbec3SLemover ((1L << length) - 1).U(max_length.W) 8145f497a4Shappy-lx } 8245f497a4Shappy-lx 83db988794Swangkaifan val IntPriority = Seq( 84d4aca96cSlqre IRQ_DEBUG, 85db988794Swangkaifan IRQ_MEIP, IRQ_MSIP, IRQ_MTIP, 86db988794Swangkaifan IRQ_SEIP, IRQ_SSIP, IRQ_STIP, 87d0de7e4aSpeixiaokun IRQ_UEIP, IRQ_USIP, IRQ_UTIP, 88d0de7e4aSpeixiaokun IRQ_VSEIP, IRQ_VSSIP, IRQ_VSTIP, IRQ_SGEIP 89db988794Swangkaifan ) 90db988794Swangkaifan 91d61cd5eeSpeixiaokun def csrAccessPermissionCheck(addr: UInt, wen: Bool, mode: UInt, virt: Bool, hasH: Bool): UInt = { 92db988794Swangkaifan val readOnly = addr(11, 10) === "b11".U 93db988794Swangkaifan val lowestAccessPrivilegeLevel = addr(9,8) 94d0de7e4aSpeixiaokun val priv = Mux(mode === ModeS, ModeH, mode) 95d0de7e4aSpeixiaokun val ret = Wire(Bool()) //0.U: normal, 1.U: illegal_instruction, 2.U: virtual instruction 96d0de7e4aSpeixiaokun when (lowestAccessPrivilegeLevel === ModeH && !hasH){ 97d0de7e4aSpeixiaokun ret := 1.U 98d0de7e4aSpeixiaokun }.elsewhen (readOnly && wen) { 99d0de7e4aSpeixiaokun ret := 1.U 100d0de7e4aSpeixiaokun }.elsewhen (priv < lowestAccessPrivilegeLevel) { 101d0de7e4aSpeixiaokun when(virt && lowestAccessPrivilegeLevel <= ModeH){ 102d0de7e4aSpeixiaokun ret := 2.U 103d0de7e4aSpeixiaokun }.otherwise{ 104d0de7e4aSpeixiaokun ret := 1.U 105d0de7e4aSpeixiaokun } 106d0de7e4aSpeixiaokun }.otherwise{ 107d0de7e4aSpeixiaokun ret := 0.U 108d0de7e4aSpeixiaokun } 109d0de7e4aSpeixiaokun ret 110db988794Swangkaifan } 11187acdd8eSwangkaifan 11287acdd8eSwangkaifan def perfcntPermissionCheck(addr: UInt, mode: UInt, mmask: UInt, smask: UInt): Bool = { 11387acdd8eSwangkaifan val index = UIntToOH(addr & 31.U) 11487acdd8eSwangkaifan Mux(mode === ModeM, true.B, Mux(mode === ModeS, (index & mmask) =/= 0.U, (index & mmask & smask) =/= 0.U)) 11587acdd8eSwangkaifan } 11672951335SLi Qianruo 11772951335SLi Qianruo def dcsrPermissionCheck(addr: UInt, mModeCanWrite: UInt, debug: Bool): Bool = { 11872951335SLi Qianruo // debug mode write only regs 11972951335SLi Qianruo val isDebugReg = addr(11, 4) === "h7b".U 12072951335SLi Qianruo Mux(!mModeCanWrite && isDebugReg, debug, true.B) 12172951335SLi Qianruo } 12272951335SLi Qianruo 12372951335SLi Qianruo def triggerPermissionCheck(addr: UInt, mModeCanWrite: UInt, debug: Bool): Bool = { 12472951335SLi Qianruo val isTriggerReg = addr(11, 4) === "h7a".U 12572951335SLi Qianruo Mux(!mModeCanWrite && isTriggerReg, debug, true.B) 12672951335SLi Qianruo } 127db988794Swangkaifan} 128f7af4c74Schengguanghuiobject CSRConst extends HasCSRConst 129