RegMap.scala 2.9 KB
Newer Older
L
Lemover 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
/***************************************************************************************
* Copyright (c) 2020-2021 Institute of Computing Technology, Chinese Academy of Sciences
*
* XiangShan is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
*          http://license.coscl.org.cn/MulanPSL2
*
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
*
* See the Mulan PSL v2 for more details.
***************************************************************************************/

Z
Zihao Yu 已提交
16 17 18 19 20 21
package utils

import chisel3._
import chisel3.util._

object RegMap {
22
  def Unwritable = null
Z
Zihao Yu 已提交
23
  def apply(addr: Int, reg: UInt, wfn: UInt => UInt = (x => x)) = (addr, (reg, wfn))
24 25
  def generate(mapping: Map[Int, (UInt, UInt => UInt)], raddr: UInt, rdata: UInt,
    waddr: UInt, wen: Bool, wdata: UInt, wmask: UInt):Unit = {
Z
Zihao Yu 已提交
26
    val chiselMapping = mapping.map { case (a, (r, w)) => (a.U, r, w) }
27
    rdata := LookupTree(raddr, chiselMapping.map { case (a, r, w) => (a, r) })
28 29
    chiselMapping.map { case (a, r, w) =>
      if (w != null) when (wen && waddr === a) { r := w(MaskData(r, wdata, wmask)) }
Z
Zihao Yu 已提交
30 31
    }
  }
32 33
  def generate(mapping: Map[Int, (UInt, UInt => UInt)], addr: UInt, rdata: UInt,
    wen: Bool, wdata: UInt, wmask: UInt):Unit = generate(mapping, addr, rdata, addr, wen, wdata, wmask)
Z
Zihao Yu 已提交
34
}
35

36
object MaskedRegMap { // TODO: add read mask
37
  def Unwritable = null
38
  def NoSideEffect: UInt => UInt = (x=>x)
39 40
  def WritableMask = Fill(64, true.B)
  def UnwritableMask = 0.U(64.W)
L
FPUv0.1  
LinJiawei 已提交
41 42 43 44 45
  def apply(addr: Int, reg: UInt,
            wmask: UInt = WritableMask, wfn: UInt => UInt = (x => x),
            rmask: UInt = WritableMask, rfn: UInt => UInt = x=>x
           ) = (addr, (reg, wmask, wfn, rmask, rfn))
  def generate(mapping: Map[Int, (UInt, UInt, UInt => UInt, UInt, UInt => UInt)], raddr: UInt, rdata: UInt,
46
    waddr: UInt, wen: Bool, wdata: UInt):Unit = {
L
FPUv0.1  
LinJiawei 已提交
47 48 49
    val chiselMapping = mapping.map { case (a, (r, wm, w, rm, rfn)) => (a.U, r, wm, w, rm, rfn) }
    rdata := LookupTree(raddr, chiselMapping.map { case (a, r, wm, w, rm, rfn) => (a, rfn(r & rm)) })
    chiselMapping.map { case (a, r, wm, w, rm, rfn) =>
50
      if (w != null && wm != UnwritableMask) when (wen && waddr === a) { r := w(MaskData(r, wdata, wm)) }
51 52
    }
  }
L
FPUv0.1  
LinJiawei 已提交
53
  def isIllegalAddr(mapping: Map[Int, (UInt, UInt, UInt => UInt, UInt, UInt => UInt)], addr: UInt):Bool = {
54
    val illegalAddr = Wire(Bool())
55
    illegalAddr := LookupTreeDefault(addr, true.B, mapping.toSeq.sortBy(_._1).map { case (a, _) => (a.U, false.B) })
56 57
    illegalAddr
  }
L
FPUv0.1  
LinJiawei 已提交
58
  def generate(mapping: Map[Int, (UInt, UInt, UInt => UInt, UInt, UInt => UInt)], addr: UInt, rdata: UInt,
59 60
    wen: Bool, wdata: UInt):Unit = generate(mapping, addr, rdata, addr, wen, wdata)
}