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__
|