diff --git a/src/mem/XBar.py b/src/mem/XBar.py index a445b5e37..8614519b3 100644 --- a/src/mem/XBar.py +++ b/src/mem/XBar.py @@ -112,6 +112,9 @@ class SnoopFilter(SimObject): system = Param.System(Parent.any, "System that the crossbar belongs to.") + # Sanity check on max capacity to track, adjust if needed. + max_capacity = Param.MemorySize('8MB', "Maximum capacity of snoop filter") + # We use a coherent crossbar to connect multiple masters to the L2 # caches. Normally this crossbar would be part of the cache itself. class L2XBar(CoherentXBar): @@ -125,6 +128,11 @@ class L2XBar(CoherentXBar): response_latency = 1 snoop_response_latency = 1 + # Use a snoop-filter by default, and set the latency to zero as + # the lookup is assumed to overlap with the frontend latency of + # the crossbar + snoop_filter = SnoopFilter(lookup_latency = 0) + # One of the key coherent crossbar instances is the system # interconnect, tying together the CPU clusters, GPUs, and any I/O # coherent masters, and DRAM controllers. diff --git a/src/mem/snoop_filter.cc b/src/mem/snoop_filter.cc index f6e6ef1b4..9b005cbc5 100755 --- a/src/mem/snoop_filter.cc +++ b/src/mem/snoop_filter.cc @@ -184,6 +184,10 @@ SnoopFilter::lookupSnoop(const Packet* cpkt) auto sf_it = cachedLocations.find(line_addr); bool is_hit = (sf_it != cachedLocations.end()); + panic_if(!is_hit && (cachedLocations.size() >= maxEntryCount), + "snoop filter exceeded capacity of %d cache blocks\n", + maxEntryCount); + // If the snoop filter has no entry and its an uncacheable // request, do not create a new snoop filter entry, simply return // a NULL portlist. diff --git a/src/mem/snoop_filter.hh b/src/mem/snoop_filter.hh index b1e33dc8f..be3018e6e 100755 --- a/src/mem/snoop_filter.hh +++ b/src/mem/snoop_filter.hh @@ -90,7 +90,8 @@ class SnoopFilter : public SimObject { SnoopFilter (const SnoopFilterParams *p) : SimObject(p), reqLookupResult(cachedLocations.end()), retryItem{0, 0}, - linesize(p->system->cacheLineSize()), lookupLatency(p->lookup_latency) + linesize(p->system->cacheLineSize()), lookupLatency(p->lookup_latency), + maxEntryCount(p->max_capacity / p->system->cacheLineSize()) { } @@ -254,6 +255,8 @@ class SnoopFilter : public SimObject { const unsigned linesize; /** Latency for doing a lookup in the filter */ const Cycles lookupLatency; + /** Max capacity in terms of cache blocks tracked, for sanity checking */ + const unsigned maxEntryCount; /** Statistics */ Stats::Scalar totRequests;