1
0

Merge pull request #1044 from freechipsproject/nicer-clint

clint: use RegField.toBytes to save some work
This commit is contained in:
Wesley W. Terpstra 2017-10-10 20:33:00 -07:00 committed by GitHub
commit 5ff4c1674a
2 changed files with 13 additions and 13 deletions

View File

@ -21,7 +21,7 @@ object ClintConsts
def timecmpBytes = 8 def timecmpBytes = 8
def size = 0x10000 def size = 0x10000
def timeWidth = 64 def timeWidth = 64
def regWidth = 32 def ipiWidth = 32
def ints = 2 def ints = 2
} }
@ -57,15 +57,11 @@ class CoreplexLocalInterrupter(params: ClintParams)(implicit p: Parameters) exte
val rtcTick = Bool(INPUT) val rtcTick = Bool(INPUT)
}) })
val time = Seq.fill(timeWidth/regWidth)(Reg(init=UInt(0, width = regWidth))) val time = RegInit(UInt(0, width = timeWidth))
when (io.rtcTick) { when (io.rtcTick) { time := time + UInt(1) }
val newTime = time.asUInt + UInt(1)
for ((reg, i) <- time zip (0 until timeWidth by regWidth))
reg := newTime >> i
}
val nTiles = intnode.out.size val nTiles = intnode.out.size
val timecmp = Seq.fill(nTiles) { Seq.fill(timeWidth/regWidth)(Reg(UInt(width = regWidth))) } val timecmp = Seq.fill(nTiles) { Reg(UInt(width = timeWidth)) }
val ipi = Seq.fill(nTiles) { RegInit(UInt(0, width = 1)) } val ipi = Seq.fill(nTiles) { RegInit(UInt(0, width = 1)) }
val (intnode_out, _) = intnode.out.unzip val (intnode_out, _) = intnode.out.unzip
@ -84,12 +80,10 @@ class CoreplexLocalInterrupter(params: ClintParams)(implicit p: Parameters) exte
* bffc mtime hi * bffc mtime hi
*/ */
def makeRegFields(s: Seq[UInt]) = s.map(r => RegField(regWidth, r))
node.regmap( node.regmap(
0 -> makeRegFields(ipi), 0 -> ipi.map(r => RegField(ipiWidth, r)),
timecmpOffset(0) -> makeRegFields(timecmp.flatten), timecmpOffset(0) -> timecmp.flatMap(RegField.bytes(_)),
timeOffset -> makeRegFields(time)) timeOffset -> RegField.bytes(time))
} }
} }

View File

@ -122,6 +122,12 @@ object RegField
when (valid) { bytes(i) := data } when (valid) { bytes(i) := data }
Bool(true) Bool(true)
}))}} }))}}
def bytes(reg: UInt): Seq[RegField] = {
val width = reg.getWidth
require (width % 8 == 0, s"RegField.bytes must be called on byte-sized reg, not ${width} bits")
bytes(reg, width/8)
}
} }
trait HasRegMap trait HasRegMap