1
0

you can 'hit' with putblocks even when the tag doesn't match but you still better writeback

This commit is contained in:
Henry Cook 2015-03-18 19:32:46 -07:00
parent fb8071c12d
commit b92ea60891

View File

@ -859,7 +859,7 @@ class L2AcquireTracker(trackerId: Int, bankId: Int) extends L2XactTracker {
val _tag_match = io.meta.resp.bits.tag_match val _tag_match = io.meta.resp.bits.tag_match
val _is_hit = (if(isLastLevelCache) val _is_hit = (if(isLastLevelCache)
(xact.isBuiltInType(Acquire.putBlockType) || (xact.isBuiltInType(Acquire.putBlockType) ||
_coh.outer.isValid()) _tag_match && _coh.outer.isValid())
else (_tag_match && _coh.outer.isHit(xact.op_code()))) else (_tag_match && _coh.outer.isHit(xact.op_code())))
val _needs_writeback = !_tag_match && do_allocate && val _needs_writeback = !_tag_match && do_allocate &&
@ -871,17 +871,23 @@ class L2AcquireTracker(trackerId: Int, bankId: Int) extends L2XactTracker {
pending_probes := mask_incoherent pending_probes := mask_incoherent
release_count := PopCount(mask_incoherent) release_count := PopCount(mask_incoherent)
} }
state := Mux(!_tag_match, state := Mux(_needs_writeback, s_wb_req,
Mux(_needs_writeback, s_wb_req, s_outer_acquire),
Mux(_needs_inner_probes, s_inner_probe, Mux(_needs_inner_probes, s_inner_probe,
Mux(!is_hit, s_outer_acquire, Mux(!_is_hit, s_outer_acquire,
Mux(pending_reads.orR, s_data_read, Mux(pending_reads.orR, s_data_read,
Mux(!pending_writes.orR, s_inner_grant, Mux(!pending_writes.orR, s_inner_grant,
Mux(needs_more_put_data, s_wait_puts, s_data_write)))))) Mux(needs_more_put_data, s_wait_puts, s_data_write))))))
} }
} }
is(s_wb_req) { when(io.wb.req.ready) { state := s_wb_resp } } is(s_wb_req) { when(io.wb.req.ready) { state := s_wb_resp } }
is(s_wb_resp) { when(io.wb.resp.valid) { state := s_outer_acquire } } is(s_wb_resp) {
when(io.wb.resp.valid) {
state := Mux(!is_hit, s_outer_acquire,
Mux(pending_reads.orR, s_data_read,
Mux(!pending_writes.orR, s_inner_grant,
Mux(needs_more_put_data, s_wait_puts, s_data_write))))
}
}
is(s_inner_probe) { is(s_inner_probe) {
// Send probes // Send probes
when(io.inner.probe.ready) { when(io.inner.probe.ready) {