diff --git a/src/mem/cache/prefetch/xs_stream.cc b/src/mem/cache/prefetch/xs_stream.cc index 7dba1b8b7c..01e2b45b76 100644 --- a/src/mem/cache/prefetch/xs_stream.cc +++ b/src/mem/cache/prefetch/xs_stream.cc @@ -93,19 +93,26 @@ XsStreamPrefetcher::streamLookup(const PrefetchInfo &pfi, bool &in_active_page, entry->bitVec |= region_bit_accessed; entry->cnt += 1; } + entry->hysteresis = true; return entry; } - entry = stream_array.findVictim(0); - in_active_page = (entry_plus_active || entry_min_active); decr = entry_plus != nullptr; - entry->tag = regionHashTag(vaddr_tag_num); - entry->decrMode = decr; - entry->bitVec = 1UL << vaddr_offset; - entry->cnt = 1; - entry->active = in_active_page; - stream_array.insertEntry(regionHashTag(vaddr_tag_num), secure, entry); - return entry; + // replace + entry = stream_array.findVictim(0); + if (entry->hysteresis){ + entry->hysteresis = false; + stream_array.insertEntry(entry->tag, entry->isSecure(), entry, false); + } else { + entry->tag = regionHashTag(vaddr_tag_num); + entry->decrMode = decr; + entry->bitVec = 1UL << vaddr_offset; + entry->cnt = 1; + entry->active = in_active_page; + entry->hysteresis = false; + stream_array.insertEntry(regionHashTag(vaddr_tag_num), secure, entry); + } + return nullptr; } void @@ -134,4 +141,4 @@ XsStreamPrefetcher::sendPFWithFilter(const PrefetchInfo &pfi, Addr addr, std::ve } -} \ No newline at end of file +} diff --git a/src/mem/cache/prefetch/xs_stream.hh b/src/mem/cache/prefetch/xs_stream.hh index f38cdb00da..2852f417ab 100644 --- a/src/mem/cache/prefetch/xs_stream.hh +++ b/src/mem/cache/prefetch/xs_stream.hh @@ -75,6 +75,7 @@ class XsStreamPrefetcher : public Queued bool active; int cnt; bool decrMode; + bool hysteresis = false; STREAMEntry() : TaggedEntry(), tag(0), bitVec(0), active(false), cnt(0), decrMode(false) {} }; AssociativeSet stream_array;