bool &snoop)
{
otherPort->getPeerAddressRanges(resp, snoop);
+ // we don't allow snooping across bridges
+ snoop = false;
}
- BEGIN_DECLARE_SIM_OBJECT_PARAMS(Bridge)
-
- Param<int> req_size_a;
- Param<int> req_size_b;
- Param<int> resp_size_a;
- Param<int> resp_size_b;
- Param<Tick> delay;
- Param<Tick> nack_delay;
- Param<bool> write_ack;
- Param<bool> fix_partial_write_a;
- Param<bool> fix_partial_write_b;
-
- END_DECLARE_SIM_OBJECT_PARAMS(Bridge)
-
- BEGIN_INIT_SIM_OBJECT_PARAMS(Bridge)
-
- INIT_PARAM(req_size_a, "The size of the queue for requests coming into side a"),
- INIT_PARAM(req_size_b, "The size of the queue for requests coming into side b"),
- INIT_PARAM(resp_size_a, "The size of the queue for responses coming into side a"),
- INIT_PARAM(resp_size_b, "The size of the queue for responses coming into side b"),
- INIT_PARAM(delay, "The miminum delay to cross this bridge"),
- INIT_PARAM(nack_delay, "The minimum delay to nack a packet"),
- INIT_PARAM(write_ack, "Acknowledge any writes that are received."),
- INIT_PARAM(fix_partial_write_a, "Fixup any partial block writes that are received"),
- INIT_PARAM(fix_partial_write_b, "Fixup any partial block writes that are received")
-
- END_INIT_SIM_OBJECT_PARAMS(Bridge)
-
- CREATE_SIM_OBJECT(Bridge)
+ Bridge *
+ BridgeParams::create()
{
- Bridge::Params *p = new Bridge::Params;
- p->name = getInstanceName();
- p->req_size_a = req_size_a;
- p->req_size_b = req_size_b;
- p->resp_size_a = resp_size_a;
- p->resp_size_b = resp_size_b;
- p->delay = delay;
- p->nack_delay = nack_delay;
- p->write_ack = write_ack;
- p->fix_partial_write_a = fix_partial_write_a;
- p->fix_partial_write_b = fix_partial_write_b;
- return new Bridge(p);
+ return new Bridge(this);
}
-
- REGISTER_SIM_OBJECT("Bridge", Bridge)
-
-
#include "mem/cache/base_cache.hh"
#include "mem/cache/cache.hh"
#include "mem/bus.hh"
- #include "sim/builder.hh"
-#include "mem/cache/coherence/coherence_protocol.hh"
+ #include "params/BaseCache.hh"
// Tag Templates
#if defined(USE_CACHE_LRU)
using namespace std;
using namespace TheISA;
- #ifndef DOXYGEN_SHOULD_SKIP_THIS
-
- BEGIN_DECLARE_SIM_OBJECT_PARAMS(BaseCache)
-
- Param<int> size;
- Param<int> assoc;
- Param<int> block_size;
- Param<int> latency;
- Param<int> mshrs;
- Param<int> tgts_per_mshr;
- Param<int> write_buffers;
- Param<bool> prioritizeRequests;
- Param<Addr> trace_addr;
- Param<int> hash_delay;
- #if defined(USE_CACHE_IIC)
- SimObjectParam<Repl *> repl;
- #endif
- Param<int> subblock_size;
- Param<Counter> max_miss_count;
- VectorParam<Range<Addr> > addr_range;
- // SimObjectParam<MemTraceWriter *> mem_trace;
- Param<bool> split;
- Param<int> split_size;
- Param<bool> lifo;
- Param<bool> two_queue;
- Param<bool> prefetch_miss;
- Param<bool> prefetch_access;
- Param<int> prefetcher_size;
- Param<bool> prefetch_past_page;
- Param<bool> prefetch_serial_squash;
- Param<Tick> prefetch_latency;
- Param<int> prefetch_degree;
- Param<string> prefetch_policy;
- Param<bool> prefetch_cache_check_push;
- Param<bool> prefetch_use_cpu_id;
- Param<bool> prefetch_data_accesses_only;
-
- END_DECLARE_SIM_OBJECT_PARAMS(BaseCache)
-
-
- BEGIN_INIT_SIM_OBJECT_PARAMS(BaseCache)
-
- INIT_PARAM(size, "capacity in bytes"),
- INIT_PARAM(assoc, "associativity"),
- INIT_PARAM(block_size, "block size in bytes"),
- INIT_PARAM(latency, "hit latency in CPU cycles"),
- INIT_PARAM(mshrs, "number of MSHRs (max outstanding requests)"),
- INIT_PARAM(tgts_per_mshr, "max number of accesses per MSHR"),
- INIT_PARAM_DFLT(write_buffers, "number of write buffers", 8),
- INIT_PARAM_DFLT(prioritizeRequests, "always service demand misses first",
- false),
- INIT_PARAM_DFLT(trace_addr, "address to trace", 0),
-
- INIT_PARAM_DFLT(hash_delay, "time in cycles of hash access",1),
- #if defined(USE_CACHE_IIC)
- INIT_PARAM_DFLT(repl, "replacement policy",NULL),
- #endif
- INIT_PARAM_DFLT(subblock_size,
- "Size of subblock in IIC used for compression",
- 0),
- INIT_PARAM_DFLT(max_miss_count,
- "The number of misses to handle before calling exit",
- 0),
- INIT_PARAM_DFLT(addr_range, "The address range in bytes",
- vector<Range<Addr> >(1,RangeIn((Addr)0, MaxAddr))),
- // INIT_PARAM_DFLT(mem_trace, "Memory trace to write accesses to", NULL),
- INIT_PARAM_DFLT(split, "Whether this is a partitioned cache", false),
- INIT_PARAM_DFLT(split_size, "the number of \"ways\" belonging to the LRU partition", 0),
- INIT_PARAM_DFLT(lifo, "whether you are using a LIFO repl. policy", false),
- INIT_PARAM_DFLT(two_queue, "whether the lifo should have two queue replacement", false),
- INIT_PARAM_DFLT(prefetch_miss, "wheter you are using the hardware prefetcher from Miss stream", false),
- INIT_PARAM_DFLT(prefetch_access, "wheter you are using the hardware prefetcher from Access stream", false),
- INIT_PARAM_DFLT(prefetcher_size, "Number of entries in the harware prefetch queue", 100),
- INIT_PARAM_DFLT(prefetch_past_page, "Allow prefetches to cross virtual page boundaries", false),
- INIT_PARAM_DFLT(prefetch_serial_squash, "Squash prefetches with a later time on a subsequent miss", false),
- INIT_PARAM_DFLT(prefetch_latency, "Latency of the prefetcher", 10),
- INIT_PARAM_DFLT(prefetch_degree, "Degree of the prefetch depth", 1),
- INIT_PARAM_DFLT(prefetch_policy, "Type of prefetcher to use", "none"),
- INIT_PARAM_DFLT(prefetch_cache_check_push, "Check if in cash on push or pop of prefetch queue", true),
- INIT_PARAM_DFLT(prefetch_use_cpu_id, "Use the CPU ID to seperate calculations of prefetches", true),
- INIT_PARAM_DFLT(prefetch_data_accesses_only, "Only prefetch on data not on instruction accesses", false)
- END_INIT_SIM_OBJECT_PARAMS(BaseCache)
-
-
-#define BUILD_CACHE(TAGS, tags, c) \
+#define BUILD_CACHE(TAGS, tags) \
do { \
- BasePrefetcher *pf; \
- if (pf_policy == "tagged") { \
+ BasePrefetcher *pf; \
+ if (prefetch_policy == Enums::tagged) { \
BUILD_TAGGED_PREFETCHER(TAGS); \
} \
- else if (pf_policy == "stride") { \
+ else if (prefetch_policy == Enums::stride) { \
BUILD_STRIDED_PREFETCHER(TAGS); \
} \
- else if (pf_policy == "ghb") { \
+ else if (prefetch_policy == Enums::ghb) { \
BUILD_GHB_PREFETCHER(TAGS); \
} \
else { \
BUILD_NULL_PREFETCHER(TAGS); \
} \
- Cache<TAGS, c>::Params params(tags, mq, coh, base_params, \
- pf, prefetch_access, latency, \
- true, \
- store_compressed, \
- adaptive_compression, \
- compressed_bus, \
- compAlg, compression_latency, \
- prefetch_miss); \
- Cache<TAGS, c> *retval = \
- new Cache<TAGS, c>(name, params); \
+ Cache<TAGS>::Params params(tags, base_params, \
+ pf, prefetch_access, latency, \
+ true, \
+ prefetch_miss); \
+ Cache<TAGS> *retval = \
- new Cache<TAGS>(getInstanceName(), params); \
++ new Cache<TAGS>(name, params); \
return retval; \
} while (0)
}
// Build BaseCache param object
- BaseCache::Params base_params(addr_range, latency,
- block_size, max_miss_count);
+ BaseCache::Params base_params(latency, block_size,
+ mshrs, tgts_per_mshr, write_buffers,
+ max_miss_count);
//Warnings about prefetcher policy
- if (pf_policy == "none" && (prefetch_miss || prefetch_access)) {
- panic("With no prefetcher, you shouldn't prefetch from"
- " either miss or access stream\n");
+ if (prefetch_policy == Enums::none) {
+ if (prefetch_miss || prefetch_access)
+ panic("With no prefetcher, you shouldn't prefetch from"
+ " either miss or access stream\n");
}
- if ((pf_policy == "tagged" || pf_policy == "stride" ||
- pf_policy == "ghb") && !(prefetch_miss || prefetch_access)) {
- warn("With this prefetcher you should chose a prefetch"
- " stream (miss or access)\nNo Prefetching will occur\n");
- }
- if ((pf_policy == "tagged" || pf_policy == "stride" ||
- pf_policy == "ghb") && prefetch_miss && prefetch_access) {
- panic("Can't do prefetches from both miss and access"
- " stream\n");
- }
- if (pf_policy != "tagged" && pf_policy != "stride" &&
- pf_policy != "ghb" && pf_policy != "none") {
- panic("Unrecognized form of a prefetcher: %s, try using"
- "['none','stride','tagged','ghb']\n", pf_policy);
+
+ if (prefetch_policy == Enums::tagged || prefetch_policy == Enums::stride ||
+ prefetch_policy == Enums::ghb) {
+
+ if (!prefetch_miss && !prefetch_access)
+ warn("With this prefetcher you should chose a prefetch"
+ " stream (miss or access)\nNo Prefetching will occur\n");
+
+ if (prefetch_miss && prefetch_access)
+ panic("Can't do prefetches from both miss and access stream");
}
#if defined(USE_CACHE_IIC)
const void *repl = NULL;
#endif
- if (mshrs == 1 /*|| out_bus->doEvents() == false*/) {
- BlockingBuffer *mq = new BlockingBuffer(true);
- BUILD_COHERENCE(BlockingBuffer);
- } else {
- MissQueue *mq = new MissQueue(mshrs, tgts_per_mshr, write_buffers,
- true, prefetch_miss);
- BUILD_COHERENCE(MissQueue);
- }
+ BUILD_CACHES;
return NULL;
}
-
- REGISTER_SIM_OBJECT("BaseCache", BaseCache)
-
-
- #endif //DOXYGEN_SHOULD_SKIP_THIS