63 lines
1.6 KiB
Scala
63 lines
1.6 KiB
Scala
package uncore
|
|
|
|
import Chisel._
|
|
import junctions._
|
|
|
|
class RTC(pcr_MTIME: Int) extends Module with HTIFParameters {
|
|
val io = new NASTIIO
|
|
|
|
private val addrMap = params(NASTIAddrHashMap)
|
|
|
|
val addrTable = Vec.tabulate(nCores) { i =>
|
|
UInt(addrMap(s"conf:csr$i").start + pcr_MTIME * scrDataBytes)
|
|
}
|
|
|
|
val rtc = Reg(init=UInt(0,64))
|
|
val rtc_tick = Counter(params(RTCPeriod)).inc()
|
|
|
|
val sending_addr = Reg(init = Bool(false))
|
|
val sending_data = Reg(init = Bool(false))
|
|
val send_acked = Reg(init = Vec(nCores, Bool(true)))
|
|
val coreId = Wire(UInt(width = log2Up(nCores)))
|
|
|
|
when (rtc_tick) {
|
|
rtc := rtc + UInt(1)
|
|
send_acked := Vec(nCores, Bool(false))
|
|
sending_addr := Bool(true)
|
|
sending_data := Bool(true)
|
|
}
|
|
|
|
if (nCores > 1) {
|
|
val (addr_send_cnt, addr_send_done) = Counter(io.aw.fire(), nCores)
|
|
val (_, data_send_done) = Counter(io.w.fire(), nCores)
|
|
|
|
when (addr_send_done) { sending_addr := Bool(false) }
|
|
when (data_send_done) { sending_data := Bool(false) }
|
|
|
|
coreId := addr_send_cnt
|
|
} else {
|
|
when (io.aw.fire()) { sending_addr := Bool(false) }
|
|
when (io.w.fire()) { sending_addr := Bool(false) }
|
|
|
|
coreId := UInt(0)
|
|
}
|
|
|
|
when (io.b.fire()) { send_acked(io.b.bits.id) := Bool(true) }
|
|
|
|
io.aw.valid := sending_addr
|
|
io.aw.bits := NASTIWriteAddressChannel(
|
|
id = coreId,
|
|
addr = addrTable(coreId),
|
|
size = UInt(log2Up(scrDataBytes)))
|
|
|
|
io.w.valid := sending_data
|
|
io.w.bits := NASTIWriteDataChannel(data = rtc)
|
|
|
|
io.b.ready := Bool(true)
|
|
io.ar.valid := Bool(false)
|
|
io.r.ready := Bool(false)
|
|
|
|
assert(!rtc_tick || send_acked.reduce(_ && _),
|
|
s"Not all clocks were updated for rtc tick")
|
|
}
|