diff --git a/cpu/simple_cpu/simple_cpu.cc b/cpu/simple_cpu/simple_cpu.cc index d70f0ccfa..6c22d7c81 100644 --- a/cpu/simple_cpu/simple_cpu.cc +++ b/cpu/simple_cpu/simple_cpu.cc @@ -75,14 +75,17 @@ using namespace std; SimpleCPU::TickEvent::TickEvent(SimpleCPU *c) - : Event(&mainEventQueue, CPU_Tick_Pri), cpu(c) + : Event(&mainEventQueue, CPU_Tick_Pri), cpu(c), multiplier(1) { } void SimpleCPU::TickEvent::process() { - cpu->tick(); + int count = multiplier; + do { + cpu->tick(); + } while (--count > 0 && cpu->status() == Running); } const char * @@ -269,6 +272,11 @@ SimpleCPU::regStats() .desc("Number of memory references") ; + notIdleFraction + .name(name() + ".not_idle_fraction") + .desc("Percentage of non-idle cycles") + ; + idleFraction .name(name() + ".idle_fraction") .desc("Percentage of idle cycles") @@ -799,6 +807,7 @@ BEGIN_DECLARE_SIM_OBJECT_PARAMS(SimpleCPU) SimObjectParam dcache; Param defer_registration; + Param multiplier; END_DECLARE_SIM_OBJECT_PARAMS(SimpleCPU) @@ -830,7 +839,9 @@ BEGIN_INIT_SIM_OBJECT_PARAMS(SimpleCPU) INIT_PARAM_DFLT(icache, "L1 instruction cache object", NULL), INIT_PARAM_DFLT(dcache, "L1 data cache object", NULL), INIT_PARAM_DFLT(defer_registration, "defer registration with system " - "(for sampling)", false) + "(for sampling)", false), + + INIT_PARAM_DFLT(multiplier, "clock multiplier", 1) END_INIT_SIM_OBJECT_PARAMS(SimpleCPU) @@ -861,6 +872,8 @@ CREATE_SIM_OBJECT(SimpleCPU) #endif // FULL_SYSTEM + cpu->setTickMultiplier(multiplier); + return cpu; } diff --git a/cpu/simple_cpu/simple_cpu.hh b/cpu/simple_cpu/simple_cpu.hh index 3692ab511..6ab231e7e 100644 --- a/cpu/simple_cpu/simple_cpu.hh +++ b/cpu/simple_cpu/simple_cpu.hh @@ -68,12 +68,11 @@ class SimpleCPU : public BaseCPU void tick(); private: - class TickEvent : public Event + struct TickEvent : public Event { - private: SimpleCPU *cpu; + int multiplier; - public: TickEvent(SimpleCPU *c); void process(); const char *description(); @@ -97,6 +96,12 @@ class SimpleCPU : public BaseCPU tickEvent.squash(); } + public: + void setTickMultiplier(int multiplier) + { + tickEvent.multiplier = multiplier; + } + private: Trace::InstRecord *traceData; template