xref: /XiangShan/src/main/scala/xiangshan/backend/fu/util/CSRConst.scala (revision 8882eb685de93177da606ee717b5ec8e459a768a)
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