comm.hh revision 7720
12914Ssaidi@eecs.umich.edu/*
22914Ssaidi@eecs.umich.edu * Copyright (c) 2004-2006 The Regents of The University of Michigan
32914Ssaidi@eecs.umich.edu * All rights reserved.
42914Ssaidi@eecs.umich.edu *
52914Ssaidi@eecs.umich.edu * Redistribution and use in source and binary forms, with or without
62914Ssaidi@eecs.umich.edu * modification, are permitted provided that the following conditions are
72914Ssaidi@eecs.umich.edu * met: redistributions of source code must retain the above copyright
82914Ssaidi@eecs.umich.edu * notice, this list of conditions and the following disclaimer;
92914Ssaidi@eecs.umich.edu * redistributions in binary form must reproduce the above copyright
102914Ssaidi@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the
112914Ssaidi@eecs.umich.edu * documentation and/or other materials provided with the distribution;
122914Ssaidi@eecs.umich.edu * neither the name of the copyright holders nor the names of its
132914Ssaidi@eecs.umich.edu * contributors may be used to endorse or promote products derived from
142914Ssaidi@eecs.umich.edu * this software without specific prior written permission.
152914Ssaidi@eecs.umich.edu *
162914Ssaidi@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
172914Ssaidi@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
182914Ssaidi@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
192914Ssaidi@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
202914Ssaidi@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
212914Ssaidi@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
222914Ssaidi@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
232914Ssaidi@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
242914Ssaidi@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
252914Ssaidi@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
262914Ssaidi@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
272914Ssaidi@eecs.umich.edu *
282914Ssaidi@eecs.umich.edu * Authors: Kevin Lim
292914Ssaidi@eecs.umich.edu */
302914Ssaidi@eecs.umich.edu
312914Ssaidi@eecs.umich.edu#ifndef __CPU_O3_COMM_HH__
322914Ssaidi@eecs.umich.edu#define __CPU_O3_COMM_HH__
334929Sstever@gmail.com
344490Sstever@eecs.umich.edu#include <vector>
353091Sstever@eecs.umich.edu
364490Sstever@eecs.umich.edu#include "arch/types.hh"
374490Sstever@eecs.umich.edu#include "base/types.hh"
383296Ssaidi@eecs.umich.edu#include "cpu/inst_seq.hh"
394492Sstever@eecs.umich.edu#include "sim/faults.hh"
404490Sstever@eecs.umich.edu
413284Srdreslin@umich.edu// Typedef for physical register index type. Although the Impl would be the
423284Srdreslin@umich.edu// most likely location for this, there are a few classes that need this
434874Sstever@eecs.umich.edu// typedef yet are not templated on the Impl. For now it will be defined here.
444929Sstever@gmail.comtypedef short int PhysRegIndex;
454490Sstever@eecs.umich.edu
463284Srdreslin@umich.edu/** Struct that defines the information passed from fetch to decode. */
474929Sstever@gmail.comtemplate<class Impl>
484929Sstever@gmail.comstruct DefaultFetchDefaultDecode {
494490Sstever@eecs.umich.edu    typedef typename Impl::DynInstPtr DynInstPtr;
503342Srdreslin@umich.edu
514490Sstever@eecs.umich.edu    int size;
524490Sstever@eecs.umich.edu
534490Sstever@eecs.umich.edu    DynInstPtr insts[Impl::MaxWidth];
544929Sstever@gmail.com    Fault fetchFault;
554929Sstever@gmail.com    InstSeqNum fetchFaultSN;
563296Ssaidi@eecs.umich.edu    bool clearFetchFault;
574929Sstever@gmail.com};
583091Sstever@eecs.umich.edu
593091Sstever@eecs.umich.edu/** Struct that defines the information passed from decode to rename. */
603091Sstever@eecs.umich.edutemplate<class Impl>
613349Sbinkertn@umich.edustruct DefaultDecodeDefaultRename {
623091Sstever@eecs.umich.edu    typedef typename Impl::DynInstPtr DynInstPtr;
633091Sstever@eecs.umich.edu
643091Sstever@eecs.umich.edu    int size;
653091Sstever@eecs.umich.edu
663091Sstever@eecs.umich.edu    DynInstPtr insts[Impl::MaxWidth];
673091Sstever@eecs.umich.edu};
684626Sstever@eecs.umich.edu
694670Sstever@eecs.umich.edu/** Struct that defines the information passed from rename to IEW. */
704670Sstever@eecs.umich.edutemplate<class Impl>
714670Sstever@eecs.umich.edustruct DefaultRenameDefaultIEW {
724670Sstever@eecs.umich.edu    typedef typename Impl::DynInstPtr DynInstPtr;
734670Sstever@eecs.umich.edu
744670Sstever@eecs.umich.edu    int size;
754670Sstever@eecs.umich.edu
764670Sstever@eecs.umich.edu    DynInstPtr insts[Impl::MaxWidth];
774626Sstever@eecs.umich.edu};
783091Sstever@eecs.umich.edu
793175Srdreslin@umich.edu/** Struct that defines the information passed from IEW to commit. */
804626Sstever@eecs.umich.edutemplate<class Impl>
814670Sstever@eecs.umich.edustruct DefaultIEWDefaultCommit {
824670Sstever@eecs.umich.edu    typedef typename Impl::DynInstPtr DynInstPtr;
834626Sstever@eecs.umich.edu
844493Sstever@eecs.umich.edu    int size;
854626Sstever@eecs.umich.edu
864490Sstever@eecs.umich.edu    DynInstPtr insts[Impl::MaxWidth];
873309Srdreslin@umich.edu
884670Sstever@eecs.umich.edu    bool squash[Impl::MaxThreads];
893091Sstever@eecs.umich.edu    bool branchMispredict[Impl::MaxThreads];
903091Sstever@eecs.umich.edu    bool branchTaken[Impl::MaxThreads];
913091Sstever@eecs.umich.edu    Addr mispredPC[Impl::MaxThreads];
922914Ssaidi@eecs.umich.edu    TheISA::PCState pc[Impl::MaxThreads];
932914Ssaidi@eecs.umich.edu    InstSeqNum squashedSeqNum[Impl::MaxThreads];
944492Sstever@eecs.umich.edu
953403Ssaidi@eecs.umich.edu    bool includeSquashInst[Impl::MaxThreads];
964492Sstever@eecs.umich.edu};
974970Ssaidi@eecs.umich.edu
984492Sstever@eecs.umich.edutemplate<class Impl>
993450Ssaidi@eecs.umich.edustruct IssueStruct {
1004666Sstever@eecs.umich.edu    typedef typename Impl::DynInstPtr DynInstPtr;
1014666Sstever@eecs.umich.edu
1024666Sstever@eecs.umich.edu    int size;
1034666Sstever@eecs.umich.edu
1044666Sstever@eecs.umich.edu    DynInstPtr insts[Impl::MaxWidth];
1054666Sstever@eecs.umich.edu};
1064666Sstever@eecs.umich.edu
1074666Sstever@eecs.umich.edu/** Struct that defines all backwards communication. */
1084492Sstever@eecs.umich.edutemplate<class Impl>
1093450Ssaidi@eecs.umich.edustruct TimeBufStruct {
1103403Ssaidi@eecs.umich.edu    struct decodeComm {
1113450Ssaidi@eecs.umich.edu        bool squash;
1124666Sstever@eecs.umich.edu        bool predIncorrect;
1134490Sstever@eecs.umich.edu        uint64_t branchAddr;
1144666Sstever@eecs.umich.edu
1154490Sstever@eecs.umich.edu        InstSeqNum doneSeqNum;
1163450Ssaidi@eecs.umich.edu
1174492Sstever@eecs.umich.edu        // @todo: Might want to package this kind of branch stuff into a single
1184492Sstever@eecs.umich.edu        // struct as it is used pretty frequently.
1194492Sstever@eecs.umich.edu        bool branchMispredict;
1204492Sstever@eecs.umich.edu        bool branchTaken;
1213610Srdreslin@umich.edu        Addr mispredPC;
1223450Ssaidi@eecs.umich.edu        TheISA::PCState nextPC;
1234492Sstever@eecs.umich.edu
1243403Ssaidi@eecs.umich.edu        unsigned branchCount;
1253403Ssaidi@eecs.umich.edu    };
1264492Sstever@eecs.umich.edu
1273403Ssaidi@eecs.umich.edu    decodeComm decodeInfo[Impl::MaxThreads];
1284492Sstever@eecs.umich.edu
1292914Ssaidi@eecs.umich.edu    struct renameComm {
1304492Sstever@eecs.umich.edu    };
1314870Sstever@eecs.umich.edu
1324870Sstever@eecs.umich.edu    renameComm renameInfo[Impl::MaxThreads];
1334870Sstever@eecs.umich.edu
1344870Sstever@eecs.umich.edu    struct iewComm {
1354870Sstever@eecs.umich.edu        // Also eventually include skid buffer space.
1364870Sstever@eecs.umich.edu        bool usedIQ;
1374492Sstever@eecs.umich.edu        unsigned freeIQEntries;
1384492Sstever@eecs.umich.edu        bool usedLSQ;
1394870Sstever@eecs.umich.edu        unsigned freeLSQEntries;
1404490Sstever@eecs.umich.edu
1415606Snate@binkert.org        unsigned iqCount;
1423263Srdreslin@umich.edu        unsigned ldstqCount;
1434492Sstever@eecs.umich.edu
1444490Sstever@eecs.umich.edu        unsigned dispatched;
1454490Sstever@eecs.umich.edu        unsigned dispatchedToLSQ;
1464490Sstever@eecs.umich.edu    };
1473091Sstever@eecs.umich.edu
1484870Sstever@eecs.umich.edu    iewComm iewInfo[Impl::MaxThreads];
1494870Sstever@eecs.umich.edu
1504870Sstever@eecs.umich.edu    struct commitComm {
1514870Sstever@eecs.umich.edu        bool usedROB;
1524870Sstever@eecs.umich.edu        unsigned freeROBEntries;
1534870Sstever@eecs.umich.edu        bool emptyROB;
1543091Sstever@eecs.umich.edu
1554492Sstever@eecs.umich.edu        bool squash;
1564492Sstever@eecs.umich.edu        bool robSquashing;
1574492Sstever@eecs.umich.edu
1584492Sstever@eecs.umich.edu        bool branchMispredict;
1594492Sstever@eecs.umich.edu        bool branchTaken;
1604492Sstever@eecs.umich.edu        Addr mispredPC;
1614492Sstever@eecs.umich.edu        TheISA::PCState pc;
1624492Sstever@eecs.umich.edu
1634492Sstever@eecs.umich.edu        // Represents the instruction that has either been retired or
1644492Sstever@eecs.umich.edu        // squashed.  Similar to having a single bus that broadcasts the
1654492Sstever@eecs.umich.edu        // retired or squashed sequence number.
1664492Sstever@eecs.umich.edu        InstSeqNum doneSeqNum;
1674492Sstever@eecs.umich.edu
1684492Sstever@eecs.umich.edu        //Just in case we want to do a commit/squash on a cycle
1694492Sstever@eecs.umich.edu        //(necessary for multiple ROBs?)
1704492Sstever@eecs.umich.edu        bool commitInsts;
1714492Sstever@eecs.umich.edu        InstSeqNum squashSeqNum;
1724492Sstever@eecs.umich.edu
1734492Sstever@eecs.umich.edu        // Communication specifically to the IQ to tell the IQ that it can
1744492Sstever@eecs.umich.edu        // schedule a non-speculative instruction.
1754492Sstever@eecs.umich.edu        InstSeqNum nonSpecSeqNum;
1764492Sstever@eecs.umich.edu
1774492Sstever@eecs.umich.edu        // Hack for now to send back an uncached access to the IEW stage.
1782914Ssaidi@eecs.umich.edu        typedef typename Impl::DynInstPtr DynInstPtr;
1792914Ssaidi@eecs.umich.edu        bool uncached;
1802914Ssaidi@eecs.umich.edu        DynInstPtr uncachedLoad;
1812914Ssaidi@eecs.umich.edu
1822914Ssaidi@eecs.umich.edu        bool interruptPending;
1832914Ssaidi@eecs.umich.edu        bool clearInterrupt;
1843403Ssaidi@eecs.umich.edu    };
1852914Ssaidi@eecs.umich.edu
1862914Ssaidi@eecs.umich.edu    commitComm commitInfo[Impl::MaxThreads];
1872914Ssaidi@eecs.umich.edu
1882914Ssaidi@eecs.umich.edu    bool decodeBlock[Impl::MaxThreads];
189    bool decodeUnblock[Impl::MaxThreads];
190    bool renameBlock[Impl::MaxThreads];
191    bool renameUnblock[Impl::MaxThreads];
192    bool iewBlock[Impl::MaxThreads];
193    bool iewUnblock[Impl::MaxThreads];
194    bool commitBlock[Impl::MaxThreads];
195    bool commitUnblock[Impl::MaxThreads];
196};
197
198#endif //__CPU_O3_COMM_HH__
199