summaryrefslogtreecommitdiff
path: root/src/cpu/inorder/pipeline_stage.hh
diff options
context:
space:
mode:
Diffstat (limited to 'src/cpu/inorder/pipeline_stage.hh')
-rw-r--r--src/cpu/inorder/pipeline_stage.hh349
1 files changed, 0 insertions, 349 deletions
diff --git a/src/cpu/inorder/pipeline_stage.hh b/src/cpu/inorder/pipeline_stage.hh
deleted file mode 100644
index 478561a8e..000000000
--- a/src/cpu/inorder/pipeline_stage.hh
+++ /dev/null
@@ -1,349 +0,0 @@
-/*
- * Copyright (c) 2007 MIPS Technologies, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met: redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer;
- * redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution;
- * neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * Authors: Korey Sewell
- *
- */
-
-#ifndef __CPU_INORDER_PIPELINE_STAGE_HH__
-#define __CPU_INORDER_PIPELINE_STAGE_HH__
-
-#include <queue>
-#include <vector>
-
-#include "base/statistics.hh"
-#include "cpu/inorder/comm.hh"
-#include "cpu/inorder/inorder_dyn_inst.hh"
-#include "cpu/inorder/pipeline_traits.hh"
-#include "cpu/timebuf.hh"
-#include "params/InOrderCPU.hh"
-
-class InOrderCPU;
-
-class PipelineStage
-{
- protected:
- typedef ThePipeline::Params Params;
- typedef ThePipeline::DynInstPtr DynInstPtr;
-
- public:
- /** Overall stage status. Used to determine if the CPU can
- * deschedule itself due to a lack of activity.
- */
- enum StageStatus {
- Active,
- Inactive
- };
-
- /** Individual thread status. */
- enum ThreadStatus {
- Running,
- Idle,
- StartSquash,
- Squashing,
- Blocked,
- Unblocking,
- MemWaitResponse,
- MemWaitRetry,
- MemAccessComplete
- };
-
- protected:
- /** The Number of This Pipeline Stage */
- unsigned stageNum;
-
- /** The width of stage, in instructions. */
- unsigned stageWidth;
-
- /** Number of Threads*/
- ThreadID numThreads;
-
- /** Stage status. */
- StageStatus _status;
-
- /** Per-thread status. */
- ThreadStatus stageStatus[ThePipeline::MaxThreads];
-
- public:
- PipelineStage(Params *params, unsigned stage_num);
-
- virtual ~PipelineStage();
-
- /** PipelineStage initialization. */
- void init(Params *params);
-
- /** Returns the name of stage. */
- std::string name() const;
-
- /** Registers statistics. */
- void regStats();
-
- /** Sets CPU pointer. */
- void setCPU(InOrderCPU *cpu_ptr);
-
- /** Sets the main backwards communication time buffer pointer. */
- void setTimeBuffer(TimeBuffer<TimeStruct> *tb_ptr);
-
- /** Sets pointer to time buffer coming from fetch. */
- void setPrevStageQueue(TimeBuffer<InterStageStruct> *prev_stage_ptr);
-
- /** Sets pointer to time buffer used to communicate to the next stage. */
- void setNextStageQueue(TimeBuffer<InterStageStruct> *next_stage_ptr);
-
- /** Sets pointer to list of active threads. */
- void setActiveThreads(std::list<ThreadID> *at_ptr);
-
- bool nextStageQueueValid(int stage_num);
-
- bool isBlocked(ThreadID tid);
-
- /** Changes the status of this stage to active, and indicates this
- * to the CPU.
- */
- //inline void switchToActive();
-
- /** Changes the status of this stage to inactive, and indicates
- * this to the CPU.
- */
- //inline void switchToInactive();
-
- /** Switches out the stage stage. */
- void switchOut();
-
- /** Takes over from another CPU's thread. */
- virtual void takeOverFrom();
-
- /** Ticks stage, processing all input signals and executing as many
- * instructions as possible.
- */
- void tick();
-
- /** Set a resource stall in the pipeline-stage */
- void setResStall(ResReqPtr res_req, ThreadID tid);
-
- /** Unset a resource stall in the pipeline-stage */
- void unsetResStall(ResReqPtr res_req, ThreadID tid);
-
- /** Remove all stall signals for a particular thread; */
- void removeStalls(ThreadID tid);
-
- /** Is there room in the stage buffer? */
- int stageBufferAvail();
-
- protected:
- /** Evaluate Stage Conditions and then process stage */
- virtual void processStage(bool &status_change);
-
- /** Determines what to do based on stage's current status.
- * @param status_change stage() sets this variable if there was a status
- * change (ie switching from from blocking to unblocking).
- * @param tid Thread id to stage instructions from.
- */
- void processThread(bool &status_change, ThreadID tid);
-
- /** Processes instructions from fetch and passes them on to rename.
- * Decoding of instructions actually happens when they are created in
- * fetch, so this function mostly checks if PC-relative branches are
- * correct.
- */
- virtual void processInsts(ThreadID tid);
-
- /** Process all resources on an instruction's resource schedule */
- bool processInstSchedule(DynInstPtr inst, int &reqs_processed);
-
- /** Is there room in the next stage buffer for this instruction? */
- bool canSendInstToStage(unsigned stage_num);
-
- /** Send an instruction to the next stage buffer */
- bool sendInstToNextStage(DynInstPtr inst);
-
- /** Total size of all skid buffers */
- int skidSize();
-
- /** Returns if all of the skid buffers are empty. */
- bool skidsEmpty();
-
- /** Updates overall stage status based on all of the threads' statuses. */
- void updateStatus();
-
- /** Separates instructions from fetch into individual lists of instructions
- * sorted by thread.
- */
- void sortInsts();
-
- /** Reads all stall signals from the backwards communication timebuffer. */
- void readStallSignals(ThreadID tid);
-
- /** Checks all input signals and updates stage's status appropriately. */
- bool checkSignalsAndUpdate(ThreadID tid);
-
- /** Checks all stall signals, and returns if any are true. */
- bool checkStall(ThreadID tid) const;
-
- /** Returns if there any instructions from the previous stage
- * on this cycle.
- */
- inline bool prevStageInstsValid();
-
- /** Switches stage to blocking, and signals back that stage has
- * become blocked.
- * @return Returns true if there is a status change.
- */
- bool block(ThreadID tid);
-
- void blockDueToBuffer(ThreadID tid);
-
- /** Switches stage to unblocking if the skid buffer is empty, and
- * signals back that stage has unblocked.
- * @return Returns true if there is a status change.
- */
- bool unblock(ThreadID tid);
-
-
- public:
- void activateThread(ThreadID tid);
-
- /** Setup Squashing Information to be passed back thru the pipeline */
- void setupSquash(DynInstPtr inst, ThreadID tid);
-
- virtual void squashDueToMemStall(InstSeqNum seq_num, ThreadID tid);
-
- /** Perform squash of instructions above seq_num */
- virtual void squash(InstSeqNum squash_num, ThreadID tid);
-
- /** Squash instructions from stage buffer */
- void squashPrevStageInsts(InstSeqNum squash_seq_num, ThreadID tid);
-
- void dumpInsts();
-
- protected:
- /** CPU interface. */
- InOrderCPU *cpu;
-
- Trace::InOrderTrace *tracer;
-
- /** List of active thread ids */
- std::list<ThreadID> *activeThreads;
-
- /** Buffer of instructions switched out to mem-stall.
- * Only used when using SwitchOnCacheMiss threading model
- * Used as 1-to-1 mapping between ThreadID and Entry.
- */
- std::vector<DynInstPtr> switchedOutBuffer;
- std::vector<bool> switchedOutValid;
-
- /** Instructions that we've processed this tick
- * NOTE: "Processed" means completed at least 1 instruction request
- */
- unsigned instsProcessed;
-
- /** Skid buffer between previous stage and this one. */
- std::list<DynInstPtr> skidBuffer[ThePipeline::MaxThreads];
-
- /** Instruction used to signify that there is no *real* instruction in
- * buffer slot */
- DynInstPtr dummyBufferInst;
-
- /** SeqNum of Squashing Branch Delay Instruction (used for MIPS) */
- Addr bdelayDoneSeqNum[ThePipeline::MaxThreads];
-
- /** Tells when their is a pending delay slot inst. to send
- * to rename. If there is, then wait squash after the next
- * instruction (used for MIPS).
- */
- bool squashAfterDelaySlot[ThePipeline::MaxThreads];
-
- /** Instruction used for squashing branch (used for MIPS) */
- DynInstPtr squashInst[ThePipeline::MaxThreads];
-
- /** Maximum size of the inter-stage buffer connecting the previous stage to
- * this stage (which we call a skid buffer) */
- unsigned stageBufferMax;
-
- /** Variable that tracks if stage has written to the time buffer this
- * cycle. Used to tell CPU if there is activity this cycle.
- */
- bool wroteToTimeBuffer;
-
- /** Index of instructions being sent to the next stage. */
- unsigned toNextStageIndex;
-
- /** The last stage that this particular stage should look for stalls */
- int lastStallingStage[ThePipeline::MaxThreads];
-
- /** Time buffer interface. */
- TimeBuffer<TimeStruct> *timeBuffer;
-
- public:
- /** Wire to get rename's output from backwards time buffer. */
- TimeBuffer<TimeStruct>::wire fromNextStages;
-
- /** Wire to get iew's information from backwards time buffer. */
- TimeBuffer<TimeStruct>::wire toPrevStages;
-
- /** Instruction queue linking previous stage */
- TimeBuffer<InterStageStruct> *prevStageQueue;
-
- /** Wire to get the previous stage's. */
- TimeBuffer<InterStageStruct>::wire prevStage;
-
- /** Instruction queue linking next stage */
- TimeBuffer<InterStageStruct> *nextStageQueue;
-
- /** Wire to write to the next stage */
- TimeBuffer<InterStageStruct>::wire nextStage;
-
- /** Is Previous Stage Valid? */
- bool prevStageValid;
-
- /** Is Next Stage Valid? */
- bool nextStageValid;
-
- bool idle;
-
- /** Source of possible stalls. */
- struct Stalls {
- bool stage[ThePipeline::NumStages];
- std::vector<ResReqPtr> resources;
- };
-
- /** Tracks stage/resource stalls */
- Stalls stalls[ThePipeline::MaxThreads];
-
- /** Number of cycles 0 instruction(s) are processed. */
- Stats::Scalar idleCycles;
-
- /** Number of cycles 1+ instructions are processed. */
- Stats::Scalar runCycles;
-
- /** Percentage of cycles 1+ instructions are processed. */
- Stats::Formula utilization;
-
-
-};
-
-#endif