Add a clock multiplier for simple CPU so that it is possible
to do multiple instructions per cycle. --HG-- extra : convert_revision : 5588ae38071f170792aad93899fef6842b7d818d
This commit is contained in:
parent
5c20353129
commit
bc5c52335c
2 changed files with 24 additions and 6 deletions
|
@ -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<BaseMem *> dcache;
|
||||
|
||||
Param<bool> defer_registration;
|
||||
Param<int> 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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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<typename T>
|
||||
|
|
Loading…
Reference in a new issue