RegMap.scala 1.7 KB
Newer Older
Z
Zihao Yu 已提交
1 2 3 4 5 6
package utils

import chisel3._
import chisel3.util._

object RegMap {
7
  def Unwritable = null
Z
Zihao Yu 已提交
8
  def apply(addr: Int, reg: UInt, wfn: UInt => UInt = (x => x)) = (addr, (reg, wfn))
9 10
  def generate(mapping: Map[Int, (UInt, UInt => UInt)], raddr: UInt, rdata: UInt,
    waddr: UInt, wen: Bool, wdata: UInt, wmask: UInt):Unit = {
Z
Zihao Yu 已提交
11
    val chiselMapping = mapping.map { case (a, (r, w)) => (a.U, r, w) }
12
    rdata := LookupTree(raddr, chiselMapping.map { case (a, r, w) => (a, r) })
13 14
    chiselMapping.map { case (a, r, w) =>
      if (w != null) when (wen && waddr === a) { r := w(MaskData(r, wdata, wmask)) }
Z
Zihao Yu 已提交
15 16
    }
  }
17 18
  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 已提交
19
}
20

21
object MaskedRegMap { // TODO: add read mask
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
  def Unwritable = null
  def WritableMask = Fill(64, true.B)
  def UnwritableMask = 0.U(64.W)
  def apply(addr: Int, reg: UInt, wmask: UInt = WritableMask, wfn: UInt => UInt = (x => x)) = (addr, (reg, wmask, wfn))
  def generate(mapping: Map[Int, (UInt, UInt, UInt => UInt)], raddr: UInt, rdata: UInt,
    waddr: UInt, wen: Bool, wdata: UInt):Unit = {
    val chiselMapping = mapping.map { case (a, (r, m, w)) => (a.U, r, m, w) }
    rdata := LookupTree(raddr, chiselMapping.map { case (a, r, m, w) => (a, r) })
    chiselMapping.map { case (a, r, m, w) =>
      if (w != null && m != UnwritableMask) when (wen && waddr === a) { r := w(MaskData(r, wdata, m)) }
    }
  }
  def generate(mapping: Map[Int, (UInt, UInt, UInt => UInt)], addr: UInt, rdata: UInt,
    wen: Bool, wdata: UInt):Unit = generate(mapping, addr, rdata, addr, wen, wdata)
}