A couple of minor fixes.
1. Set CPU ID in all modes for the O3 CPU. 2. Use nextCycle() function to prevent phase drift in O3 CPU. 3. Remove assertion in rename map that is no longer true. src/cpu/o3/alpha/cpu_builder.cc: Allow for CPU id in all modes, not just full system. Also include a parameter that was left out by accident. src/cpu/o3/alpha/cpu_impl.hh: Set the CPU ID properly. src/cpu/o3/cpu.cc: src/cpu/o3/cpu.hh: Use nextCycle() function so that the CPU does not get out of phase when starting up from quiesces. src/cpu/o3/rename_map.cc: Remove assertion that is no longer true. tests/configs/o3-timing.py: Set CPU's id to 0. --HG-- extra : convert_revision : 2b69c19adfce2adcc2d1939e89d702bd6674d5d5
This commit is contained in:
parent
fdaff2b108
commit
55a45d3644
6 changed files with 22 additions and 18 deletions
|
@ -50,11 +50,11 @@ BEGIN_DECLARE_SIM_OBJECT_PARAMS(DerivO3CPU)
|
||||||
Param<int> clock;
|
Param<int> clock;
|
||||||
Param<int> phase;
|
Param<int> phase;
|
||||||
Param<int> numThreads;
|
Param<int> numThreads;
|
||||||
|
Param<int> cpu_id;
|
||||||
Param<int> activity;
|
Param<int> activity;
|
||||||
|
|
||||||
#if FULL_SYSTEM
|
#if FULL_SYSTEM
|
||||||
SimObjectParam<System *> system;
|
SimObjectParam<System *> system;
|
||||||
Param<int> cpu_id;
|
|
||||||
SimObjectParam<AlphaISA::ITB *> itb;
|
SimObjectParam<AlphaISA::ITB *> itb;
|
||||||
SimObjectParam<AlphaISA::DTB *> dtb;
|
SimObjectParam<AlphaISA::DTB *> dtb;
|
||||||
Param<Tick> profile;
|
Param<Tick> profile;
|
||||||
|
@ -161,11 +161,11 @@ BEGIN_INIT_SIM_OBJECT_PARAMS(DerivO3CPU)
|
||||||
INIT_PARAM(clock, "clock speed"),
|
INIT_PARAM(clock, "clock speed"),
|
||||||
INIT_PARAM_DFLT(phase, "clock phase", 0),
|
INIT_PARAM_DFLT(phase, "clock phase", 0),
|
||||||
INIT_PARAM(numThreads, "number of HW thread contexts"),
|
INIT_PARAM(numThreads, "number of HW thread contexts"),
|
||||||
|
INIT_PARAM(cpu_id, "processor ID"),
|
||||||
INIT_PARAM_DFLT(activity, "Initial activity count", 0),
|
INIT_PARAM_DFLT(activity, "Initial activity count", 0),
|
||||||
|
|
||||||
#if FULL_SYSTEM
|
#if FULL_SYSTEM
|
||||||
INIT_PARAM(system, "System object"),
|
INIT_PARAM(system, "System object"),
|
||||||
INIT_PARAM(cpu_id, "processor ID"),
|
|
||||||
INIT_PARAM(itb, "Instruction translation buffer"),
|
INIT_PARAM(itb, "Instruction translation buffer"),
|
||||||
INIT_PARAM(dtb, "Data translation buffer"),
|
INIT_PARAM(dtb, "Data translation buffer"),
|
||||||
INIT_PARAM(profile, ""),
|
INIT_PARAM(profile, ""),
|
||||||
|
@ -305,14 +305,15 @@ CREATE_SIM_OBJECT(DerivO3CPU)
|
||||||
AlphaSimpleParams *params = new AlphaSimpleParams;
|
AlphaSimpleParams *params = new AlphaSimpleParams;
|
||||||
|
|
||||||
params->clock = clock;
|
params->clock = clock;
|
||||||
|
params->phase = phase;
|
||||||
|
|
||||||
params->name = getInstanceName();
|
params->name = getInstanceName();
|
||||||
params->numberOfThreads = actual_num_threads;
|
params->numberOfThreads = actual_num_threads;
|
||||||
|
params->cpu_id = cpu_id;
|
||||||
params->activity = activity;
|
params->activity = activity;
|
||||||
|
|
||||||
#if FULL_SYSTEM
|
#if FULL_SYSTEM
|
||||||
params->system = system;
|
params->system = system;
|
||||||
params->cpu_id = cpu_id;
|
|
||||||
params->itb = itb;
|
params->itb = itb;
|
||||||
params->dtb = dtb;
|
params->dtb = dtb;
|
||||||
params->profile = profile;
|
params->profile = profile;
|
||||||
|
|
|
@ -114,6 +114,7 @@ AlphaO3CPU<Impl>::AlphaO3CPU(Params *params) : FullO3CPU<Impl>(params)
|
||||||
#endif
|
#endif
|
||||||
// Give the thread the TC.
|
// Give the thread the TC.
|
||||||
this->thread[i]->tc = tc;
|
this->thread[i]->tc = tc;
|
||||||
|
this->thread[i]->setCpuId(params->cpu_id);
|
||||||
|
|
||||||
// Add the TC to the CPU's list of TC's.
|
// Add the TC to the CPU's list of TC's.
|
||||||
this->threadContexts.push_back(tc);
|
this->threadContexts.push_back(tc);
|
||||||
|
|
|
@ -466,7 +466,7 @@ FullO3CPU<Impl>::tick()
|
||||||
lastRunningCycle = curTick;
|
lastRunningCycle = curTick;
|
||||||
timesIdled++;
|
timesIdled++;
|
||||||
} else {
|
} else {
|
||||||
tickEvent.schedule(curTick + cycles(1));
|
tickEvent.schedule(nextCycle(curTick + cycles(1)));
|
||||||
DPRINTF(O3CPU, "Scheduling next tick!\n");
|
DPRINTF(O3CPU, "Scheduling next tick!\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -880,7 +880,7 @@ FullO3CPU<Impl>::resume()
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!tickEvent.scheduled())
|
if (!tickEvent.scheduled())
|
||||||
tickEvent.schedule(curTick);
|
tickEvent.schedule(nextCycle());
|
||||||
_status = Running;
|
_status = Running;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -973,11 +973,11 @@ FullO3CPU<Impl>::takeOverFrom(BaseCPU *oldCPU)
|
||||||
ThreadContext *tc = threadContexts[i];
|
ThreadContext *tc = threadContexts[i];
|
||||||
if (tc->status() == ThreadContext::Active && _status != Running) {
|
if (tc->status() == ThreadContext::Active && _status != Running) {
|
||||||
_status = Running;
|
_status = Running;
|
||||||
tickEvent.schedule(curTick);
|
tickEvent.schedule(nextCycle());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!tickEvent.scheduled())
|
if (!tickEvent.scheduled())
|
||||||
tickEvent.schedule(curTick);
|
tickEvent.schedule(nextCycle());
|
||||||
|
|
||||||
Port *peer;
|
Port *peer;
|
||||||
Port *icachePort = fetch.getIcachePort();
|
Port *icachePort = fetch.getIcachePort();
|
||||||
|
@ -1406,7 +1406,7 @@ FullO3CPU<Impl>::wakeCPU()
|
||||||
|
|
||||||
idleCycles += (curTick - 1) - lastRunningCycle;
|
idleCycles += (curTick - 1) - lastRunningCycle;
|
||||||
|
|
||||||
tickEvent.schedule(curTick);
|
tickEvent.schedule(nextCycle());
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class Impl>
|
template <class Impl>
|
||||||
|
|
|
@ -146,9 +146,9 @@ class FullO3CPU : public BaseO3CPU
|
||||||
void scheduleTickEvent(int delay)
|
void scheduleTickEvent(int delay)
|
||||||
{
|
{
|
||||||
if (tickEvent.squashed())
|
if (tickEvent.squashed())
|
||||||
tickEvent.reschedule(curTick + cycles(delay));
|
tickEvent.reschedule(nextCycle(curTick + cycles(delay)));
|
||||||
else if (!tickEvent.scheduled())
|
else if (!tickEvent.scheduled())
|
||||||
tickEvent.schedule(curTick + cycles(delay));
|
tickEvent.schedule(nextCycle(curTick + cycles(delay)));
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Unschedule tick event, regardless of its current state. */
|
/** Unschedule tick event, regardless of its current state. */
|
||||||
|
@ -186,9 +186,11 @@ class FullO3CPU : public BaseO3CPU
|
||||||
{
|
{
|
||||||
// Schedule thread to activate, regardless of its current state.
|
// Schedule thread to activate, regardless of its current state.
|
||||||
if (activateThreadEvent[tid].squashed())
|
if (activateThreadEvent[tid].squashed())
|
||||||
activateThreadEvent[tid].reschedule(curTick + cycles(delay));
|
activateThreadEvent[tid].
|
||||||
|
reschedule(nextCycle(curTick + cycles(delay)));
|
||||||
else if (!activateThreadEvent[tid].scheduled())
|
else if (!activateThreadEvent[tid].scheduled())
|
||||||
activateThreadEvent[tid].schedule(curTick + cycles(delay));
|
activateThreadEvent[tid].
|
||||||
|
schedule(nextCycle(curTick + cycles(delay)));
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Unschedule actiavte thread event, regardless of its current state. */
|
/** Unschedule actiavte thread event, regardless of its current state. */
|
||||||
|
@ -235,9 +237,11 @@ class FullO3CPU : public BaseO3CPU
|
||||||
{
|
{
|
||||||
// Schedule thread to activate, regardless of its current state.
|
// Schedule thread to activate, regardless of its current state.
|
||||||
if (deallocateContextEvent[tid].squashed())
|
if (deallocateContextEvent[tid].squashed())
|
||||||
deallocateContextEvent[tid].reschedule(curTick + cycles(delay));
|
deallocateContextEvent[tid].
|
||||||
|
reschedule(nextCycle(curTick + cycles(delay)));
|
||||||
else if (!deallocateContextEvent[tid].scheduled())
|
else if (!deallocateContextEvent[tid].scheduled())
|
||||||
deallocateContextEvent[tid].schedule(curTick + cycles(delay));
|
deallocateContextEvent[tid].
|
||||||
|
schedule(nextCycle(curTick + cycles(delay)));
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Unschedule thread deallocation in CPU */
|
/** Unschedule thread deallocation in CPU */
|
||||||
|
|
|
@ -192,8 +192,6 @@ SimpleRenameMap::rename(RegIndex arch_reg)
|
||||||
// known that the prev reg was outside the range of normal registers
|
// known that the prev reg was outside the range of normal registers
|
||||||
// so the free list can avoid adding it.
|
// so the free list can avoid adding it.
|
||||||
prev_reg = renamed_reg;
|
prev_reg = renamed_reg;
|
||||||
|
|
||||||
assert(renamed_reg < numPhysicalRegs + numMiscRegs);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
DPRINTF(Rename, "Renamed reg %d to physical reg %d old mapping was %d\n",
|
DPRINTF(Rename, "Renamed reg %d to physical reg %d old mapping was %d\n",
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# Copyright (c) 2006 The Regents of The University of Michigan
|
# Copyright (c) 2006-2007 The Regents of The University of Michigan
|
||||||
# All rights reserved.
|
# All rights reserved.
|
||||||
#
|
#
|
||||||
# Redistribution and use in source and binary forms, with or without
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
@ -37,7 +37,7 @@ class MyCache(BaseCache):
|
||||||
mshrs = 10
|
mshrs = 10
|
||||||
tgts_per_mshr = 5
|
tgts_per_mshr = 5
|
||||||
|
|
||||||
cpu = DerivO3CPU()
|
cpu = DerivO3CPU(cpu_id=0)
|
||||||
cpu.addTwoLevelCacheHierarchy(MyCache(size = '128kB'), MyCache(size = '256kB'),
|
cpu.addTwoLevelCacheHierarchy(MyCache(size = '128kB'), MyCache(size = '256kB'),
|
||||||
MyCache(size = '2MB'))
|
MyCache(size = '2MB'))
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue