cpu: Add support for scheduling multiple inst/load stop events
Currently, the only way to get a CPU to stop after a fixed number of instructions/loads is to set a property on the CPU that causes a SimLoopExitEvent to be scheduled when the CPU is constructed. This is clearly not ideal in cases where the simulation script wants the CPU to stop at multiple instruction counts (e.g., SimPoint generation). This changeset adds the methods scheduleInstStop() and scheduleLoadStop() to the BaseCPU. These methods are exported to Python and are designed to be used from the simulation script. By using these methods instead of the old properties, a simulation script can schedule a stop at any point during simulation or schedule multiple stops. The number of instructions specified when scheduling a stop is relative to the current point of execution.
This commit is contained in:
parent
247e4e9ab4
commit
0793d0727b
3 changed files with 57 additions and 12 deletions
|
@ -99,6 +99,8 @@ class BaseCPU(MemObject):
|
||||||
bool switchedOut();
|
bool switchedOut();
|
||||||
void flushTLBs();
|
void flushTLBs();
|
||||||
Counter totalInsts();
|
Counter totalInsts();
|
||||||
|
void scheduleInstStop(ThreadID tid, Counter insts, const char *cause);
|
||||||
|
void scheduleLoadStop(ThreadID tid, Counter loads, const char *cause);
|
||||||
''')
|
''')
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
|
|
|
@ -147,10 +147,8 @@ BaseCPU::BaseCPU(Params *p, bool is_checker)
|
||||||
//
|
//
|
||||||
if (p->max_insts_any_thread != 0) {
|
if (p->max_insts_any_thread != 0) {
|
||||||
const char *cause = "a thread reached the max instruction count";
|
const char *cause = "a thread reached the max instruction count";
|
||||||
for (ThreadID tid = 0; tid < numThreads; ++tid) {
|
for (ThreadID tid = 0; tid < numThreads; ++tid)
|
||||||
Event *event = new SimLoopExitEvent(cause, 0);
|
scheduleInstStop(tid, p->max_insts_any_thread, cause);
|
||||||
comInstEventQueue[tid]->schedule(event, p->max_insts_any_thread);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set up instruction-count-based termination events for SimPoints
|
// Set up instruction-count-based termination events for SimPoints
|
||||||
|
@ -159,10 +157,8 @@ BaseCPU::BaseCPU(Params *p, bool is_checker)
|
||||||
// exitting the simulation loop.
|
// exitting the simulation loop.
|
||||||
if (!p->simpoint_start_insts.empty()) {
|
if (!p->simpoint_start_insts.empty()) {
|
||||||
const char *cause = "simpoint starting point found";
|
const char *cause = "simpoint starting point found";
|
||||||
for (size_t i = 0; i < p->simpoint_start_insts.size(); ++i) {
|
for (size_t i = 0; i < p->simpoint_start_insts.size(); ++i)
|
||||||
Event *event = new SimLoopExitEvent(cause, 0);
|
scheduleInstStop(0, p->simpoint_start_insts[i], cause);
|
||||||
comInstEventQueue[0]->schedule(event, p->simpoint_start_insts[i]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (p->max_insts_all_threads != 0) {
|
if (p->max_insts_all_threads != 0) {
|
||||||
|
@ -189,10 +185,8 @@ BaseCPU::BaseCPU(Params *p, bool is_checker)
|
||||||
//
|
//
|
||||||
if (p->max_loads_any_thread != 0) {
|
if (p->max_loads_any_thread != 0) {
|
||||||
const char *cause = "a thread reached the max load count";
|
const char *cause = "a thread reached the max load count";
|
||||||
for (ThreadID tid = 0; tid < numThreads; ++tid) {
|
for (ThreadID tid = 0; tid < numThreads; ++tid)
|
||||||
Event *event = new SimLoopExitEvent(cause, 0);
|
scheduleLoadStop(tid, p->max_loads_any_thread, cause);
|
||||||
comLoadEventQueue[tid]->schedule(event, p->max_loads_any_thread);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (p->max_loads_all_threads != 0) {
|
if (p->max_loads_all_threads != 0) {
|
||||||
|
@ -571,6 +565,25 @@ BaseCPU::unserialize(Checkpoint *cp, const std::string §ion)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
BaseCPU::scheduleInstStop(ThreadID tid, Counter insts, const char *cause)
|
||||||
|
{
|
||||||
|
const Tick now(comInstEventQueue[tid]->getCurTick());
|
||||||
|
Event *event(new SimLoopExitEvent(cause, 0));
|
||||||
|
|
||||||
|
comInstEventQueue[tid]->schedule(event, now + insts);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
BaseCPU::scheduleLoadStop(ThreadID tid, Counter loads, const char *cause)
|
||||||
|
{
|
||||||
|
const Tick now(comLoadEventQueue[tid]->getCurTick());
|
||||||
|
Event *event(new SimLoopExitEvent(cause, 0));
|
||||||
|
|
||||||
|
comLoadEventQueue[tid]->schedule(event, now + loads);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
BaseCPU::traceFunctionsInternal(Addr pc)
|
BaseCPU::traceFunctionsInternal(Addr pc)
|
||||||
{
|
{
|
||||||
|
|
|
@ -395,6 +395,36 @@ class BaseCPU : public MemObject
|
||||||
|
|
||||||
virtual Counter totalOps() const = 0;
|
virtual Counter totalOps() const = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Schedule an event that exits the simulation loops after a
|
||||||
|
* predefined number of instructions.
|
||||||
|
*
|
||||||
|
* This method is usually called from the configuration script to
|
||||||
|
* get an exit event some time in the future. It is typically used
|
||||||
|
* when the script wants to simulate for a specific number of
|
||||||
|
* instructions rather than ticks.
|
||||||
|
*
|
||||||
|
* @param tid Thread monitor.
|
||||||
|
* @param insts Number of instructions into the future.
|
||||||
|
* @param cause Cause to signal in the exit event.
|
||||||
|
*/
|
||||||
|
void scheduleInstStop(ThreadID tid, Counter insts, const char *cause);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Schedule an event that exits the simulation loops after a
|
||||||
|
* predefined number of load operations.
|
||||||
|
*
|
||||||
|
* This method is usually called from the configuration script to
|
||||||
|
* get an exit event some time in the future. It is typically used
|
||||||
|
* when the script wants to simulate for a specific number of
|
||||||
|
* loads rather than ticks.
|
||||||
|
*
|
||||||
|
* @param tid Thread monitor.
|
||||||
|
* @param loads Number of load instructions into the future.
|
||||||
|
* @param cause Cause to signal in the exit event.
|
||||||
|
*/
|
||||||
|
void scheduleLoadStop(ThreadID tid, Counter loads, const char *cause);
|
||||||
|
|
||||||
// Function tracing
|
// Function tracing
|
||||||
private:
|
private:
|
||||||
bool functionTracingEnabled;
|
bool functionTracingEnabled;
|
||||||
|
|
Loading…
Reference in a new issue