fetch.hh

来自「M5,一个功能强大的多处理器系统模拟器.很多针对处理器架构,性能的研究都使用它作」· HH 代码 · 共 486 行 · 第 1/2 页

HH
486
字号
    /** Squashes a specific thread and resets the PC. */    inline void doSquash(const Addr &new_PC, const Addr &new_NPC,                         const Addr &new_MicroPC, unsigned tid);    /** Squashes a specific thread and resets the PC. Also tells the CPU to     * remove any instructions between fetch and decode that should be sqaushed.     */    void squashFromDecode(const Addr &new_PC, const Addr &new_NPC,                          const Addr &new_MicroPC,                          const InstSeqNum &seq_num, unsigned tid);    /** Checks if a thread is stalled. */    bool checkStall(unsigned tid) const;    /** Updates overall fetch stage status; to be called at the end of each     * cycle. */    FetchStatus updateFetchStatus();  public:    /** Squashes a specific thread and resets the PC. Also tells the CPU to     * remove any instructions that are not in the ROB. The source of this     * squash should be the commit stage.     */    void squash(const Addr &new_PC, const Addr &new_NPC,                const Addr &new_MicroPC,                const InstSeqNum &seq_num, unsigned tid);    /** Ticks the fetch stage, processing all inputs signals and fetching     * as many instructions as possible.     */    void tick();    /** Checks all input signals and updates the status as necessary.     *  @return: Returns if the status has changed due to input signals.     */    bool checkSignalsAndUpdate(unsigned tid);    /** Does the actual fetching of instructions and passing them on to the     * next stage.     * @param status_change fetch() sets this variable if there was a status     * change (ie switching to IcacheMissStall).     */    void fetch(bool &status_change);    /** Align a PC to the start of an I-cache block. */    Addr icacheBlockAlignPC(Addr addr)    {        addr = TheISA::realPCToFetchPC(addr);        return (addr & ~(cacheBlkMask));    }  private:    /** Handles retrying the fetch access. */    void recvRetry();    /** Returns the appropriate thread to fetch, given the fetch policy. */    int getFetchingThread(FetchPriority &fetch_priority);    /** Returns the appropriate thread to fetch using a round robin policy. */    int roundRobin();    /** Returns the appropriate thread to fetch using the IQ count policy. */    int iqCount();    /** Returns the appropriate thread to fetch using the LSQ count policy. */    int lsqCount();    /** Returns the appropriate thread to fetch using the branch count policy. */    int branchCount();  private:    /** Pointer to the O3CPU. */    O3CPU *cpu;    /** Time buffer interface. */    TimeBuffer<TimeStruct> *timeBuffer;    /** Wire to get decode's information from backwards time buffer. */    typename TimeBuffer<TimeStruct>::wire fromDecode;    /** Wire to get rename's information from backwards time buffer. */    typename TimeBuffer<TimeStruct>::wire fromRename;    /** Wire to get iew's information from backwards time buffer. */    typename TimeBuffer<TimeStruct>::wire fromIEW;    /** Wire to get commit's information from backwards time buffer. */    typename TimeBuffer<TimeStruct>::wire fromCommit;    /** Internal fetch instruction queue. */    TimeBuffer<FetchStruct> *fetchQueue;    //Might be annoying how this name is different than the queue.    /** Wire used to write any information heading to decode. */    typename TimeBuffer<FetchStruct>::wire toDecode;    /** Icache interface. */    IcachePort *icachePort;    /** BPredUnit. */    BPredUnit branchPred;    /** Predecoder. */    TheISA::Predecoder predecoder;    /** Per-thread fetch PC. */    Addr PC[Impl::MaxThreads];    /** Per-thread fetch micro PC. */    Addr microPC[Impl::MaxThreads];    /** Per-thread next PC. */    Addr nextPC[Impl::MaxThreads];    /** Memory request used to access cache. */    RequestPtr memReq[Impl::MaxThreads];    /** Variable that tracks if fetch has written to the time buffer this     * cycle. Used to tell CPU if there is activity this cycle.     */    bool wroteToTimeBuffer;    /** Tracks how many instructions has been fetched this cycle. */    int numInst;    /** Source of possible stalls. */    struct Stalls {        bool decode;        bool rename;        bool iew;        bool commit;    };    /** Tracks which stages are telling fetch to stall. */    Stalls stalls[Impl::MaxThreads];    /** Decode to fetch delay, in ticks. */    unsigned decodeToFetchDelay;    /** Rename to fetch delay, in ticks. */    unsigned renameToFetchDelay;    /** IEW to fetch delay, in ticks. */    unsigned iewToFetchDelay;    /** Commit to fetch delay, in ticks. */    unsigned commitToFetchDelay;    /** The width of fetch in instructions. */    unsigned fetchWidth;    /** Is the cache blocked?  If so no threads can access it. */    bool cacheBlocked;    /** The packet that is waiting to be retried. */    PacketPtr retryPkt;    /** The thread that is waiting on the cache to tell fetch to retry. */    int retryTid;    /** Cache block size. */    int cacheBlkSize;    /** Mask to get a cache block's address. */    Addr cacheBlkMask;    /** The cache line being fetched. */    uint8_t *cacheData[Impl::MaxThreads];    /** The PC of the cacheline that has been loaded. */    Addr cacheDataPC[Impl::MaxThreads];    /** Whether or not the cache data is valid. */    bool cacheDataValid[Impl::MaxThreads];    /** Size of instructions. */    int instSize;    /** Icache stall statistics. */    Counter lastIcacheStall[Impl::MaxThreads];    /** List of Active Threads */    std::list<unsigned> *activeThreads;    /** Number of threads. */    unsigned numThreads;    /** Number of threads that are actively fetching. */    unsigned numFetchingThreads;    /** Thread ID being fetched. */    int threadFetched;    /** Checks if there is an interrupt pending.  If there is, fetch     * must stop once it is not fetching PAL instructions.     */    bool interruptPending;    /** Is there a drain pending. */    bool drainPending;    /** Records if fetch is switched out. */    bool switchedOut;    // @todo: Consider making these vectors and tracking on a per thread basis.    /** Stat for total number of cycles stalled due to an icache miss. */    Stats::Scalar<> icacheStallCycles;    /** Stat for total number of fetched instructions. */    Stats::Scalar<> fetchedInsts;    /** Total number of fetched branches. */    Stats::Scalar<> fetchedBranches;    /** Stat for total number of predicted branches. */    Stats::Scalar<> predictedBranches;    /** Stat for total number of cycles spent fetching. */    Stats::Scalar<> fetchCycles;    /** Stat for total number of cycles spent squashing. */    Stats::Scalar<> fetchSquashCycles;    /** Stat for total number of cycles spent blocked due to other stages in     * the pipeline.     */    Stats::Scalar<> fetchIdleCycles;    /** Total number of cycles spent blocked. */    Stats::Scalar<> fetchBlockedCycles;    /** Total number of cycles spent in any other state. */    Stats::Scalar<> fetchMiscStallCycles;    /** Stat for total number of fetched cache lines. */    Stats::Scalar<> fetchedCacheLines;    /** Total number of outstanding icache accesses that were dropped     * due to a squash.     */    Stats::Scalar<> fetchIcacheSquashes;    /** Distribution of number of instructions fetched each cycle. */    Stats::Distribution<> fetchNisnDist;    /** Rate of how often fetch was idle. */    Stats::Formula idleRate;    /** Number of branch fetches per cycle. */    Stats::Formula branchRate;    /** Number of instruction fetched per cycle. */    Stats::Formula fetchRate;};#endif //__CPU_O3_FETCH_HH__

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?