SConscript: arch/isa_parser.py: cpu/base_dyn_inst.cc: Remove OOO CPU stuff. arch/alpha/faults.hh: Add fake memory fault. This will be removed eventually. arch/alpha/isa_desc: Change EA comp and Mem accessor to be const StaticInstPtrs. cpu/base_dyn_inst.hh: Update read/write calls to use load queue and store queue indices. cpu/beta_cpu/alpha_dyn_inst.hh: Change to const StaticInst in the register accessors. cpu/beta_cpu/alpha_dyn_inst_impl.hh: Update syscall code with thread numbers. cpu/beta_cpu/alpha_full_cpu.hh: Alter some of the full system code so it will compile without errors. cpu/beta_cpu/alpha_full_cpu_builder.cc: Created a DerivAlphaFullCPU class so I can instantiate different CPUs that have different template parameters. cpu/beta_cpu/alpha_full_cpu_impl.hh: Update some of the full system code so it compiles. cpu/beta_cpu/alpha_params.hh: cpu/beta_cpu/fetch_impl.hh: Remove asid. cpu/beta_cpu/comm.hh: Remove global history field. cpu/beta_cpu/commit.hh: Comment out rename map. cpu/beta_cpu/commit_impl.hh: Update some of the full system code so it compiles. Also change it so that it handles memory instructions properly. cpu/beta_cpu/cpu_policy.hh: Removed IQ from the IEW template parameter to make it more uniform. cpu/beta_cpu/decode.hh: Add debug function. cpu/beta_cpu/decode_impl.hh: Slight updates for decode in the case where it causes a squash. cpu/beta_cpu/fetch.hh: cpu/beta_cpu/rob.hh: Comment out unneccessary code. cpu/beta_cpu/full_cpu.cc: Changed some of the full system code so it compiles. Updated exec contexts and so forth to hopefully make multithreading easier. cpu/beta_cpu/full_cpu.hh: Updated some of the full system code to make it compile. cpu/beta_cpu/iew.cc: Removed IQ from template parameter to IEW. cpu/beta_cpu/iew.hh: Removed IQ from template parameter to IEW. Updated IEW to recognize the Load/Store queue. cpu/beta_cpu/iew_impl.hh: New handling of memory instructions through the Load/Store queue. cpu/beta_cpu/inst_queue.hh: Updated comment. cpu/beta_cpu/inst_queue_impl.hh: Slightly different handling of memory instructions due to Load/Store queue. cpu/beta_cpu/regfile.hh: Updated full system code so it compiles. cpu/beta_cpu/rob_impl.hh: Moved some code around; no major functional changes. cpu/ooo_cpu/ooo_cpu.hh: Slight updates to OOO CPU; still does not work. cpu/static_inst.hh: Remove OOO CPU stuff. Change ea comp and mem acc to return const StaticInst. kern/kernel_stats.hh: Extra forward declares added due to compile error. --HG-- extra : convert_revision : 594a7cdbe57f6c2bda7d08856fcd864604a6238e
135 lines
4.2 KiB
C++
135 lines
4.2 KiB
C++
// Todo: Probably add in support for scheduling events (more than one as
|
|
// well) on the case of the ROB being empty or full. Considering tracking
|
|
// free entries instead of insts in ROB. Differentiate between squashing
|
|
// all instructions after the instruction, and all instructions after *and*
|
|
// including that instruction.
|
|
|
|
#ifndef __CPU_BETA_CPU_ROB_HH__
|
|
#define __CPU_BETA_CPU_ROB_HH__
|
|
|
|
#include <utility>
|
|
#include <vector>
|
|
|
|
/**
|
|
* ROB class. Uses the instruction list that exists within the CPU to
|
|
* represent the ROB. This class doesn't contain that list, but instead
|
|
* a pointer to the CPU to get access to the list. The ROB, in this first
|
|
* implementation, is largely what drives squashing.
|
|
*/
|
|
template <class Impl>
|
|
class ROB
|
|
{
|
|
public:
|
|
//Typedefs from the Impl.
|
|
typedef typename Impl::FullCPU FullCPU;
|
|
typedef typename Impl::DynInstPtr DynInstPtr;
|
|
|
|
typedef std::pair<RegIndex, PhysRegIndex> UnmapInfo_t;
|
|
typedef typename list<DynInstPtr>::iterator InstIt_t;
|
|
|
|
public:
|
|
/** ROB constructor.
|
|
* @params _numEntries Number of entries in ROB.
|
|
* @params _squashWidth Number of instructions that can be squashed in a
|
|
* single cycle.
|
|
*/
|
|
ROB(unsigned _numEntries, unsigned _squashWidth);
|
|
|
|
/** Function to set the CPU pointer, necessary due to which object the ROB
|
|
* is created within.
|
|
* @params cpu_ptr Pointer to the implementation specific full CPU object.
|
|
*/
|
|
void setCPU(FullCPU *cpu_ptr);
|
|
|
|
/** Function to insert an instruction into the ROB. The parameter inst is
|
|
* not truly required, but is useful for checking correctness. Note
|
|
* that whatever calls this function must ensure that there is enough
|
|
* space within the ROB for the new instruction.
|
|
* @params inst The instruction being inserted into the ROB.
|
|
* @todo Remove the parameter once correctness is ensured.
|
|
*/
|
|
void insertInst(DynInstPtr &inst);
|
|
|
|
/** Returns pointer to the head instruction within the ROB. There is
|
|
* no guarantee as to the return value if the ROB is empty.
|
|
* @retval Pointer to the DynInst that is at the head of the ROB.
|
|
*/
|
|
DynInstPtr readHeadInst() { return cpu->instList.front(); }
|
|
|
|
DynInstPtr readTailInst() { return (*tail); }
|
|
|
|
void retireHead();
|
|
|
|
bool isHeadReady();
|
|
|
|
unsigned numFreeEntries();
|
|
|
|
bool isFull()
|
|
{ return numInstsInROB == numEntries; }
|
|
|
|
bool isEmpty()
|
|
{ return numInstsInROB == 0; }
|
|
|
|
void doSquash();
|
|
|
|
void squash(InstSeqNum squash_num);
|
|
|
|
uint64_t readHeadPC();
|
|
|
|
uint64_t readHeadNextPC();
|
|
|
|
InstSeqNum readHeadSeqNum();
|
|
|
|
uint64_t readTailPC();
|
|
|
|
InstSeqNum readTailSeqNum();
|
|
|
|
/** Checks if the ROB is still in the process of squashing instructions.
|
|
* @retval Whether or not the ROB is done squashing.
|
|
*/
|
|
bool isDoneSquashing() const { return doneSquashing; }
|
|
|
|
/** This is more of a debugging function than anything. Use
|
|
* numInstsInROB to get the instructions in the ROB unless you are
|
|
* double checking that variable.
|
|
*/
|
|
int countInsts();
|
|
|
|
private:
|
|
|
|
/** Pointer to the CPU. */
|
|
FullCPU *cpu;
|
|
|
|
/** Number of instructions in the ROB. */
|
|
unsigned numEntries;
|
|
|
|
/** Number of instructions that can be squashed in a single cycle. */
|
|
unsigned squashWidth;
|
|
|
|
/** Iterator pointing to the instruction which is the last instruction
|
|
* in the ROB. This may at times be invalid (ie when the ROB is empty),
|
|
* however it should never be incorrect.
|
|
*/
|
|
InstIt_t tail;
|
|
|
|
/** Iterator used for walking through the list of instructions when
|
|
* squashing. Used so that there is persistent state between cycles;
|
|
* when squashing, the instructions are marked as squashed but not
|
|
* immediately removed, meaning the tail iterator remains the same before
|
|
* and after a squash.
|
|
* This will always be set to cpu->instList.end() if it is invalid.
|
|
*/
|
|
InstIt_t squashIt;
|
|
|
|
/** Number of instructions in the ROB. */
|
|
int numInstsInROB;
|
|
|
|
/** The sequence number of the squashed instruction. */
|
|
InstSeqNum squashedSeqNum;
|
|
|
|
/** Is the ROB done squashing. */
|
|
bool doneSquashing;
|
|
};
|
|
|
|
#endif //__CPU_BETA_CPU_ROB_HH__
|