rocket: only cache when AcquireT is possible
This commit is contained in:
parent
37406706b4
commit
1867a5b226
@ -381,7 +381,7 @@ class DCacheModule(outer: DCache) extends HellaCacheModule(outer) {
|
|||||||
val access_address = s2_req.addr
|
val access_address = s2_req.addr
|
||||||
val a_size = mtSize(s2_req.typ)
|
val a_size = mtSize(s2_req.typ)
|
||||||
val a_data = Fill(beatWords, pstore1_data)
|
val a_data = Fill(beatWords, pstore1_data)
|
||||||
val acquire = if (edge.manager.anySupportAcquireB) {
|
val acquire = if (edge.manager.anySupportAcquireT) {
|
||||||
edge.AcquireBlock(UInt(0), acquire_address, lgCacheBlockBytes, s2_grow_param)._2 // Cacheability checked by tlb
|
edge.AcquireBlock(UInt(0), acquire_address, lgCacheBlockBytes, s2_grow_param)._2 // Cacheability checked by tlb
|
||||||
} else {
|
} else {
|
||||||
Wire(new TLBundleA(edge.bundle))
|
Wire(new TLBundleA(edge.bundle))
|
||||||
@ -583,7 +583,7 @@ class DCacheModule(outer: DCache) extends HellaCacheModule(outer) {
|
|||||||
when (releaseDone) { release_state := s_probe_write_meta }
|
when (releaseDone) { release_state := s_probe_write_meta }
|
||||||
}
|
}
|
||||||
when (release_state.isOneOf(s_voluntary_writeback, s_voluntary_write_meta)) {
|
when (release_state.isOneOf(s_voluntary_writeback, s_voluntary_write_meta)) {
|
||||||
if (edge.manager.anySupportAcquireB)
|
if (edge.manager.anySupportAcquireT)
|
||||||
tl_out_c.bits := edge.Release(fromSource = 0.U,
|
tl_out_c.bits := edge.Release(fromSource = 0.U,
|
||||||
toAddress = 0.U,
|
toAddress = 0.U,
|
||||||
lgSize = lgCacheBlockBytes,
|
lgSize = lgCacheBlockBytes,
|
||||||
@ -696,7 +696,7 @@ class DCacheModule(outer: DCache) extends HellaCacheModule(outer) {
|
|||||||
metaArb.io.in(5).bits.way_en := ~UInt(0, nWays)
|
metaArb.io.in(5).bits.way_en := ~UInt(0, nWays)
|
||||||
metaArb.io.in(5).bits.data := metaArb.io.in(4).bits.data
|
metaArb.io.in(5).bits.data := metaArb.io.in(4).bits.data
|
||||||
// Only flush D$ on FENCE.I if some cached executable regions are untracked.
|
// Only flush D$ on FENCE.I if some cached executable regions are untracked.
|
||||||
if (!edge.manager.managers.forall(m => !m.supportsAcquireB || !m.executable || m.regionType >= RegionType.TRACKED)) {
|
if (!edge.manager.managers.forall(m => !m.supportsAcquireT || !m.executable || m.regionType >= RegionType.TRACKED)) {
|
||||||
when (tl_out_a.fire() && !s2_uncached) { flushed := false }
|
when (tl_out_a.fire() && !s2_uncached) { flushed := false }
|
||||||
when (flushing) {
|
when (flushing) {
|
||||||
s1_victim_way := flushCounter >> log2Up(nSets)
|
s1_victim_way := flushCounter >> log2Up(nSets)
|
||||||
|
@ -112,7 +112,7 @@ class TLB(instruction: Boolean, lgMaxSize: Int, nEntries: Int)(implicit edge: TL
|
|||||||
val legal_address = edge.manager.findSafe(mpu_physaddr).reduce(_||_)
|
val legal_address = edge.manager.findSafe(mpu_physaddr).reduce(_||_)
|
||||||
def fastCheck(member: TLManagerParameters => Boolean) =
|
def fastCheck(member: TLManagerParameters => Boolean) =
|
||||||
legal_address && edge.manager.fastProperty(mpu_physaddr, member, (b:Boolean) => Bool(b))
|
legal_address && edge.manager.fastProperty(mpu_physaddr, member, (b:Boolean) => Bool(b))
|
||||||
val cacheable = fastCheck(_.supportsAcquireB) && (instruction || !usingDataScratchpad)
|
val cacheable = fastCheck(_.supportsAcquireT) && (instruction || !usingDataScratchpad)
|
||||||
val homogeneous = TLBPageLookup(edge.manager.managers, xLen, p(CacheBlockBytes), BigInt(1) << pgIdxBits)(mpu_physaddr).homogeneous
|
val homogeneous = TLBPageLookup(edge.manager.managers, xLen, p(CacheBlockBytes), BigInt(1) << pgIdxBits)(mpu_physaddr).homogeneous
|
||||||
val prot_r = fastCheck(_.supportsGet) && pmp.io.r
|
val prot_r = fastCheck(_.supportsGet) && pmp.io.r
|
||||||
val prot_w = fastCheck(_.supportsPutFull) && pmp.io.w
|
val prot_w = fastCheck(_.supportsPutFull) && pmp.io.w
|
||||||
|
@ -46,7 +46,6 @@ object TLBPageLookup
|
|||||||
require (!m.supportsAcquireT || m.supportsAcquireT .contains(xferSizes), s"MemoryMap region ${m.name} only supports ${m.supportsAcquireT} AcquireT, but must support ${xferSizes}")
|
require (!m.supportsAcquireT || m.supportsAcquireT .contains(xferSizes), s"MemoryMap region ${m.name} only supports ${m.supportsAcquireT} AcquireT, but must support ${xferSizes}")
|
||||||
require (!m.supportsLogical || m.supportsLogical .contains(amoSizes), s"MemoryMap region ${m.name} only supports ${m.supportsLogical} Logical, but must support ${amoSizes}")
|
require (!m.supportsLogical || m.supportsLogical .contains(amoSizes), s"MemoryMap region ${m.name} only supports ${m.supportsLogical} Logical, but must support ${amoSizes}")
|
||||||
require (!m.supportsArithmetic || m.supportsArithmetic.contains(amoSizes), s"MemoryMap region ${m.name} only supports ${m.supportsArithmetic} Arithmetic, but must support ${amoSizes}")
|
require (!m.supportsArithmetic || m.supportsArithmetic.contains(amoSizes), s"MemoryMap region ${m.name} only supports ${m.supportsArithmetic} Arithmetic, but must support ${amoSizes}")
|
||||||
require (m.supportsAcquireT || !m.supportsAcquireB, s"MemoryMap region ${m.name} supports AcquireB (cached read) but not AcquireT (cached write)... and rocket assumes this")
|
|
||||||
|
|
||||||
(m.address, TLBFixedPermissions(
|
(m.address, TLBFixedPermissions(
|
||||||
e = Seq(RegionType.PUT_EFFECTS, RegionType.GET_EFFECTS) contains m.regionType,
|
e = Seq(RegionType.PUT_EFFECTS, RegionType.GET_EFFECTS) contains m.regionType,
|
||||||
|
@ -19,9 +19,9 @@ class TLCacheCork(unsafe: Boolean = false)(implicit p: Parameters) extends LazyM
|
|||||||
managerFn = { case mp =>
|
managerFn = { case mp =>
|
||||||
mp.copy(
|
mp.copy(
|
||||||
endSinkId = 1,
|
endSinkId = 1,
|
||||||
managers = mp.managers.map { m => m.copy( // Rocket requires m.supportsAcquireT || !m.supportsAcquireB, so, don't cache ROMs
|
managers = mp.managers.map { m => m.copy(
|
||||||
supportsAcquireB = if (m.regionType == RegionType.UNCACHED && m.supportsPutFull) m.supportsGet else m.supportsAcquireB,
|
supportsAcquireB = if (m.regionType == RegionType.UNCACHED) m.supportsGet else m.supportsAcquireB,
|
||||||
supportsAcquireT = if (m.regionType == RegionType.UNCACHED) m.supportsPutFull else m.supportsAcquireT)})})
|
supportsAcquireT = if (m.regionType == RegionType.UNCACHED) m.supportsPutFull else m.supportsAcquireT)})})
|
||||||
|
|
||||||
lazy val module = new LazyModuleImp(this) {
|
lazy val module = new LazyModuleImp(this) {
|
||||||
(node.in zip node.out) foreach { case ((in, edgeIn), (out, edgeOut)) =>
|
(node.in zip node.out) foreach { case ((in, edgeIn), (out, edgeOut)) =>
|
||||||
|
Loading…
Reference in New Issue
Block a user