Go to the documentation of this file.
42 #ifndef __CPU_O3_RENAME_IMPL_HH__
43 #define __CPU_O3_RENAME_IMPL_HH__
47 #include "arch/registers.hh"
48 #include "config/the_isa.hh"
51 #include "debug/Activity.hh"
52 #include "debug/Rename.hh"
53 #include "debug/O3PipeView.hh"
54 #include "params/DerivO3CPU.hh"
61 iewToRenameDelay(params->iewToRenameDelay),
62 decodeToRenameDelay(params->decodeToRenameDelay),
63 commitToRenameDelay(params->commitToRenameDelay),
64 renameWidth(params->renameWidth),
65 commitWidth(params->commitWidth),
66 numThreads(params->numThreads),
70 fatal(
"renameWidth (%d) is larger than compiled limit (%d),\n"
71 "\tincrease MaxWidth in src/cpu/o3/impl.hh\n",
76 for (uint32_t tid = 0; tid < Impl::MaxThreads; tid++) {
84 stalls[tid] = {
false,
false};
94 return cpu->name() +
".rename";
99 :
Stats::Group(parent,
"rename"),
100 ADD_STAT(squashCycles,
"Number of cycles rename is squashing"),
101 ADD_STAT(idleCycles,
"Number of cycles rename is idle"),
102 ADD_STAT(blockCycles,
"Number of cycles rename is blocking"),
103 ADD_STAT(serializeStallCycles,
"count of cycles rename stalled"
104 "for serializing inst"),
105 ADD_STAT(runCycles,
"Number of cycles rename is running"),
106 ADD_STAT(unblockCycles,
"Number of cycles rename is unblocking"),
107 ADD_STAT(renamedInsts,
"Number of instructions processed by"
109 ADD_STAT(squashedInsts,
"Number of squashed instructions"
110 " processed by rename"),
111 ADD_STAT(ROBFullEvents,
"Number of times rename has blocked"
113 ADD_STAT(IQFullEvents,
"Number of times rename has blocked due"
115 ADD_STAT(LQFullEvents,
"Number of times rename has blocked due"
117 ADD_STAT(SQFullEvents,
"Number of times rename has blocked due"
119 ADD_STAT(fullRegistersEvents,
"Number of times there has been no"
121 ADD_STAT(renamedOperands,
"Number of destination operands rename"
123 ADD_STAT(lookups,
"Number of register rename lookups that"
125 ADD_STAT(intLookups,
"Number of integer rename lookups"),
126 ADD_STAT(fpLookups,
"Number of floating rename lookups"),
127 ADD_STAT(vecLookups,
"Number of vector rename lookups"),
128 ADD_STAT(vecPredLookups,
"Number of vector predicate rename"
130 ADD_STAT(committedMaps,
"Number of HB maps that are committed"),
131 ADD_STAT(undoneMaps,
"Number of HB maps that are undone due to"
133 ADD_STAT(serializing,
"count of serializing insts renamed" ),
134 ADD_STAT(tempSerializing,
"count of temporary serializing insts"
136 ADD_STAT(skidInsts,
"count of insts added to the skid buffer")
168 template <
class Impl>
177 template <
class Impl>
193 template <
class Impl>
203 template <
class Impl>
213 template <
class Impl>
220 template <
class Impl>
242 template <
class Impl>
280 template <
class Impl>
288 template <
class Impl>
302 template <
class Impl>
310 !
insts[tid].empty() ||
317 template <
class Impl>
324 template <
class Impl>
330 assert(
insts[tid].empty());
336 template <
class Impl>
340 DPRINTF(Rename,
"[tid:%i] [squash sn:%llu] Squashing instructions.\n",
354 DPRINTF(Rename,
"[tid:%i] [squash sn:%llu] "
355 "Rename will resume serializing after squash\n",
390 template <
class Impl>
398 bool status_change =
false;
408 while (threads != end) {
411 DPRINTF(Rename,
"Processing [tid:%i]\n", tid);
415 rename(status_change, tid);
423 DPRINTF(Activity,
"Activity this cycle.\n");
424 cpu->activityThisCycle();
429 while (threads != end) {
433 if (
fromCommit->commitInfo[tid].doneSeqNum != 0 &&
477 toDecode->renameUnblock[tid] =
false;
483 toDecode->renameUnblock[tid] =
false;
491 "Not blocked, so attempting to run stage.\n",
510 template <
class Impl>
521 if (insts_available == 0) {
522 DPRINTF(Rename,
"[tid:%i] Nothing to do, breaking out early.\n",
537 int min_free_entries = free_rob_entries;
541 if (free_iq_entries < min_free_entries) {
542 min_free_entries = free_iq_entries;
547 if (min_free_entries <= 0) {
549 "[tid:%i] Blocking due to no free ROB/IQ/ entries.\n"
550 "ROB has %i free entries.\n"
551 "IQ has %i free entries.\n",
552 tid, free_rob_entries, free_iq_entries);
561 }
else if (min_free_entries < insts_available) {
564 "Will have to block this cycle. "
565 "%i insts available, "
566 "but only %i insts can be renamed due to ROB/IQ/LSQ limits.\n",
567 tid, insts_available, min_free_entries);
569 insts_available = min_free_entries;
581 "%i available instructions to send iew.\n",
582 tid, insts_available);
586 "%i insts pipelining from Rename | "
587 "%i insts dispatched to IQ last cycle.\n",
595 }
else if (!insts_to_rename.empty()) {
596 insts_to_rename.front()->setSerializeBefore();
600 int renamed_insts = 0;
603 DPRINTF(Rename,
"[tid:%i] Sending instructions to IEW.\n", tid);
605 assert(!insts_to_rename.empty());
613 if (inst->isLoad()) {
615 DPRINTF(Rename,
"[tid:%i] Cannot rename due to no free LQ\n");
622 if (inst->isStore() || inst->isAtomic()) {
624 DPRINTF(Rename,
"[tid:%i] Cannot rename due to no free SQ\n");
631 insts_to_rename.pop_front();
636 "Removing [sn:%llu] PC:%s from rename skidBuffer\n",
637 tid, inst->seqNum, inst->pcState());
640 if (inst->isSquashed()) {
643 "instruction %i with PC %s is squashed, skipping.\n",
644 tid, inst->seqNum, inst->pcState());
656 "Processing instruction [sn:%llu] with PC %s.\n",
657 tid, inst->seqNum, inst->pcState());
661 if (!
renameMap[tid]->canRename(inst->numIntDestRegs(),
662 inst->numFPDestRegs(),
663 inst->numVecDestRegs(),
664 inst->numVecElemDestRegs(),
665 inst->numVecPredDestRegs(),
666 inst->numCCDestRegs())) {
669 " lack of free physical registers to rename to.\n");
671 insts_to_rename.push_front(inst);
687 if ((inst->isIprAccess() || inst->isSerializeBefore()) &&
688 !inst->isSerializeHandled()) {
689 DPRINTF(Rename,
"Serialize before instruction encountered.\n");
691 if (!inst->isTempSerializeBefore()) {
693 inst->setSerializeHandled();
707 }
else if ((inst->isStoreConditional() || inst->isSerializeAfter()) &&
708 !inst->isSerializeHandled()) {
709 DPRINTF(Rename,
"Serialize after instruction encountered.\n");
713 inst->setSerializeHandled();
722 if (inst->isAtomic() || inst->isStore()) {
724 }
else if (inst->isLoad()) {
754 if (insts_available) {
760 toDecode->renameUnblock[tid] =
false;
770 while (!
insts[tid].empty()) {
771 inst =
insts[tid].front();
773 insts[tid].pop_front();
775 assert(tid == inst->threadNumber);
777 DPRINTF(Rename,
"[tid:%i] Inserting [sn:%llu] PC: %s into Rename "
778 "skidBuffer\n", tid, inst->seqNum, inst->pcState());
787 typename InstQueue::iterator it;
788 warn(
"Skidbuffer contents:\n");
791 warn(
"[tid:%i] %s [sn:%llu].\n", tid,
792 (*it)->staticInst->disassemble(inst->instAddr()),
795 panic(
"Skidbuffer Exceeded Max Size");
799 template <
class Impl>
804 for (
int i = 0;
i < insts_from_decode; ++
i) {
806 insts[inst->threadNumber].push_back(inst);
809 inst->renameTick =
curTick() - inst->fetchTick;
822 while (threads != end) {
836 bool any_unblocking =
false;
841 while (threads != end) {
845 any_unblocking =
true;
851 if (any_unblocking) {
855 DPRINTF(Activity,
"Activating stage.\n");
857 cpu->activateStage(O3CPU::RenameIdx);
864 DPRINTF(Activity,
"Deactivating stage.\n");
866 cpu->deactivateStage(O3CPU::RenameIdx);
871 template <
class Impl>
875 DPRINTF(Rename,
"[tid:%i] Blocking.\n", tid);
889 toDecode->renameUnblock[tid] =
false;
905 template <
class Impl>
909 DPRINTF(Rename,
"[tid:%i] Trying to unblock.\n", tid);
914 DPRINTF(Rename,
"[tid:%i] Done unblocking.\n", tid);
916 toDecode->renameUnblock[tid] =
true;
926 template <
class Impl>
938 hb_it->instSeqNum > squashed_seq_num) {
941 DPRINTF(Rename,
"[tid:%i] Removing history entry with sequence "
942 "number %i (archReg: %d, newPhysReg: %d, prevPhysReg: %d).\n",
943 tid, hb_it->instSeqNum, hb_it->archReg.index(),
944 hb_it->newPhysReg->index(), hb_it->prevPhysReg->index());
952 if (hb_it->newPhysReg != hb_it->prevPhysReg) {
955 renameMap[tid]->setEntry(hb_it->archReg, hb_it->prevPhysReg);
958 freeList->addReg(hb_it->newPhysReg);
980 DPRINTF(Rename,
"[tid:%i] Removing a committed instruction from the "
981 "history buffer %u (size=%i), until [sn:%llu].\n",
990 DPRINTF(Rename,
"[tid:%i] History buffer is empty.\n", tid);
992 }
else if (hb_it->instSeqNum > inst_seq_num) {
993 DPRINTF(Rename,
"[tid:%i] [sn:%llu] "
994 "Old sequence number encountered. "
995 "Ensure that a syscall happened recently.\n",
1006 hb_it->instSeqNum <= inst_seq_num) {
1008 DPRINTF(Rename,
"[tid:%i] Freeing up older rename of reg %i (%s), "
1010 tid, hb_it->prevPhysReg->index(),
1011 hb_it->prevPhysReg->className(),
1017 if (hb_it->newPhysReg != hb_it->prevPhysReg) {
1018 freeList->addReg(hb_it->prevPhysReg);
1027 template <
class Impl>
1033 unsigned num_src_regs = inst->numSrcRegs();
1037 for (
int src_idx = 0; src_idx < num_src_regs; src_idx++) {
1038 const RegId& src_reg = inst->srcRegIdx(src_idx);
1066 "Looking up %s arch reg %i, got phys reg %i (%s)\n",
1071 inst->renameSrcReg(src_idx, renamed_reg);
1077 "Register %d (flat: %d) (%s) is ready.\n",
1081 inst->markSrcRegReady(src_idx);
1085 "Register %d (flat: %d) (%s) is not ready.\n",
1094 template <
class Impl>
1100 unsigned num_dest_regs = inst->numDestRegs();
1103 for (
int dest_idx = 0; dest_idx < num_dest_regs; dest_idx++) {
1104 const RegId& dest_reg = inst->destRegIdx(dest_idx);
1105 typename RenameMap::RenameInfo rename_result;
1110 rename_result = map->rename(flat_dest_regid);
1112 inst->flattenDestReg(dest_idx, flat_dest_regid);
1118 "Renaming arch reg %i (%s) to physical reg %i (%i).\n",
1120 rename_result.first->index(),
1121 rename_result.first->flatIndex());
1125 rename_result.first,
1126 rename_result.second);
1130 DPRINTF(Rename,
"[tid:%i] [sn:%llu] "
1131 "Adding instruction to history buffer (size=%i).\n",
1140 inst->renameDestReg(dest_idx,
1141 rename_result.first,
1142 rename_result.second);
1148 template <
class Impl>
1160 template <
class Impl>
1172 template <
class Impl>
1179 "calcFreeLQEntries: free lqEntries: %d, loadsInProgress: %d, "
1180 "loads dispatchedToLQ: %d\n",
1182 fromIEW->iewInfo[tid].dispatchedToLQ);
1186 template <
class Impl>
1192 DPRINTF(Rename,
"calcFreeSQEntries: free sqEntries: %d, storesInProgress: %d, "
1193 "stores dispatchedToSQ: %d\n",
freeEntries[tid].sqEntries,
1198 template <
class Impl>
1202 unsigned inst_count = 0;
1212 template <
class Impl>
1220 if (
fromIEW->iewUnblock[tid]) {
1226 template <
class Impl>
1230 bool ret_val =
false;
1233 DPRINTF(Rename,
"[tid:%i] Stall from IEW stage detected.\n", tid);
1236 DPRINTF(Rename,
"[tid:%i] Stall: ROB has 0 free entries.\n", tid);
1239 DPRINTF(Rename,
"[tid:%i] Stall: IQ has 0 free entries.\n", tid);
1242 DPRINTF(Rename,
"[tid:%i] Stall: LSQ has 0 free entries.\n", tid);
1244 }
else if (
renameMap[tid]->numFreeEntries() <= 0) {
1245 DPRINTF(Rename,
"[tid:%i] Stall: RenameMap has 0 free entries.\n", tid);
1249 DPRINTF(Rename,
"[tid:%i] Stall: Serialize stall and ROB is not "
1258 template <
class Impl>
1262 if (
fromIEW->iewInfo[tid].usedIQ)
1265 if (
fromIEW->iewInfo[tid].usedLSQ) {
1276 DPRINTF(Rename,
"[tid:%i] Free IQ: %i, Free ROB: %i, "
1277 "Free LQ: %i, Free SQ: %i, FreeRM %i(%i %i %i %i %i)\n",
1290 DPRINTF(Rename,
"[tid:%i] %i instructions not yet in ROB\n",
1294 template <
class Impl>
1312 DPRINTF(Rename,
"[tid:%i] Squashing instructions due to squash from "
1325 DPRINTF(Rename,
"[tid:%i] Done blocking, switching to unblocking.\n",
1340 "[tid:%i] Done squashing, switching to serialize.\n", tid);
1346 "[tid:%i] Done squashing, switching to unblocking.\n",
1351 DPRINTF(Rename,
"[tid:%i] Done squashing, switching to running.\n",
1360 DPRINTF(Rename,
"[tid:%i] Done with serialize stall, switching to "
1361 "unblocking.\n", tid);
1369 DPRINTF(Rename,
"[tid:%i] Processing instruction [%lli] with "
1370 "PC %s.\n", tid, serial_inst->seqNum, serial_inst->pcState());
1373 serial_inst->clearSerializeBefore();
1378 insts[tid].push_front(serial_inst);
1381 DPRINTF(Rename,
"[tid:%i] Instruction must be processed by rename."
1382 " Adding to front of list.\n", tid);
1394 template<
class Impl>
1398 if (inst_list.empty()) {
1405 inst_list.front()->setSerializeBefore();
1408 template <
class Impl>
1426 panic(
"Rename full stall stat should be incremented for a reason!");
1431 template <
class Impl>
1442 cprintf(
"Seq num: %i\nArch reg[%s]: %i New phys reg:"
1443 " %i[%s] Old phys reg: %i[%s]\n",
1444 (*buf_it).instSeqNum,
1445 (*buf_it).archReg.className(),
1446 (*buf_it).archReg.index(),
1447 (*buf_it).newPhysReg->index(),
1448 (*buf_it).newPhysReg->className(),
1449 (*buf_it).prevPhysReg->index(),
1450 (*buf_it).prevPhysReg->className());
1457 #endif//__CPU_O3_RENAME_IMPL_HH__
void rename(bool &status_change, ThreadID tid)
Determines what to do based on rename's current status.
int getNumPinnedWrites() const
void skidInsert(ThreadID tid)
Inserts unused instructions from a given thread into the skid buffer, to be renamed once rename unblo...
#define fatal(...)
This implements a cprintf based fatal() function.
int decodeToRenameDelay
Delay between decode and rename, in ticks.
bool checkStall(ThreadID tid)
Checks if any stages are telling rename to block.
bool skidsEmpty()
Returns if all of the skid buffers are empty.
FreeEntries freeEntries[Impl::MaxThreads]
Per-thread tracking of the number of free entries of back-end structures.
Stats::Scalar serializeStallCycles
Stat for total number of cycles spent stalling for a serializing inst.
unsigned skidBufferMax
The maximum skid buffer size.
Stats::Scalar renamedInsts
Stat for total number of renamed instructions.
int calcFreeIQEntries(ThreadID tid)
Calculates the number of free IQ entries for a specific thread.
Stats::Scalar skidInsts
Number of instructions inserted into skid buffers.
void dumpHistory()
Debugging function used to dump history buffer of renamings.
@ VecElemClass
Vector Register Native Elem lane.
const char * className() const
Return a const char* with the register class name.
void tick()
Ticks rename, which processes all input signals and attempts to rename as many instructions as possib...
int storesInProgress[Impl::MaxThreads]
Count of Store instructions in progress that have been sent off to the IQ and ROB,...
void setDecodeQueue(TimeBuffer< DecodeStruct > *dq_ptr)
Sets pointer to time buffer coming from decode.
int16_t ThreadID
Thread index/ID type.
bool emptyROB[Impl::MaxThreads]
Records if the ROB is empty.
InstQueue insts[Impl::MaxThreads]
Queue of all instructions coming from decode this cycle.
void removeFromHistory(InstSeqNum inst_seq_num, ThreadID tid)
Removes a committed instruction's rename history.
void setFreeList(FreeList *fl_ptr)
Sets pointer to the free list.
Stats::Scalar tempSerializing
Number of instructions marked as temporarily serializing.
TimeBuffer< TimeStruct >::wire toDecode
Wire to write infromation heading to previous stages.
Stats::Scalar blockCycles
Stat for total number of cycles spent blocking.
TimeBuffer< DecodeStruct > * decodeQueue
Decode instruction queue interface.
TimeBuffer< DecodeStruct >::wire fromDecode
Wire to get decode's output from decode queue.
const PhysRegIndex & flatIndex() const
Flat index accessor.
void setRenameQueue(TimeBuffer< RenameStruct > *rq_ptr)
Sets pointer to time buffer used to communicate to the next stage.
void setTimeBuffer(TimeBuffer< TimeStruct > *tb_ptr)
Sets the main backwards communication time buffer pointer.
void readStallSignals(ThreadID tid)
Reads signals telling rename to block/unblock.
void renameInsts(ThreadID tid)
Renames instructions for the given thread.
bool checkSignalsAndUpdate(ThreadID tid)
Checks the signals and updates the status.
Stats::Scalar vecPredLookups
void notify(const Arg &arg)
called at the ProbePoint call site, passes arg to each listener.
std::list< RenameHistory > historyBuffer[Impl::MaxThreads]
A per-thread list of all destination register renames, used to either undo rename mappings or free ol...
int calcFreeSQEntries(ThreadID tid)
Calculates the number of free SQ entries for a specific thread.
void clearStates(ThreadID tid)
Clear all thread-specific states.
void resetStage()
Reset this pipeline stage.
Register ID: describe an architectural register with its class and index.
Derived & flags(Flags _flags)
Set the flags and marks this stat to print at the end of simulation.
TimeBuffer< TimeStruct >::wire fromIEW
Wire to get IEW's output from backwards time buffer.
void startupStage()
Initializes variables for the stage.
bool blockThisCycle
Whether or not rename needs to block this cycle.
Stats::Scalar undoneMaps
Stat for total number of mappings that were undone due to a squash.
void updateStatus()
Updates overall rename status based on all of the threads' statuses.
std::list< ThreadID > * activeThreads
Pointer to the list of active threads.
void setNumPinnedWrites(int num_writes)
const RegIndex & index() const
Visible RegId methods.
bool resumeUnblocking
Whether or not rename needs to resume clearing out the skidbuffer after squashing.
Stalls stalls[Impl::MaxThreads]
Tracks which stages are telling decode to stall.
@ FloatRegClass
Floating-point register.
FullSource
Enum to record the source of a structure full stall.
void takeOverFrom()
Takes over from another CPU's thread.
int calcFreeLQEntries(ThreadID tid)
Calculates the number of free LQ entries for a specific thread.
ThreadContext is the external interface to all thread state for anything outside of the CPU.
O3CPU * cpu
Pointer to CPU.
Derived & prereq(const Stat &prereq)
Set the prerequisite stat and marks this stat to print at the end of simulation.
void setScoreboard(Scoreboard *_scoreboard)
Sets pointer to the scoreboard.
Holds the information for each destination register rename.
void readFreeEntries(ThreadID tid)
Gets the number of free entries for a specific thread.
void cprintf(const char *format, const Args &...args)
Stats::Scalar unblockCycles
Stat for total number of cycles spent unblocking.
#define ADD_STAT(n,...)
Convenience macro to add a stat to a statistics group.
virtual RegId flattenRegId(const RegId ®Id) const =0
Scoreboard * scoreboard
Pointer to the scoreboard.
FreeList * freeList
Free list interface.
bool isDrained() const
Has the stage drained?
void incrFullStat(const FullSource &source)
Function used to increment the stat that corresponds to the source of the stall.
CPUPol::RenameMap RenameMap
bool getReg(PhysRegIdPtr phys_reg) const
Checks if the register is ready.
RenameStats(Stats::Group *parent)
DynInstPtr serializeInst[Impl::MaxThreads]
The serialize instruction that rename has stalled on.
Stats::Scalar LQFullEvents
Stat for total number of times that the LQ starts a stall in rename.
void sortInsts()
Separates instructions from decode into individual lists of instructions sorted by thread.
bool wroteToTimeBuffer
Variable that tracks if decode has written to the time buffer this cycle.
bool block(ThreadID tid)
Switches rename to blocking, and signals back that rename has become blocked.
void renameSrcRegs(const DynInstPtr &inst, ThreadID tid)
Renames the source registers of an instruction.
Stats::Scalar squashCycles
Stat for total number of cycles spent squashing.
Stats::Scalar SQFullEvents
Stat for total number of times that the SQ starts a stall in rename.
IEW * iew_ptr
Pointer to IEW stage.
void squash(const InstSeqNum &squash_seq_num, ThreadID tid)
Squashes all instructions in a thread.
void regProbePoints()
Registers probes.
Stats::Scalar squashedInsts
Stat for total number of squashed instructions that rename discards.
Stats::Scalar IQFullEvents
Stat for total number of times that the IQ starts a stall in rename.
Stats::Scalar fullRegistersEvents
Stat for total number of times that rename runs out of free registers to use to rename.
void setRenameMap(RenameMap rm_ptr[Impl::MaxThreads])
Sets pointer to rename maps (per-thread structures).
void renameDestRegs(const DynInstPtr &inst, ThreadID tid)
Renames the destination registers of an instruction.
unsigned toIEWIndex
The index of the instruction in the time buffer to IEW that rename is currently using.
Impl::DynInstPtr DynInstPtr
DefaultRename(O3CPU *_cpu, DerivO3CPUParams *params)
DefaultRename constructor.
@ IntRegClass
Integer register.
@ CCRegClass
Condition-code register.
Stats::Scalar committedMaps
Stat for total number of committed renaming mappings.
void serializeAfter(InstQueue &inst_list, ThreadID tid)
Either serializes on the next instruction available in the InstQueue, or records that it must seriali...
bool resumeSerialize
Whether or not rename needs to resume a serialize instruction after squashing.
void doSquash(const InstSeqNum &squash_seq_num, ThreadID tid)
Executes actual squash, removing squashed instructions.
DefaultRename::RenameStats stats
@ MiscRegClass
Control (misc) register.
std::string name() const
Returns the name of rename.
@ VecRegClass
Vector Register.
TimeBuffer< RenameStruct > * renameQueue
Rename instruction queue.
const char * className() const
Return a const char* with the register class name.
Stats::Scalar runCycles
Stat for total number of cycles spent running normally.
void setActiveThreads(std::list< ThreadID > *at_ptr)
Sets pointer to list of active threads.
bool unblock(ThreadID tid)
Switches rename to unblocking if the skid buffer is empty, and signals back that rename has unblocked...
TimeBuffer< TimeStruct > * timeBuffer
Pointer to main time buffer used for backwards communication.
Overload hash function for BasicBlockRange type.
RenameStatus _status
Rename status.
ThreadStatus renameStatus[Impl::MaxThreads]
Per-thread status.
InstQueue skidBuffer[Impl::MaxThreads]
Skid buffer between rename and decode.
RenameMap * renameMap[Impl::MaxThreads]
Rename map interface.
int instsInProgress[Impl::MaxThreads]
Count of instructions in progress that have been sent off to the IQ and ROB, but are not yet included...
Stats::Scalar idleCycles
Stat for total number of cycles spent idle.
Commit * commit_ptr
Pointer to commit stage.
int calcFreeROBEntries(ThreadID tid)
Calculates the number of free ROB entries for a specific thread.
ProbePointArg< DynInstPtr > * ppRename
To probe when register renaming for an instruction is complete.
CPUPol::FreeList FreeList
void drainSanityCheck() const
Perform sanity checks after a drain.
Stats::Scalar ROBFullEvents
Stat for total number of times that the ROB starts a stall in rename.
const RegIndex & index() const
Index accessors.
unsigned validInsts()
Returns the number of valid instructions coming from decode.
unsigned commitToRenameDelay
Delay between commit and rename, in ticks.
const FlagsType total
Print the total.
bool serializeOnNextInst[Impl::MaxThreads]
Records if rename needs to serialize on the next instruction for any thread.
TimeBuffer< RenameStruct >::wire toIEW
Wire to write any information heading to IEW.
ThreadID numThreads
The number of threads active in rename.
const RegClass & classValue() const
Class accessor.
Stats::Scalar serializing
Number of serialize instructions handled.
Stats::Scalar lookups
Stat for total number of source register rename lookups.
int loadsInProgress[Impl::MaxThreads]
Count of Load instructions in progress that have been sent off to the IQ and ROB, but are not yet inc...
ProbePointArg< SeqNumRegPair > * ppSquashInRename
To probe when an instruction is squashed and the register mapping for it needs to be undone.
Implements a simple scoreboard to track which registers are ready.
void unsetReg(PhysRegIdPtr phys_reg)
Sets the register as not ready.
#define panic(...)
This implements a cprintf based panic() function.
int iewToRenameDelay
Delay between iew and rename, in ticks.
Stats::Scalar renamedOperands
Stat for total number of renamed destination registers.
TimeBuffer< TimeStruct >::wire fromCommit
Wire to get commit's output from backwards time buffer.
Tick curTick()
The current simulated tick.
unsigned renameWidth
Rename width, in instructions.
Generated on Wed Sep 30 2020 14:02:09 for gem5 by doxygen 1.8.17