fetch.hh revision 4302:c45514c856b0
16019Shines@cs.fsu.edu/* 212509Schuan.zhu@arm.com * Copyright (c) 2004-2006 The Regents of The University of Michigan 37189Sgblack@eecs.umich.edu * All rights reserved. 47189Sgblack@eecs.umich.edu * 57189Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without 67189Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are 77189Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright 87189Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer; 97189Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright 107189Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the 117189Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution; 127189Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its 137189Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from 146019Shines@cs.fsu.edu * this software without specific prior written permission. 156019Shines@cs.fsu.edu * 166019Shines@cs.fsu.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 176019Shines@cs.fsu.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 186019Shines@cs.fsu.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 196019Shines@cs.fsu.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 206019Shines@cs.fsu.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 216019Shines@cs.fsu.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 226019Shines@cs.fsu.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 236019Shines@cs.fsu.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 246019Shines@cs.fsu.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 256019Shines@cs.fsu.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 266019Shines@cs.fsu.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 276019Shines@cs.fsu.edu * 286019Shines@cs.fsu.edu * Authors: Kevin Lim 296019Shines@cs.fsu.edu * Korey Sewell 306019Shines@cs.fsu.edu */ 316019Shines@cs.fsu.edu 326019Shines@cs.fsu.edu#ifndef __CPU_O3_FETCH_HH__ 336019Shines@cs.fsu.edu#define __CPU_O3_FETCH_HH__ 346019Shines@cs.fsu.edu 356019Shines@cs.fsu.edu#include "arch/utility.hh" 366019Shines@cs.fsu.edu#include "arch/predecoder.hh" 376019Shines@cs.fsu.edu#include "base/statistics.hh" 386019Shines@cs.fsu.edu#include "base/timebuf.hh" 396019Shines@cs.fsu.edu#include "cpu/pc_event.hh" 406019Shines@cs.fsu.edu#include "mem/packet.hh" 416735Sgblack@eecs.umich.edu#include "mem/port.hh" 426735Sgblack@eecs.umich.edu#include "sim/eventq.hh" 4310037SARM gem5 Developers 4410037SARM gem5 Developers/** 456019Shines@cs.fsu.edu * DefaultFetch class handles both single threaded and SMT fetch. Its 466019Shines@cs.fsu.edu * width is specified by the parameters; each cycle it tries to fetch 476019Shines@cs.fsu.edu * that many instructions. It supports using a branch predictor to 486019Shines@cs.fsu.edu * predict direction and targets. 496019Shines@cs.fsu.edu * It supports the idling functionality of the CPU by indicating to 507362Sgblack@eecs.umich.edu * the CPU when it is active and inactive. 5110037SARM gem5 Developers */ 526735Sgblack@eecs.umich.edutemplate <class Impl> 5312334Sgabeblack@google.comclass DefaultFetch 546019Shines@cs.fsu.edu{ 558782Sgblack@eecs.umich.edu public: 566019Shines@cs.fsu.edu /** Typedefs from Impl. */ 576019Shines@cs.fsu.edu typedef typename Impl::CPUPol CPUPol; 586019Shines@cs.fsu.edu typedef typename Impl::DynInst DynInst; 596019Shines@cs.fsu.edu typedef typename Impl::DynInstPtr DynInstPtr; 606019Shines@cs.fsu.edu typedef typename Impl::O3CPU O3CPU; 6111294Sandreas.hansson@arm.com typedef typename Impl::Params Params; 626019Shines@cs.fsu.edu 637362Sgblack@eecs.umich.edu /** Typedefs from the CPU policy. */ 646019Shines@cs.fsu.edu typedef typename CPUPol::BPredUnit BPredUnit; 656019Shines@cs.fsu.edu typedef typename CPUPol::FetchStruct FetchStruct; 6610037SARM gem5 Developers typedef typename CPUPol::TimeStruct TimeStruct; 6710037SARM gem5 Developers 6810037SARM gem5 Developers /** Typedefs from ISA. */ 6910037SARM gem5 Developers typedef TheISA::MachInst MachInst; 7010037SARM gem5 Developers typedef TheISA::ExtMachInst ExtMachInst; 7110037SARM gem5 Developers 7210037SARM gem5 Developers /** IcachePort class for DefaultFetch. Handles doing the 7310037SARM gem5 Developers * communication with the cache/memory. 7410037SARM gem5 Developers */ 7510037SARM gem5 Developers class IcachePort : public Port 7612402Sgiacomo.travaglini@arm.com { 7712402Sgiacomo.travaglini@arm.com protected: 786735Sgblack@eecs.umich.edu /** Pointer to fetch. */ 7910037SARM gem5 Developers DefaultFetch<Impl> *fetch; 806735Sgblack@eecs.umich.edu 816019Shines@cs.fsu.edu public: 8210037SARM gem5 Developers /** Default constructor. */ 8310037SARM gem5 Developers IcachePort(DefaultFetch<Impl> *_fetch) 8410037SARM gem5 Developers : Port(_fetch->name() + "-iport"), fetch(_fetch) 8510037SARM gem5 Developers { } 8610037SARM gem5 Developers 877362Sgblack@eecs.umich.edu bool snoopRangeSent; 8810037SARM gem5 Developers 8910037SARM gem5 Developers virtual void setPeer(Port *port); 9010037SARM gem5 Developers 9110037SARM gem5 Developers protected: 9210037SARM gem5 Developers /** Atomic version of receive. Panics. */ 9310037SARM gem5 Developers virtual Tick recvAtomic(PacketPtr pkt); 9410037SARM gem5 Developers 9510037SARM gem5 Developers /** Functional version of receive. Panics. */ 9610037SARM gem5 Developers virtual void recvFunctional(PacketPtr pkt); 9710037SARM gem5 Developers 9810037SARM gem5 Developers /** Receives status change. Other than range changing, panics. */ 9910037SARM gem5 Developers virtual void recvStatusChange(Status status); 10010037SARM gem5 Developers 10110037SARM gem5 Developers /** Returns the address ranges of this device. */ 10210037SARM gem5 Developers virtual void getDeviceAddressRanges(AddrRangeList &resp, 1037611SGene.Wu@arm.com AddrRangeList &snoop) 10410037SARM gem5 Developers { resp.clear(); snoop.clear(); snoop.push_back(RangeSize(0,0)); } 10510037SARM gem5 Developers 10610037SARM gem5 Developers /** Timing version of receive. Handles setting fetch to the 10710037SARM gem5 Developers * proper status to start fetching. */ 10810037SARM gem5 Developers virtual bool recvTiming(PacketPtr pkt); 10910037SARM gem5 Developers 11010037SARM gem5 Developers /** Handles doing a retry of a failed fetch. */ 11110037SARM gem5 Developers virtual void recvRetry(); 11210037SARM gem5 Developers }; 11310037SARM gem5 Developers 11410037SARM gem5 Developers 11510037SARM gem5 Developers public: 11610037SARM gem5 Developers /** Overall fetch status. Used to determine if the CPU can 11710037SARM gem5 Developers * deschedule itsef due to a lack of activity. 11810037SARM gem5 Developers */ 11910037SARM gem5 Developers enum FetchStatus { 12010037SARM gem5 Developers Active, 12110037SARM gem5 Developers Inactive 12210037SARM gem5 Developers }; 12310037SARM gem5 Developers 12410037SARM gem5 Developers /** Individual thread status. */ 12510037SARM gem5 Developers enum ThreadStatus { 12610037SARM gem5 Developers Running, 12710037SARM gem5 Developers Idle, 12810037SARM gem5 Developers Squashing, 12910037SARM gem5 Developers Blocked, 13010037SARM gem5 Developers Fetching, 13110037SARM gem5 Developers TrapPending, 13210037SARM gem5 Developers QuiescePending, 13310037SARM gem5 Developers SwitchOut, 13410037SARM gem5 Developers IcacheWaitResponse, 13510037SARM gem5 Developers IcacheWaitRetry, 13610037SARM gem5 Developers IcacheAccessComplete 13710037SARM gem5 Developers }; 13810037SARM gem5 Developers 13910037SARM gem5 Developers /** Fetching Policy, Add new policies here.*/ 14010037SARM gem5 Developers enum FetchPriority { 1417362Sgblack@eecs.umich.edu SingleThread, 1427362Sgblack@eecs.umich.edu RoundRobin, 1436735Sgblack@eecs.umich.edu Branch, 1446735Sgblack@eecs.umich.edu IQ, 1456735Sgblack@eecs.umich.edu LSQ 14610037SARM gem5 Developers }; 1476735Sgblack@eecs.umich.edu 14810037SARM gem5 Developers private: 14910037SARM gem5 Developers /** Fetch status. */ 15010037SARM gem5 Developers FetchStatus _status; 15110037SARM gem5 Developers 15210037SARM gem5 Developers /** Per-thread status. */ 15310037SARM gem5 Developers ThreadStatus fetchStatus[Impl::MaxThreads]; 15410037SARM gem5 Developers 1556735Sgblack@eecs.umich.edu /** Fetch policy. */ 15610037SARM gem5 Developers FetchPriority fetchPolicy; 1576735Sgblack@eecs.umich.edu 1586735Sgblack@eecs.umich.edu /** List that has the threads organized by priority. */ 15910037SARM gem5 Developers std::list<unsigned> priorityList; 16010037SARM gem5 Developers 16110037SARM gem5 Developers public: 16210037SARM gem5 Developers /** DefaultFetch constructor. */ 16310037SARM gem5 Developers DefaultFetch(Params *params); 16410037SARM gem5 Developers 16510037SARM gem5 Developers /** Returns the name of fetch. */ 1666735Sgblack@eecs.umich.edu std::string name() const; 1676735Sgblack@eecs.umich.edu 16810037SARM gem5 Developers /** Registers statistics. */ 16910037SARM gem5 Developers void regStats(); 17010037SARM gem5 Developers 17110037SARM gem5 Developers /** Returns the icache port. */ 17210037SARM gem5 Developers Port *getIcachePort() { return icachePort; } 1736735Sgblack@eecs.umich.edu 17412517Srekai.gonzalezalberquilla@arm.com /** Sets CPU pointer. */ 17512517Srekai.gonzalezalberquilla@arm.com void setCPU(O3CPU *cpu_ptr); 17612517Srekai.gonzalezalberquilla@arm.com 17712517Srekai.gonzalezalberquilla@arm.com /** Sets the main backwards communication time buffer pointer. */ 17812517Srekai.gonzalezalberquilla@arm.com void setTimeBuffer(TimeBuffer<TimeStruct> *time_buffer); 17912517Srekai.gonzalezalberquilla@arm.com 18012517Srekai.gonzalezalberquilla@arm.com /** Sets pointer to list of active threads. */ 18112517Srekai.gonzalezalberquilla@arm.com void setActiveThreads(std::list<unsigned> *at_ptr); 18212517Srekai.gonzalezalberquilla@arm.com 18312517Srekai.gonzalezalberquilla@arm.com /** Sets pointer to time buffer used to communicate to the next stage. */ 18412517Srekai.gonzalezalberquilla@arm.com void setFetchQueue(TimeBuffer<FetchStruct> *fq_ptr); 18512517Srekai.gonzalezalberquilla@arm.com 18612517Srekai.gonzalezalberquilla@arm.com /** Initialize stage. */ 18712517Srekai.gonzalezalberquilla@arm.com void initStage(); 18812517Srekai.gonzalezalberquilla@arm.com 18912517Srekai.gonzalezalberquilla@arm.com /** Tells the fetch stage that the Icache is set. */ 1906735Sgblack@eecs.umich.edu void setIcache(); 1916735Sgblack@eecs.umich.edu 19210037SARM gem5 Developers /** Processes cache completion event. */ 19310537Sandreas.hansson@arm.com void processCacheCompletion(PacketPtr pkt); 19412402Sgiacomo.travaglini@arm.com 19510037SARM gem5 Developers /** Begins the drain of the fetch stage. */ 19610037SARM gem5 Developers bool drain(); 19710037SARM gem5 Developers 19810037SARM gem5 Developers /** Resumes execution after a drain. */ 19910037SARM gem5 Developers void resume(); 20010037SARM gem5 Developers 20110037SARM gem5 Developers /** Tells fetch stage to prepare to be switched out. */ 20210037SARM gem5 Developers void switchOut(); 20310417Sandreas.hansson@arm.com 20412176Sandreas.sandberg@arm.com /** Takes over from another CPU's thread. */ 20510417Sandreas.hansson@arm.com void takeOverFrom(); 20610417Sandreas.hansson@arm.com 20710037SARM gem5 Developers /** Checks if the fetch stage is switched out. */ 2086735Sgblack@eecs.umich.edu bool isSwitchedOut() { return switchedOut; } 20910037SARM gem5 Developers 21012511Schuan.zhu@arm.com /** Tells fetch to wake up from a quiesce instruction. */ 2116735Sgblack@eecs.umich.edu void wakeFromQuiesce(); 21210037SARM gem5 Developers 21310037SARM gem5 Developers private: 21410037SARM gem5 Developers /** Changes the status of this stage to active, and indicates this 21510037SARM gem5 Developers * to the CPU. 21610037SARM gem5 Developers */ 21710037SARM gem5 Developers inline void switchToActive(); 21810037SARM gem5 Developers 21910037SARM gem5 Developers /** Changes the status of this stage to inactive, and indicates 22010037SARM gem5 Developers * this to the CPU. 22110037SARM gem5 Developers */ 22210037SARM gem5 Developers inline void switchToInactive(); 22310037SARM gem5 Developers 22410037SARM gem5 Developers /** 2256019Shines@cs.fsu.edu * Looks up in the branch predictor to see if the next PC should be 2266019Shines@cs.fsu.edu * either next PC+=MachInst or a branch target. 2276735Sgblack@eecs.umich.edu * @param next_PC Next PC variable passed in by reference. It is 2287362Sgblack@eecs.umich.edu * expected to be set to the current PC; it will be updated with what 2296019Shines@cs.fsu.edu * the next PC will be. 2306735Sgblack@eecs.umich.edu * @param next_NPC Used for ISAs which use delay slots. 2316735Sgblack@eecs.umich.edu * @return Whether or not a branch was predicted as taken. 2326735Sgblack@eecs.umich.edu */ 2336019Shines@cs.fsu.edu bool lookupAndUpdateNextPC(DynInstPtr &inst, Addr &next_PC, Addr &next_NPC); 23410037SARM gem5 Developers 23510037SARM gem5 Developers /** 23612176Sandreas.sandberg@arm.com * Fetches the cache line that contains fetch_PC. Returns any 23712176Sandreas.sandberg@arm.com * fault that happened. Puts the data into the class variable 23812176Sandreas.sandberg@arm.com * cacheData. 23910037SARM gem5 Developers * @param fetch_PC The PC address that is being fetched from. 24012511Schuan.zhu@arm.com * @param ret_fault The fault reference that will be set to the result of 24110037SARM gem5 Developers * the icache access. 24212176Sandreas.sandberg@arm.com * @param tid Thread id. 24312176Sandreas.sandberg@arm.com * @return Any fault that occured. 24412176Sandreas.sandberg@arm.com */ 24512176Sandreas.sandberg@arm.com bool fetchCacheLine(Addr fetch_PC, Fault &ret_fault, unsigned tid); 24612176Sandreas.sandberg@arm.com 24712176Sandreas.sandberg@arm.com /** Squashes a specific thread and resets the PC. */ 24812176Sandreas.sandberg@arm.com inline void doSquash(const Addr &new_PC, const Addr &new_NPC, unsigned tid); 24912176Sandreas.sandberg@arm.com 25012176Sandreas.sandberg@arm.com /** Squashes a specific thread and resets the PC. Also tells the CPU to 25112176Sandreas.sandberg@arm.com * remove any instructions between fetch and decode that should be sqaushed. 25212176Sandreas.sandberg@arm.com */ 25312176Sandreas.sandberg@arm.com void squashFromDecode(const Addr &new_PC, const Addr &new_NPC, 25412176Sandreas.sandberg@arm.com const InstSeqNum &seq_num, unsigned tid); 25512176Sandreas.sandberg@arm.com 25612176Sandreas.sandberg@arm.com /** Checks if a thread is stalled. */ 25712176Sandreas.sandberg@arm.com bool checkStall(unsigned tid) const; 25812176Sandreas.sandberg@arm.com 25912176Sandreas.sandberg@arm.com /** Updates overall fetch stage status; to be called at the end of each 2606019Shines@cs.fsu.edu * cycle. */ 2616019Shines@cs.fsu.edu FetchStatus updateFetchStatus(); 2627400SAli.Saidi@ARM.com 2637400SAli.Saidi@ARM.com public: 2647400SAli.Saidi@ARM.com /** Squashes a specific thread and resets the PC. Also tells the CPU to 26510417Sandreas.hansson@arm.com * remove any instructions that are not in the ROB. The source of this 26612176Sandreas.sandberg@arm.com * squash should be the commit stage. 2677400SAli.Saidi@ARM.com */ 2687189Sgblack@eecs.umich.edu void squash(const Addr &new_PC, const Addr &new_NPC, 2697362Sgblack@eecs.umich.edu const InstSeqNum &seq_num, 2707189Sgblack@eecs.umich.edu bool squash_delay_slot, unsigned tid); 2717189Sgblack@eecs.umich.edu 2727189Sgblack@eecs.umich.edu /** Ticks the fetch stage, processing all inputs signals and fetching 2737640Sgblack@eecs.umich.edu * as many instructions as possible. 27410037SARM gem5 Developers */ 27510205SAli.Saidi@ARM.com void tick(); 2767189Sgblack@eecs.umich.edu 2777189Sgblack@eecs.umich.edu /** Checks all input signals and updates the status as necessary. 2787189Sgblack@eecs.umich.edu * @return: Returns if the status has changed due to input signals. 2797189Sgblack@eecs.umich.edu */ 2807640Sgblack@eecs.umich.edu bool checkSignalsAndUpdate(unsigned tid); 2817640Sgblack@eecs.umich.edu 28210037SARM gem5 Developers /** Does the actual fetching of instructions and passing them on to the 28310205SAli.Saidi@ARM.com * next stage. 28410205SAli.Saidi@ARM.com * @param status_change fetch() sets this variable if there was a status 28510037SARM gem5 Developers * change (ie switching to IcacheMissStall). 28610205SAli.Saidi@ARM.com */ 28710205SAli.Saidi@ARM.com void fetch(bool &status_change); 28810037SARM gem5 Developers 28910205SAli.Saidi@ARM.com /** Align a PC to the start of an I-cache block. */ 29010205SAli.Saidi@ARM.com Addr icacheBlockAlignPC(Addr addr) 2918782Sgblack@eecs.umich.edu { 2927189Sgblack@eecs.umich.edu addr = TheISA::realPCToFetchPC(addr); 29310417Sandreas.hansson@arm.com return (addr & ~(cacheBlkMask)); 29412176Sandreas.sandberg@arm.com } 29512176Sandreas.sandberg@arm.com 29612176Sandreas.sandberg@arm.com private: 29712176Sandreas.sandberg@arm.com /** Handles retrying the fetch access. */ 2987189Sgblack@eecs.umich.edu void recvRetry(); 2997189Sgblack@eecs.umich.edu 3007362Sgblack@eecs.umich.edu /** Returns the appropriate thread to fetch, given the fetch policy. */ 3017197Sgblack@eecs.umich.edu int getFetchingThread(FetchPriority &fetch_priority); 3027197Sgblack@eecs.umich.edu 30310037SARM gem5 Developers /** Returns the appropriate thread to fetch using a round robin policy. */ 3047197Sgblack@eecs.umich.edu int roundRobin(); 30510037SARM gem5 Developers 30610037SARM gem5 Developers /** Returns the appropriate thread to fetch using the IQ count policy. */ 30710037SARM gem5 Developers int iqCount(); 30810037SARM gem5 Developers 3098782Sgblack@eecs.umich.edu /** Returns the appropriate thread to fetch using the LSQ count policy. */ 3107197Sgblack@eecs.umich.edu int lsqCount(); 31110417Sandreas.hansson@arm.com 31212176Sandreas.sandberg@arm.com /** Returns the appropriate thread to fetch using the branch count policy. */ 31312176Sandreas.sandberg@arm.com int branchCount(); 31412176Sandreas.sandberg@arm.com 31512176Sandreas.sandberg@arm.com private: 31610037SARM gem5 Developers /** Pointer to the O3CPU. */ 31710037SARM gem5 Developers O3CPU *cpu; 31810037SARM gem5 Developers 31910037SARM gem5 Developers /** Time buffer interface. */ 32010037SARM gem5 Developers TimeBuffer<TimeStruct> *timeBuffer; 32110037SARM gem5 Developers 32210037SARM gem5 Developers /** Wire to get decode's information from backwards time buffer. */ 32310037SARM gem5 Developers typename TimeBuffer<TimeStruct>::wire fromDecode; 32410037SARM gem5 Developers 32510417Sandreas.hansson@arm.com /** Wire to get rename's information from backwards time buffer. */ 32612176Sandreas.sandberg@arm.com typename TimeBuffer<TimeStruct>::wire fromRename; 32712176Sandreas.sandberg@arm.com 32812176Sandreas.sandberg@arm.com /** Wire to get iew's information from backwards time buffer. */ 32910037SARM gem5 Developers typename TimeBuffer<TimeStruct>::wire fromIEW; 33010037SARM gem5 Developers 33110037SARM gem5 Developers /** Wire to get commit's information from backwards time buffer. */ 33210037SARM gem5 Developers typename TimeBuffer<TimeStruct>::wire fromCommit; 33310037SARM gem5 Developers 33410037SARM gem5 Developers /** Internal fetch instruction queue. */ 33510037SARM gem5 Developers TimeBuffer<FetchStruct> *fetchQueue; 33610037SARM gem5 Developers 33710037SARM gem5 Developers //Might be annoying how this name is different than the queue. 33810037SARM gem5 Developers /** Wire used to write any information heading to decode. */ 33910037SARM gem5 Developers typename TimeBuffer<FetchStruct>::wire toDecode; 34010037SARM gem5 Developers 34110037SARM gem5 Developers /** Icache interface. */ 34210037SARM gem5 Developers IcachePort *icachePort; 34310037SARM gem5 Developers 34412509Schuan.zhu@arm.com /** BPredUnit. */ 34512509Schuan.zhu@arm.com BPredUnit branchPred; 34612176Sandreas.sandberg@arm.com 34710037SARM gem5 Developers /** Predecoder. */ 34810037SARM gem5 Developers TheISA::Predecoder predecoder; 34910037SARM gem5 Developers 35010037SARM gem5 Developers /** Per-thread fetch PC. */ 35110037SARM gem5 Developers Addr PC[Impl::MaxThreads]; 35210037SARM gem5 Developers 35310037SARM gem5 Developers /** Per-thread next PC. */ 35410037SARM gem5 Developers Addr nextPC[Impl::MaxThreads]; 35510037SARM gem5 Developers 35610037SARM gem5 Developers /** Per-thread next Next PC. 35710037SARM gem5 Developers * This is not a real register but is used for 35810037SARM gem5 Developers * architectures that use a branch-delay slot. 35910037SARM gem5 Developers * (such as MIPS or Sparc) 36010037SARM gem5 Developers */ 36110037SARM gem5 Developers Addr nextNPC[Impl::MaxThreads]; 36212176Sandreas.sandberg@arm.com 36310037SARM gem5 Developers /** Memory request used to access cache. */ 36410037SARM gem5 Developers RequestPtr memReq[Impl::MaxThreads]; 36510037SARM gem5 Developers 36610037SARM gem5 Developers /** Variable that tracks if fetch has written to the time buffer this 36710037SARM gem5 Developers * cycle. Used to tell CPU if there is activity this cycle. 36810037SARM gem5 Developers */ 36911576SDylan.Johnson@ARM.com bool wroteToTimeBuffer; 37012176Sandreas.sandberg@arm.com 37110037SARM gem5 Developers /** Tracks how many instructions has been fetched this cycle. */ 37210037SARM gem5 Developers int numInst; 37310037SARM gem5 Developers 37410037SARM gem5 Developers /** Source of possible stalls. */ 37510037SARM gem5 Developers struct Stalls { 37610037SARM gem5 Developers bool decode; 37710037SARM gem5 Developers bool rename; 37810037SARM gem5 Developers bool iew; 37910037SARM gem5 Developers bool commit; 38010037SARM gem5 Developers }; 38110037SARM gem5 Developers 38210037SARM gem5 Developers /** Tracks which stages are telling fetch to stall. */ 38310037SARM gem5 Developers Stalls stalls[Impl::MaxThreads]; 38410037SARM gem5 Developers 38510037SARM gem5 Developers /** Decode to fetch delay, in ticks. */ 38612176Sandreas.sandberg@arm.com unsigned decodeToFetchDelay; 3877197Sgblack@eecs.umich.edu 3887362Sgblack@eecs.umich.edu /** Rename to fetch delay, in ticks. */ 3897362Sgblack@eecs.umich.edu unsigned renameToFetchDelay; 3907362Sgblack@eecs.umich.edu 3917362Sgblack@eecs.umich.edu /** IEW to fetch delay, in ticks. */ 3927362Sgblack@eecs.umich.edu unsigned iewToFetchDelay; 39310037SARM gem5 Developers 39410037SARM gem5 Developers /** Commit to fetch delay, in ticks. */ 39510037SARM gem5 Developers unsigned commitToFetchDelay; 39610037SARM gem5 Developers 39710037SARM gem5 Developers /** The width of fetch in instructions. */ 39810037SARM gem5 Developers unsigned fetchWidth; 3997362Sgblack@eecs.umich.edu 40010037SARM gem5 Developers /** Is the cache blocked? If so no threads can access it. */ 40110037SARM gem5 Developers bool cacheBlocked; 40210037SARM gem5 Developers 40310037SARM gem5 Developers /** The packet that is waiting to be retried. */ 40410037SARM gem5 Developers PacketPtr retryPkt; 40510037SARM gem5 Developers 4067362Sgblack@eecs.umich.edu /** The thread that is waiting on the cache to tell fetch to retry. */ 40710037SARM gem5 Developers int retryTid; 40810037SARM gem5 Developers 40910037SARM gem5 Developers /** Cache block size. */ 41010037SARM gem5 Developers int cacheBlkSize; 41110037SARM gem5 Developers 41210037SARM gem5 Developers /** Mask to get a cache block's address. */ 4137362Sgblack@eecs.umich.edu Addr cacheBlkMask; 4147362Sgblack@eecs.umich.edu 41510537Sandreas.hansson@arm.com /** The cache line being fetched. */ 41610537Sandreas.hansson@arm.com uint8_t *cacheData[Impl::MaxThreads]; 41710537Sandreas.hansson@arm.com 41810537Sandreas.hansson@arm.com /** The PC of the cacheline that has been loaded. */ 41910537Sandreas.hansson@arm.com Addr cacheDataPC[Impl::MaxThreads]; 42010037SARM gem5 Developers 4217362Sgblack@eecs.umich.edu /** Whether or not the cache data is valid. */ 4227362Sgblack@eecs.umich.edu bool cacheDataValid[Impl::MaxThreads]; 42310417Sandreas.hansson@arm.com 42412176Sandreas.sandberg@arm.com /** Size of instructions. */ 42510037SARM gem5 Developers int instSize; 42612176Sandreas.sandberg@arm.com 42712176Sandreas.sandberg@arm.com /** Icache stall statistics. */ 42812176Sandreas.sandberg@arm.com Counter lastIcacheStall[Impl::MaxThreads]; 42912176Sandreas.sandberg@arm.com 43012176Sandreas.sandberg@arm.com /** List of Active Threads */ 43110037SARM gem5 Developers std::list<unsigned> *activeThreads; 4327362Sgblack@eecs.umich.edu 4337362Sgblack@eecs.umich.edu /** Number of threads. */ 4347362Sgblack@eecs.umich.edu unsigned numThreads; 4357362Sgblack@eecs.umich.edu 4367362Sgblack@eecs.umich.edu /** Number of threads that are actively fetching. */ 43710037SARM gem5 Developers unsigned numFetchingThreads; 43810037SARM gem5 Developers 43910037SARM gem5 Developers /** Thread ID being fetched. */ 4407362Sgblack@eecs.umich.edu int threadFetched; 44110037SARM gem5 Developers 44210037SARM gem5 Developers /** Checks if there is an interrupt pending. If there is, fetch 44310037SARM gem5 Developers * must stop once it is not fetching PAL instructions. 44410037SARM gem5 Developers */ 4457362Sgblack@eecs.umich.edu bool interruptPending; 44610037SARM gem5 Developers 44712176Sandreas.sandberg@arm.com /** Is there a drain pending. */ 44810037SARM gem5 Developers bool drainPending; 44912176Sandreas.sandberg@arm.com 45012176Sandreas.sandberg@arm.com /** Records if fetch is switched out. */ 4517362Sgblack@eecs.umich.edu bool switchedOut; 4527362Sgblack@eecs.umich.edu 4537362Sgblack@eecs.umich.edu // @todo: Consider making these vectors and tracking on a per thread basis. 4547362Sgblack@eecs.umich.edu /** Stat for total number of cycles stalled due to an icache miss. */ 4557362Sgblack@eecs.umich.edu Stats::Scalar<> icacheStallCycles; 45610037SARM gem5 Developers /** Stat for total number of fetched instructions. */ 45710037SARM gem5 Developers Stats::Scalar<> fetchedInsts; 45810037SARM gem5 Developers /** Total number of fetched branches. */ 45910037SARM gem5 Developers Stats::Scalar<> fetchedBranches; 46010037SARM gem5 Developers /** Stat for total number of predicted branches. */ 46110037SARM gem5 Developers Stats::Scalar<> predictedBranches; 46210037SARM gem5 Developers /** Stat for total number of cycles spent fetching. */ 4637362Sgblack@eecs.umich.edu Stats::Scalar<> fetchCycles; 46410037SARM gem5 Developers /** Stat for total number of cycles spent squashing. */ 46510037SARM gem5 Developers Stats::Scalar<> fetchSquashCycles; 46610037SARM gem5 Developers /** Stat for total number of cycles spent blocked due to other stages in 46710037SARM gem5 Developers * the pipeline. 46810037SARM gem5 Developers */ 46910037SARM gem5 Developers Stats::Scalar<> fetchIdleCycles; 47010037SARM gem5 Developers /** Total number of cycles spent blocked. */ 47110037SARM gem5 Developers Stats::Scalar<> fetchBlockedCycles; 47210037SARM gem5 Developers /** Total number of cycles spent in any other state. */ 4737362Sgblack@eecs.umich.edu Stats::Scalar<> fetchMiscStallCycles; 47410037SARM gem5 Developers /** Stat for total number of fetched cache lines. */ 47512176Sandreas.sandberg@arm.com Stats::Scalar<> fetchedCacheLines; 47610037SARM gem5 Developers /** Total number of outstanding icache accesses that were dropped 47712176Sandreas.sandberg@arm.com * due to a squash. 47812176Sandreas.sandberg@arm.com */ 47912176Sandreas.sandberg@arm.com Stats::Scalar<> fetchIcacheSquashes; 48012176Sandreas.sandberg@arm.com /** Distribution of number of instructions fetched each cycle. */ 4817362Sgblack@eecs.umich.edu Stats::Distribution<> fetchNisnDist; 4827362Sgblack@eecs.umich.edu /** Rate of how often fetch was idle. */ 48310037SARM gem5 Developers Stats::Formula idleRate; 48410037SARM gem5 Developers /** Number of branch fetches per cycle. */ 48510037SARM gem5 Developers Stats::Formula branchRate; 48610037SARM gem5 Developers /** Number of instruction fetched per cycle. */ 48710037SARM gem5 Developers Stats::Formula fetchRate; 48810037SARM gem5 Developers}; 48910037SARM gem5 Developers 49010037SARM gem5 Developers#endif //__CPU_O3_FETCH_HH__ 49110037SARM gem5 Developers