54#include "debug/Activity.hh"
55#include "debug/Drain.hh"
56#include "debug/O3CPU.hh"
57#include "debug/Quiesce.hh"
58#include "enums/MemoryMode.hh"
77 threadExitEvent([
this] { exitThreads(); },
"O3CPU exit threads",
false,
82 removeInstsThisCycle(
false),
91 regFile(params.numPhysIntRegs, params.numPhysFloatRegs,
92 params.numPhysVecRegs, params.numPhysVecPredRegs,
93 params.numPhysMatRegs, params.numPhysCCRegs,
94 params.isa[0]->regClasses()),
96 freeList(
name() +
".freelist", ®File),
100 scoreboard(
name() +
".scoreboard", regFile.totalNumPhysRegs()),
102 isa(numThreads, NULL),
104 timeBuffer(params.backComSize, params.forwardComSize),
105 fetchQueue(params.backComSize, params.forwardComSize),
106 decodeQueue(params.backComSize, params.forwardComSize),
107 renameQueue(params.backComSize, params.forwardComSize),
108 iewQueue(params.backComSize, params.forwardComSize),
109 activityRec(
name(), NumStages,
110 params.backComSize + params.forwardComSize, params.activity),
115 lastRunningCycle(curCycle()),
119 "SMT is not supported in O3 in full system mode currently.");
122 "More workload items (%d) than threads (%d) on CPU %s.",
123 params.workload.size(), params.numThreads,
name());
125 if (!params.switched_out) {
128 _status = SwitchedOut;
131 if (params.checker) {
132 BaseCPU *temp_checker = params.checker;
135 checker->setSystem(params.system);
141 thread.resize(numThreads);
142 tids.resize(numThreads);
150 bac.setActiveThreads(&activeThreads);
151 fetch.setActiveThreads(&activeThreads);
152 decode.setActiveThreads(&activeThreads);
153 rename.setActiveThreads(&activeThreads);
154 iew.setActiveThreads(&activeThreads);
155 commit.setActiveThreads(&activeThreads);
158 bac.setTimeBuffer(&timeBuffer);
159 fetch.setTimeBuffer(&timeBuffer);
160 decode.setTimeBuffer(&timeBuffer);
161 rename.setTimeBuffer(&timeBuffer);
162 iew.setTimeBuffer(&timeBuffer);
163 commit.setTimeBuffer(&timeBuffer);
166 bac.setFetchTargetQueue(&ftq);
167 fetch.setBACandFTQPtr(&bac, &ftq);
168 fetch.setFetchQueue(&fetchQueue);
169 decode.setFetchQueue(&fetchQueue);
170 commit.setFetchQueue(&fetchQueue);
171 decode.setDecodeQueue(&decodeQueue);
172 rename.setDecodeQueue(&decodeQueue);
173 rename.setRenameQueue(&renameQueue);
174 iew.setRenameQueue(&renameQueue);
175 iew.setIEWQueue(&iewQueue);
176 commit.setIEWQueue(&iewQueue);
177 commit.setRenameQueue(&renameQueue);
179 commit.setIEWStage(&iew);
180 rename.setIEWStage(&iew);
181 rename.setCommitStage(&commit);
187 active_threads = params.workload.size();
190 panic(
"Workload Size too large. Increase the 'MaxThreads' "
191 "constant in cpu/o3/limits.hh or edit your workload size.");
197 const auto ®Classes = params.isa[0]->regClasses();
200 numThreads * regClasses.at(
IntRegClass)->numRegs() &&
202 "Not enough physical registers, consider increasing "
207 "Not enough physical registers, consider increasing "
208 "numPhysFloatRegs\n");
210 numThreads * regClasses.at(
VecRegClass)->numRegs() &&
212 "Not enough physical registers, consider increasing "
214 panic_if(params.numPhysVecPredRegs <=
217 "Not enough physical registers, consider increasing "
218 "numPhysVecPredRegs\n");
220 numThreads * regClasses.at(
MatRegClass)->numRegs() &&
222 "Not enough physical registers, consider increasing "
225 numThreads * regClasses.at(
CCRegClass)->numRegs() &&
227 "Not enough physical registers, consider increasing "
233 params.numPhysCCRegs != 0,
234 "Non-zero number of physical CC regs specified, even though\n"
235 " ISA does not use them.");
237 rename.setScoreboard(&scoreboard);
238 iew.setScoreboard(&scoreboard);
241 for (
ThreadID tid = 0; tid < numThreads; tid++) {
242 isa[tid] = params.isa[tid];
243 commitRenameMap[tid].init(regClasses, ®File, &freeList);
244 renameMap[tid].init(regClasses, ®File, &freeList);
249 for (
ThreadID tid = 0; tid < active_threads; tid++) {
252 for (
auto &
id: *regClasses.at(
type)) {
256 renameMap[tid].setEntry(
id, phys_reg);
257 commitRenameMap[tid].setEntry(
id, phys_reg);
262 rename.setRenameMap(renameMap);
263 commit.setRenameMap(commitRenameMap);
264 rename.setFreeList(&freeList);
269 lastActivatedCycle = 0;
271 DPRINTF(O3CPU,
"Creating O3CPU object.\n");
274 thread.resize(numThreads);
276 for (
ThreadID tid = 0; tid < numThreads; ++tid) {
279 assert(numThreads == 1);
282 if (tid < params.workload.size()) {
283 DPRINTF(O3CPU,
"Workload[%i] process is %#x", tid,
285 thread[tid] =
new ThreadState(
this, tid, params.workload[tid]);
289 Process* dummy_proc = NULL;
291 thread[tid] =
new ThreadState(
this, tid, dummy_proc);
295 gem5::ThreadContext *tc;
304 if (params.checker) {
305 tc =
new CheckerThreadContext<ThreadContext>(o3_tc, checker);
309 o3_tc->thread = thread[tid];
312 thread[tid]->tc = tc;
315 threadContexts.push_back(tc);
319 if (!params.switched_out && interrupts.empty()) {
320 fatal(
"O3CPU %s has no interrupt controller.\n"
321 "Ensure createInterruptController() is called.\n",
name());
336 ftq.regProbePoints();
337 bac.regProbePoints();
338 fetch.regProbePoints();
340 iew.regProbePoints();
347 "Number of times that the entire CPU went into an idle state "
348 "and unscheduled itself"),
350 "Total number of cycles that the CPU has spent unscheduled due "
353 "Total number of cycles that CPU has spent quiesced or waiting "
370 DPRINTF(O3CPU,
"\n\nO3CPU: Ticking main, O3CPU.\n");
408 DPRINTF(O3CPU,
"Switched out!\n");
417 DPRINTF(O3CPU,
"Scheduling next tick!\n");
435 thread[tid]->noSquashFromTC =
true;
440 thread[tid]->noSquashFromTC =
false;
451 fetch.startupStage();
461 auto active_it = std::find(
464 DPRINTF(O3CPU,
"[tid:%i] Calling activate thread.\n", tid);
468 DPRINTF(O3CPU,
"[tid:%i] Adding to active threads list\n", tid);
479 assert(!
commit.executingHtmTransaction(tid));
482 auto active_it = std::find(
485 DPRINTF(O3CPU,
"[tid:%i] Calling deactivate thread.\n", tid);
489 DPRINTF(O3CPU,
"[tid:%i] Removing from active threads list\n",
494 bac.deactivateThread(tid);
495 fetch.deactivateThread(tid);
496 commit.deactivateThread(tid);
545 fetch.wakeFromQuiesce();
564 DPRINTF(O3CPU,
"[tid:%i] Suspending Thread Context.\n", tid);
576 DPRINTF(Quiesce,
"Suspending Context\n");
585 DPRINTF(O3CPU,
"[tid:%i] Halt Context called. Deallocating\n", tid);
606 DPRINTF(O3CPU,
"[tid:%i] Initializing thread into CPU");
611 src_tc =
system->threads[tid];
616 const auto ®Classes =
isa[tid]->regClasses();
620 for (
auto &
id: *regClasses.at(type)) {
638 commit.rob->resetEntries();
644 DPRINTF(O3CPU,
"[tid:%i] Removing thread context from CPU.\n", tid);
658 bac.clearStates(tid);
659 fetch.clearStates(tid);
662 iew.clearStates(tid);
667 assert(
iew.instQueue.getCount(tid) == 0);
668 assert(
iew.ldstQueue.getCount(tid) == 0);
669 assert(
commit.rob->isEmpty(tid));
670 assert(
ftq.isEmpty(tid));
705 DPRINTF(O3CPU,
"Interrupt %s being handled\n", interrupt->name());
706 trap(interrupt, 0,
nullptr);
738 DPRINTF(Drain,
"Draining...\n");
754 DPRINTF(Drain,
"Currently suspended so activate %i \n",
765 DPRINTF(Drain,
"CPU not drained\n");
769 DPRINTF(Drain,
"CPU is already drained\n");
799 DPRINTF(Drain,
"CPU done draining, processing drain event\n");
809 bac.drainSanityCheck();
810 fetch.drainSanityCheck();
811 decode.drainSanityCheck();
812 rename.drainSanityCheck();
813 iew.drainSanityCheck();
814 commit.drainSanityCheck();
823 DPRINTF(Drain,
"Main CPU structures not drained.\n");
827 if (!
bac.isDrained()) {
828 DPRINTF(Drain,
"BAC not drained.\n");
832 if (!
fetch.isDrained()) {
833 DPRINTF(Drain,
"Fetch not drained.\n");
837 if (!
decode.isDrained()) {
838 DPRINTF(Drain,
"Decode not drained.\n");
842 if (!
rename.isDrained()) {
843 DPRINTF(Drain,
"Rename not drained.\n");
847 if (!
iew.isDrained()) {
848 DPRINTF(Drain,
"IEW not drained.\n");
852 if (!
commit.isDrained()) {
853 DPRINTF(Drain,
"Commit not drained.\n");
864 fetch.drainStall(tid);
873 DPRINTF(Drain,
"Resuming...\n");
883 DPRINTF(Drain,
"Activating thread: %i\n",
i);
900 DPRINTF(O3CPU,
"Switching out\n");
917 fetch.takeOverFrom();
925 auto *oldO3CPU =
dynamic_cast<CPU *
>(oldCPU);
936 if (!
system->isTimingMode()) {
937 fatal(
"The O3 CPU requires the memory system to be in "
991 return regFile.getReg(phys_reg);
1033 return regFile.getWritableReg(phys_reg);
1093 return regFile.getReg(phys_reg);
1109 return regFile.getWritableReg(phys_reg);
1131 return commit.pcState(tid);
1143 thread[tid]->noSquashFromTC =
true;
1144 commit.generateTCEvent(tid);
1159 if (!inst->isMicroop() || inst->isLastMicroop()) {
1161 thread[tid]->threadStats.numInsts++;
1165 thread[tid]->comInstEventQueue.serviceEvents(
thread[tid]->numInst);
1168 if (inst->isMemRef()) {
1169 thread[tid]->threadStats.numMemRefs++;
1173 thread[tid]->threadStats.numOps++;
1182 DPRINTF(O3CPU,
"Removing committed instruction [tid:%i] PC %s "
1184 inst->threadNumber, inst->pcState(), inst->seqNum);
1195 DPRINTF(O3CPU,
"Thread %i: Deleting instructions from instruction"
1200 bool rob_empty =
false;
1204 }
else if (
rob.isEmpty(tid)) {
1205 DPRINTF(O3CPU,
"ROB is empty, squashing all insts.\n");
1209 end_it = (
rob.readTailInst(tid))->getInstListIt();
1210 DPRINTF(O3CPU,
"ROB is not empty, squashing insts not in ROB.\n");
1221 while (inst_it != end_it) {
1247 DPRINTF(O3CPU,
"Deleting instructions from instruction "
1248 "list that are from [tid:%i] and above [sn:%lli] (end=%lli).\n",
1249 tid, seq_num, (*inst_iter)->seqNum);
1251 while ((*inst_iter)->seqNum > seq_num) {
1253 bool break_loop = (inst_iter ==
instList.begin());
1267 if ((*instIt)->threadNumber == tid) {
1268 DPRINTF(O3CPU,
"Squashing instruction, "
1269 "[tid:%i] [sn:%lli] PC %s\n",
1270 (*instIt)->threadNumber,
1272 (*instIt)->pcState());
1275 (*instIt)->setSquashed();
1288 DPRINTF(O3CPU,
"Removing instruction, "
1289 "[tid:%i] [sn:%lli] PC %s\n",
1315 cprintf(
"Dumping Instruction List\n");
1317 while (inst_list_it !=
instList.end()) {
1318 cprintf(
"Instruction:%i\nPC:%#x\n[tid:%i]\n[sn:%lli]\nIssued:%i\n"
1320 num, (*inst_list_it)->pcState().instAddr(),
1321 (*inst_list_it)->threadNumber,
1322 (*inst_list_it)->seqNum, (*inst_list_it)->isIssued(),
1323 (*inst_list_it)->isSquashed());
1339 DPRINTF(Activity,
"CPU already running.\n");
1343 DPRINTF(Activity,
"Waking up CPU\n");
1364 DPRINTF(Quiesce,
"Suspended Processor woken\n");
1384 return isa[tid]->inUserMode();
1395 unsigned high_thread = *list_begin;
1406 DPRINTF(O3CPU,
"Thread %d is inserted to exitingThreads list\n", tid);
1458 bool readyToExit = it->second;
1461 DPRINTF(O3CPU,
"Exiting thread %d\n", thread_id);
1481 iew.ldstQueue.resetHtmStartsStops(tid);
1482 commit.resetHtmStartsStops(tid);
1489 req->setContext(
thread[tid]->contextId());
1490 req->setHtmAbortCause(cause);
1492 assert(req->isHTMAbort());
1495 uint8_t *memData =
new uint8_t[8];
1501 if (!
iew.ldstQueue.getDataPort().sendTimingReq(abort_pkt)) {
1502 panic(
"HTM abort signal was not sent to the memory subsystem.");
void init() override
init() is called after all C++ SimObjects have been created and all ports are connected.
void updateCycleCounters(CPUState state)
base method keeping track of cycle progression
void schedulePowerGatingEvent()
std::vector< std::unique_ptr< CommitCPUStats > > commitStats
void regProbePoints() override
Register probe points for this object.
uint32_t taskId() const
Get cpu task id.
virtual void suspendContext(ThreadID thread_num)
Notify the CPU that the indicated context is now suspended.
gem5::BaseCPU::BaseCPUStats baseStats
ThreadID numThreads
Number of threads we're actually simulating (<= SMT_MAX_THREADS).
void deschedulePowerGatingEvent()
std::vector< std::unique_ptr< ExecuteCPUStats > > executeStats
std::vector< BaseInterrupts * > interrupts
void startup() override
startup() is the final initialization call before simulation.
virtual void switchOut()
Prepare for another CPU to take over execution.
virtual void takeOverFrom(BaseCPU *cpu)
Load the state of a CPU from the previous CPU object, invoked on all new CPUs that are about to be sw...
std::vector< ThreadContext * > threadContexts
bool switchedOut() const
Determine if the CPU is switched out.
BaseCPU(const Params ¶ms, bool is_checker=false)
virtual void probeInstCommit(const StaticInstPtr &inst, Addr pc)
Helper method to trigger PMU probes for a committed instruction.
RequestorID _dataRequestorId
data side request id that must be placed in all requests
virtual void activateContext(ThreadID thread_num)
Notify the CPU that the indicated context is now active.
void setIcachePort(RequestPort *icache_port)
Cycles curCycle() const
Determine the current cycle, corresponding to a tick aligned to a clock edge.
Tick clockEdge(Cycles cycles=Cycles(0)) const
Determine the tick when a cycle begins, by default the current one, but the argument also enables the...
Tick nextCycle() const
Based on the clock of the object, determine the start tick of the first cycle that is at least one cy...
Cycles is a wrapper class for representing cycle counts, i.e.
void dataStatic(T *p)
Set the data pointer to the following value that should not be freed.
static PacketPtr createRead(const RequestPtr &req)
Constructor-like methods that return Packets based on Request objects.
void setHtmTransactional(uint64_t val)
Stipulates that this packet/request originates in the CPU executing in transactional mode,...
constexpr RegClassType classValue() const
ProbePointArg generates a point for the class of Arg.
Register ID: describe an architectural register with its class and index.
@ STRICT_ORDER
The request is required to be strictly ordered by CPU models and is non-speculative.
@ PHYSICAL
The virtual address is also the physical address.
@ HTM_ABORT
The request aborts a HTM transaction.
gem5::Flags< FlagsType > Flags
ThreadContext is the external interface to all thread state for anything outside of the CPU.
virtual void setStatus(Status new_status)=0
@ Halted
Permanently shut down.
@ Suspended
Temporarily inactive.
virtual const PCStateBase & pcState() const =0
std::vector< BaseISA * > isa
void instDone(ThreadID tid, const DynInstPtr &inst)
Function to tell the CPU that an instruction has completed.
IEW iew
The issue/execute/writeback stages.
gem5::Checker< DynInstPtr > * checker
Pointer to the checker, which can dynamically verify instruction results at run time.
void dumpInsts()
Debug function to print all instructions on the list.
void drainSanityCheck() const
Perform sanity checks after a drain.
void htmSendAbortSignal(ThreadID tid, uint64_t htm_uid, HtmFailureFaultCause cause) override
This function is used to instruct the memory subsystem that a transaction should be aborted and the s...
std::list< DynInstPtr > instList
List of all the instructions in flight.
RegVal getReg(PhysRegIdPtr phys_reg, ThreadID tid)
ListIt addInst(const DynInstPtr &inst)
Function to add instruction onto the head of the list of the instructions.
void setArchReg(const RegId ®, RegVal val, ThreadID tid)
ROB rob
The re-order buffer.
InstSeqNum globalSeqNum
The global sequence number counter.
void haltContext(ThreadID tid) override
Remove Thread from Active Threads List && Remove Thread Context from CPU.
TimeBuffer< DecodeStruct > decodeQueue
The decode stage's instruction queue.
EventFunctionWrapper tickEvent
The tick event used for scheduling CPU ticks.
void serializeThread(CheckpointOut &cp, ThreadID tid) const override
Serialize a single thread.
void startup() override
startup() is the final initialization call before simulation.
void drainResume() override
Resumes execution after a drain.
Rename rename
The dispatch stage.
void regProbePoints() override
Register probe points.
void deactivateThread(ThreadID tid)
Remove Thread from Active Threads List.
Counter totalInsts() const override
Count the Total Instructions Committed in the CPU.
void trap(const Fault &fault, ThreadID tid, const StaticInstPtr &inst)
Traps to handle given fault.
CPU(const BaseO3CPUParams ¶ms)
Constructs a CPU with the given parameters.
BAC bac
The branch and PC address calculation stage.
ProbePointArg< PacketPtr > * ppInstAccessComplete
void exitThreads()
Terminate all threads that are ready to exit.
ThreadID getFreeTid()
Gets a free thread id.
std::vector< ThreadState * > thread
Pointers to all of the threads in the CPU.
void tick()
Ticks CPU, calling tick() on each stage, and checking the overall activity to see if the CPU should d...
void removeThread(ThreadID tid)
Remove all of a thread's context from CPU.
void commitDrained(ThreadID tid)
Commit has reached a safe point to drain a thread.
void unscheduleTickEvent()
Unschedule tick event, regardless of its current state.
gem5::o3::CPU::CPUStats cpuStats
UnifiedFreeList freeList
The free list.
Status _status
Overall CPU status.
std::list< DynInstPtr >::iterator ListIt
void activateContext(ThreadID tid) override
Add Thread to Active Threads List.
virtual void wakeup(ThreadID tid) override
bool removeInstsThisCycle
Records if instructions need to be removed this cycle due to being retired or squashed.
void setMiscReg(int misc_reg, RegVal val, ThreadID tid)
Sets a misc.
std::vector< ThreadID > tids
Available thread ids in the cpu.
ProbePointArg< std::pair< DynInstPtr, PacketPtr > > * ppDataAccessComplete
PerThreadUnifiedRenameMap commitRenameMap
The commit rename map.
void setMiscRegNoEffect(int misc_reg, RegVal val, ThreadID tid)
Sets a miscellaneous register.
void removeInstsUntil(const InstSeqNum &seq_num, ThreadID tid)
Remove all instructions younger than the given sequence number.
std::queue< ListIt > removeList
List of all the instructions that will be removed at the end of this cycle.
TimeBuffer< FetchStruct > fetchQueue
The fetch stage's instruction queue.
void cleanUpRemovedInsts()
Cleans up all instructions on the remove list.
Commit commit
The commit stage.
void suspendContext(ThreadID tid) override
Remove Thread from Active Threads List.
void unserializeThread(CheckpointIn &cp, ThreadID tid) override
Unserialize one thread.
void removeInstsNotInROB(ThreadID tid)
Remove all instructions that are not currently in the ROB.
void takeOverFrom(BaseCPU *oldCPU) override
Takes over from another CPU.
void switchOut() override
Switches out this CPU.
PhysRegFile regFile
The register file.
Cycles lastRunningCycle
The cycle that the CPU was last running, used for statistics.
bool tryDrain()
Check if the pipeline has drained and signal drain done.
ActivityRecorder activityRec
The activity recorder; used to tell if the CPU has any activity remaining or if it can go to idle and...
void processInterrupts(const Fault &interrupt)
Processes any an interrupt fault.
void squashFromTC(ThreadID tid)
Initiates a squash of all in-flight instructions for a given thread.
TimeBuffer< TimeStruct > timeBuffer
The main time buffer to do backwards communication.
Tick lastActivatedCycle
The cycle that the CPU was last activated by a new thread.
void squashInstIt(const ListIt &instIt, ThreadID tid)
Removes the instruction pointed to by the iterator.
System * system
Pointer to the system.
Decode decode
The decode stage.
void verifyMemoryMode() const override
Verify that the system is in a memory mode supported by the CPU.
RegVal getArchReg(const RegId ®, ThreadID tid)
Architectural register accessors.
TimeBuffer< IEWStruct > iewQueue
The IEW stage's instruction queue.
EventFunctionWrapper threadExitEvent
The exit event used for terminating all ready-to-exit threads.
DrainState drain() override
Starts draining the CPU's pipeline of all instructions in order to stop all memory accesses.
std::list< ThreadID > activeThreads
Active Threads List.
PerThreadUnifiedRenameMap renameMap
The rename map.
Fault getInterrupts()
Returns the Fault for any valid interrupt.
void scheduleTickEvent(Cycles delay)
Schedule tick event, regardless of its current state.
RegVal readMiscRegNoEffect(int misc_reg, ThreadID tid) const
Register accessors.
bool isCpuDrained() const
Check if a system is in a drained state.
Fetch fetch
The fetch stage.
void addThreadToExitingList(ThreadID tid)
Insert tid to the list of threads trying to exit.
void pcState(const PCStateBase &new_pc_state, ThreadID tid)
Sets the commit PC state of a specific thread.
void scheduleThreadExitEvent(ThreadID tid)
If a thread is trying to exit and its corresponding trap event has been completed,...
void updateThreadPriority()
Update The Order In Which We Process Threads.
void setReg(PhysRegIdPtr phys_reg, RegVal val, ThreadID tid)
bool isThreadExiting(ThreadID tid) const
Is the thread trying to exit?
void removeFrontInst(const DynInstPtr &inst)
Remove an instruction from the front end of the list.
void * getWritableArchReg(const RegId ®, ThreadID tid)
RegVal readMiscReg(int misc_reg, ThreadID tid)
Reads a misc.
void init() override
Initialize the CPU.
void activateThread(ThreadID tid)
Add Thread to Active Threads List.
gem5::ThreadContext * tcBase(ThreadID tid)
Returns a pointer to a thread context.
FTQ ftq
The Fetch taget queue.
Scoreboard scoreboard
Integer Register Scoreboard.
void * getWritableReg(PhysRegIdPtr phys_reg, ThreadID tid)
std::unordered_map< ThreadID, bool > exitingThreads
This is a list of threads that are trying to exit.
Counter totalOps() const override
Count the Total Ops (including micro ops) committed in the CPU.
void wakeCPU()
Wakes the CPU, rescheduling the CPU if it's not already active.
bool inUserMode(ThreadID tid)
Get whether a thread is in user mode.
void insertThread(ThreadID tid)
Setup CPU to insert a thread's context.
TimeBuffer< RenameStruct > renameQueue
The rename stage's instruction queue.
Specific non-templated derived class used for SimObject configuration.
Derived ThreadContext class for use with the O3CPU.
Class that has various thread state, such as the status, the current instruction being processed,...
#define ADD_STAT(n,...)
Convenience macro to add a stat to a statistics group.
void signalDrainDone() const
Signal that an object is drained.
DrainState drainState() const
Return the current drain state of an object.
DrainState
Object drain/handover states.
@ Draining
Draining buffers pending serialization/handover.
@ Running
Running normally.
@ Drained
Buffers drained, ready for serialization/handover.
void deschedule(Event &event)
void schedule(Event &event, Tick when)
static const Priority CPU_Tick_Pri
CPU ticks must come after other associated CPU events (such as writebacks).
static const Priority CPU_Exit_Pri
If we want to exit a thread in a CPU, it comes after CPU_Tick_Pri.
#define panic(...)
This implements a cprintf based panic() function.
#define fatal_if(cond,...)
Conditional fatal macro that checks the supplied condition and only causes a fatal error if the condi...
#define fatal(...)
This implements a cprintf based fatal() function.
#define panic_if(cond,...)
Conditional panic macro that checks the supplied condition and only panics if the condition is true a...
const Params & params() const
ProbeManager * getProbeManager()
Get the probe manager for this object.
#define warn_if(cond,...)
Conditional warning macro that checks the supplied condition and only prints a warning if the conditi...
static constexpr int MaxThreads
RefCountingPtr< DynInst > DynInstPtr
const FlagsType total
Print the total.
double Counter
All counters are of 64-bit values.
Copyright (c) 2024 Arm Limited All rights reserved.
std::shared_ptr< FaultBase > Fault
int16_t ThreadID
Thread index/ID type.
std::shared_ptr< Request > RequestPtr
const ThreadID InvalidThreadID
void cprintf(const char *format, const Args &...args)
Tick curTick()
The universal simulation clock.
std::ostream CheckpointOut
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
bool FullSystem
The FullSystem variable can be used to determine the current mode of simulation.
RefCountingPtr< StaticInst > StaticInstPtr
constexpr decltype(nullptr) NoFault
RegClassType
Enumerate the classes of registers.
@ MatRegClass
Matrix Register.
@ FloatRegClass
Floating-point register.
@ CCRegClass
Condition-code register.
@ VecRegClass
Vector Register.
@ IntRegClass
Integer register.
@ VecElemClass
Vector Register Native Elem lane.
statistics::Scalar timesIdled
Stat for total number of times the CPU is descheduled.
statistics::Scalar quiesceCycles
Stat for total number of cycles the CPU spends descheduled due to a quiesce operation or waiting for ...
statistics::Scalar idleCycles
Stat for total number of cycles the CPU spends descheduled.
const std::string & name()