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