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 + -
显示快捷键?