rocket: pass scratchpad address to block dcache
This commit is contained in:
parent
c18bc07bbc
commit
5fe107bb07
@ -100,7 +100,10 @@ abstract class GroundTest(implicit val p: Parameters) extends Module
|
|||||||
}
|
}
|
||||||
|
|
||||||
class GroundTestTile(implicit val p: Parameters) extends LazyModule with HasGroundTestParameters {
|
class GroundTestTile(implicit val p: Parameters) extends LazyModule with HasGroundTestParameters {
|
||||||
val dcacheParams = p.alterPartial({ case CacheName => CacheName("L1D") })
|
val dcacheParams = p.alterPartial {
|
||||||
|
case CacheName => CacheName("L1D")
|
||||||
|
case rocket.TLCacheEdge => cachedOut.edgesOut(0)
|
||||||
|
}
|
||||||
val slave = None
|
val slave = None
|
||||||
val dcache = HellaCache(p(DCacheKey))(dcacheParams)
|
val dcache = HellaCache(p(DCacheKey))(dcacheParams)
|
||||||
val ucLegacy = LazyModule(new TLLegacy()(p))
|
val ucLegacy = LazyModule(new TLLegacy()(p))
|
||||||
@ -141,7 +144,7 @@ class GroundTestTile(implicit val p: Parameters) extends LazyModule with HasGrou
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (ptwPorts.size > 0) {
|
if (ptwPorts.size > 0) {
|
||||||
val ptw = Module(new DummyPTW(ptwPorts.size))
|
val ptw = Module(new DummyPTW(ptwPorts.size)(dcacheParams))
|
||||||
ptw.io.requestors <> ptwPorts
|
ptw.io.requestors <> ptwPorts
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -39,7 +39,7 @@ class DCacheDataArray(implicit p: Parameters) extends L1HellaCacheModule()(p) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class DCache(cfg: DCacheConfig)(implicit p: Parameters) extends HellaCache(cfg)(p) {
|
class DCache(cfg: DCacheConfig, val scratch: () => Option[AddressSet])(implicit p: Parameters) extends HellaCache(cfg)(p) {
|
||||||
override lazy val module = new DCacheModule(this)
|
override lazy val module = new DCacheModule(this)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -123,7 +123,7 @@ class DCacheModule(outer: DCache)(implicit p: Parameters) extends HellaCacheModu
|
|||||||
require(nWays == 1)
|
require(nWays == 1)
|
||||||
metaWriteArb.io.out.ready := true
|
metaWriteArb.io.out.ready := true
|
||||||
metaReadArb.io.out.ready := !metaWriteArb.io.out.valid
|
metaReadArb.io.out.ready := !metaWriteArb.io.out.valid
|
||||||
val inScratchpad = Bool(false) // !!! addrMap(s"TL2:dmem${p(TileId)}").containsAddress(s1_paddr)
|
val inScratchpad = outer.scratch().map(_.contains(s1_paddr)).getOrElse(Bool(false))
|
||||||
val hitState = Mux(inScratchpad, ClientMetadata.maximum, ClientMetadata.onReset)
|
val hitState = Mux(inScratchpad, ClientMetadata.maximum, ClientMetadata.onReset)
|
||||||
(inScratchpad, hitState, L1Metadata(UInt(0), ClientMetadata.onReset))
|
(inScratchpad, hitState, L1Metadata(UInt(0), ClientMetadata.onReset))
|
||||||
} else {
|
} else {
|
||||||
|
@ -159,8 +159,8 @@ class HellaCacheModule(outer: HellaCache)(implicit val p: Parameters) extends La
|
|||||||
}
|
}
|
||||||
|
|
||||||
object HellaCache {
|
object HellaCache {
|
||||||
def apply(cfg: DCacheConfig)(implicit p: Parameters) = {
|
def apply(cfg: DCacheConfig, scratch: () => Option[AddressSet] = () => None)(implicit p: Parameters) = {
|
||||||
if (cfg.nMSHRs == 0) LazyModule(new DCache(cfg))
|
if (cfg.nMSHRs == 0) LazyModule(new DCache(cfg, scratch))
|
||||||
else LazyModule(new NonBlockingDCache(cfg))
|
else LazyModule(new NonBlockingDCache(cfg))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -687,6 +687,7 @@ class NonBlockingDCache(cfg: DCacheConfig)(implicit p: Parameters) extends Hella
|
|||||||
class NonBlockingDCacheModule(outer: NonBlockingDCache)(implicit p: Parameters) extends HellaCacheModule(outer)(p) {
|
class NonBlockingDCacheModule(outer: NonBlockingDCache)(implicit p: Parameters) extends HellaCacheModule(outer)(p) {
|
||||||
|
|
||||||
require(isPow2(nWays)) // TODO: relax this
|
require(isPow2(nWays)) // TODO: relax this
|
||||||
|
require(p(DataScratchpadSize) == 0)
|
||||||
|
|
||||||
val wb = Module(new WritebackUnit(edge))
|
val wb = Module(new WritebackUnit(edge))
|
||||||
val prober = Module(new ProbeUnit(edge))
|
val prober = Module(new ProbeUnit(edge))
|
||||||
|
@ -11,7 +11,8 @@ import uncore.constants._
|
|||||||
import uncore.tilelink2._
|
import uncore.tilelink2._
|
||||||
import uncore.util._
|
import uncore.util._
|
||||||
|
|
||||||
class ScratchpadSlavePort(implicit val p: Parameters) extends LazyModule with HasCoreParameters {
|
class ScratchpadSlavePort(implicit val p: Parameters) extends LazyModule {
|
||||||
|
val coreDataBytes = p(XLen)/8
|
||||||
val node = TLManagerNode(TLManagerPortParameters(
|
val node = TLManagerNode(TLManagerPortParameters(
|
||||||
Seq(TLManagerParameters(
|
Seq(TLManagerParameters(
|
||||||
address = List(AddressSet(0x80000000L, BigInt(p(DataScratchpadSize)-1))),
|
address = List(AddressSet(0x80000000L, BigInt(p(DataScratchpadSize)-1))),
|
||||||
@ -26,9 +27,6 @@ class ScratchpadSlavePort(implicit val p: Parameters) extends LazyModule with Ha
|
|||||||
beatBytes = coreDataBytes,
|
beatBytes = coreDataBytes,
|
||||||
minLatency = 1))
|
minLatency = 1))
|
||||||
|
|
||||||
// Make sure this ends up with the same name as before
|
|
||||||
override def name = "dmem0"
|
|
||||||
|
|
||||||
lazy val module = new LazyModuleImp(this) {
|
lazy val module = new LazyModuleImp(this) {
|
||||||
val io = new Bundle {
|
val io = new Bundle {
|
||||||
val tl_in = node.bundleIn
|
val tl_in = node.bundleIn
|
||||||
@ -38,8 +36,6 @@ class ScratchpadSlavePort(implicit val p: Parameters) extends LazyModule with Ha
|
|||||||
val tl_in = io.tl_in(0)
|
val tl_in = io.tl_in(0)
|
||||||
val edge = node.edgesIn(0)
|
val edge = node.edgesIn(0)
|
||||||
|
|
||||||
require(usingDataScratchpad)
|
|
||||||
|
|
||||||
val s_ready :: s_wait :: s_replay :: s_grant :: Nil = Enum(UInt(), 4)
|
val s_ready :: s_wait :: s_replay :: s_grant :: Nil = Enum(UInt(), 4)
|
||||||
val state = Reg(init = s_ready)
|
val state = Reg(init = s_ready)
|
||||||
when (io.dmem.resp.valid) { state := s_grant }
|
when (io.dmem.resp.valid) { state := s_grant }
|
||||||
|
@ -40,7 +40,14 @@ class RocketTile(tileId: Int)(implicit p: Parameters) extends LazyModule {
|
|||||||
//TODO val intNode = IntInputNode()
|
//TODO val intNode = IntInputNode()
|
||||||
val slaveNode = if (p(DataScratchpadSize) == 0) None else Some(TLInputNode())
|
val slaveNode = if (p(DataScratchpadSize) == 0) None else Some(TLInputNode())
|
||||||
val scratch = if (p(DataScratchpadSize) == 0) None else Some(LazyModule(new ScratchpadSlavePort()(dcacheParams)))
|
val scratch = if (p(DataScratchpadSize) == 0) None else Some(LazyModule(new ScratchpadSlavePort()(dcacheParams)))
|
||||||
val dcache = HellaCache(p(DCacheKey))(dcacheParams)
|
def findScratch() = scratch.map { s =>
|
||||||
|
val finalNode = uncachedOut.edgesOut(0).manager.managers.find(_.nodePath.last == s.node)
|
||||||
|
require (finalNode.isDefined, "Could not find the scratch pad; not reachable via icache?")
|
||||||
|
require (finalNode.get.address.size == 1, "Scratchpad address space was fragmented!")
|
||||||
|
finalNode.get.address(0)
|
||||||
|
}
|
||||||
|
|
||||||
|
val dcache = HellaCache(p(DCacheKey), findScratch)(dcacheParams)
|
||||||
val ucLegacy = LazyModule(new TLLegacy()(icacheParams))
|
val ucLegacy = LazyModule(new TLLegacy()(icacheParams))
|
||||||
|
|
||||||
val cachedOut = TLOutputNode()
|
val cachedOut = TLOutputNode()
|
||||||
|
Loading…
Reference in New Issue
Block a user