rename.hh
来自「linux下基于c++的处理器仿真平台。具有处理器流水线」· HH 代码 · 共 238 行
HH
238 行
/* * Copyright (c) 2004, 2005 * The Regents of The University of Michigan * All Rights Reserved * * This code is part of the M5 simulator, developed by Nathan Binkert, * Erik Hallnor, Steve Raasch, and Steve Reinhardt, with contributions * from Ron Dreslinski, Dave Greene, Lisa Hsu, Kevin Lim, Ali Saidi, * and Andrew Schultz. * * Permission is granted to use, copy, create derivative works and * redistribute this software and such derivative works for any * purpose, so long as the copyright notice above, this grant of * permission, and the disclaimer below appear in all copies made; and * so long as the name of The University of Michigan is not used in * any advertising or publicity pertaining to the use or distribution * of this software without specific, written prior authorization. * * THIS SOFTWARE IS PROVIDED AS IS, WITHOUT REPRESENTATION FROM THE * UNIVERSITY OF MICHIGAN AS TO ITS FITNESS FOR ANY PURPOSE, AND * WITHOUT WARRANTY BY THE UNIVERSITY OF MICHIGAN OF ANY KIND, EITHER * EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE. THE REGENTS OF THE UNIVERSITY OF MICHIGAN SHALL NOT BE * LIABLE FOR ANY DAMAGES, INCLUDING DIRECT, SPECIAL, INDIRECT, * INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WITH RESPECT TO ANY CLAIM * ARISING OUT OF OR IN CONNECTION WITH THE USE OF THE SOFTWARE, EVEN * IF IT HAS BEEN OR IS HEREAFTER ADVISED OF THE POSSIBILITY OF SUCH * DAMAGES. */// Todo: // Fix up trap and barrier handling.// May want to have different statuses to differentiate the different stall// conditions.#ifndef __CPU_O3_CPU_SIMPLE_RENAME_HH__#define __CPU_O3_CPU_SIMPLE_RENAME_HH__#include <list>#include "base/statistics.hh"#include "base/timebuf.hh"// Will need rename maps for both the int reg file and fp reg file.// Or change rename map class to handle both. (RegFile handles both.)template<class Impl>class SimpleRename{ public: // Typedefs from the Impl. typedef typename Impl::ISA ISA; typedef typename Impl::CPUPol CPUPol; typedef typename Impl::DynInstPtr DynInstPtr; typedef typename Impl::FullCPU FullCPU; typedef typename Impl::Params Params; typedef typename CPUPol::FetchStruct FetchStruct; typedef typename CPUPol::DecodeStruct DecodeStruct; typedef typename CPUPol::RenameStruct RenameStruct; typedef typename CPUPol::TimeStruct TimeStruct; // Typedefs from the CPUPol typedef typename CPUPol::FreeList FreeList; typedef typename CPUPol::RenameMap RenameMap; // Typedefs from the ISA. typedef typename ISA::Addr Addr; public: // Rename will block if ROB becomes full or issue queue becomes full, // or there are no free registers to rename to. // Only case where rename squashes is if IEW squashes. enum Status { Running, Idle, Squashing, Blocked, Unblocking, BarrierStall }; private: Status _status; public: SimpleRename(Params ¶ms); void regStats(); void setCPU(FullCPU *cpu_ptr); void setTimeBuffer(TimeBuffer<TimeStruct> *tb_ptr); void setRenameQueue(TimeBuffer<RenameStruct> *rq_ptr); void setDecodeQueue(TimeBuffer<DecodeStruct> *dq_ptr); void setRenameMap(RenameMap *rm_ptr); void setFreeList(FreeList *fl_ptr); void dumpHistory(); void tick(); void rename(); void squash(); private: void block(); inline void unblock(); void doSquash(); void removeFromHistory(InstSeqNum inst_seq_num); inline void renameSrcRegs(DynInstPtr &inst); inline void renameDestRegs(DynInstPtr &inst); inline int calcFreeROBEntries(); inline int calcFreeIQEntries(); /** Holds the previous information for each rename. * Note that often times the inst may have been deleted, so only access * the pointer for the address and do not dereference it. */ struct RenameHistory { RenameHistory(InstSeqNum _instSeqNum, RegIndex _archReg, PhysRegIndex _newPhysReg, PhysRegIndex _prevPhysReg) : instSeqNum(_instSeqNum), archReg(_archReg), newPhysReg(_newPhysReg), prevPhysReg(_prevPhysReg), placeHolder(false) { } /** Constructor used specifically for cases where a place holder * rename history entry is being made. */ RenameHistory(InstSeqNum _instSeqNum) : instSeqNum(_instSeqNum), archReg(0), newPhysReg(0), prevPhysReg(0), placeHolder(true) { } InstSeqNum instSeqNum; RegIndex archReg; PhysRegIndex newPhysReg; PhysRegIndex prevPhysReg; bool placeHolder; }; std::list<RenameHistory> historyBuffer; /** CPU interface. */ FullCPU *cpu; // Interfaces to objects outside of rename. /** Time buffer interface. */ TimeBuffer<TimeStruct> *timeBuffer; /** Wire to get IEW's output from backwards time buffer. */ typename TimeBuffer<TimeStruct>::wire fromIEW; /** Wire to get commit's output from backwards time buffer. */ typename TimeBuffer<TimeStruct>::wire fromCommit; /** Wire to write infromation heading to previous stages. */ // Might not be the best name as not only decode will read it. typename TimeBuffer<TimeStruct>::wire toDecode; /** Rename instruction queue. */ TimeBuffer<RenameStruct> *renameQueue; /** Wire to write any information heading to IEW. */ typename TimeBuffer<RenameStruct>::wire toIEW; /** Decode instruction queue interface. */ TimeBuffer<DecodeStruct> *decodeQueue; /** Wire to get decode's output from decode queue. */ typename TimeBuffer<DecodeStruct>::wire fromDecode; /** Skid buffer between rename and decode. */ std::queue<DecodeStruct> skidBuffer; /** Rename map interface. */ SimpleRenameMap *renameMap; /** Free list interface. */ FreeList *freeList; /** Delay between iew and rename, in ticks. */ int iewToRenameDelay; /** Delay between decode and rename, in ticks. */ int decodeToRenameDelay; /** Delay between commit and rename, in ticks. */ unsigned commitToRenameDelay; /** Rename width, in instructions. */ unsigned renameWidth; /** Commit width, in instructions. Used so rename knows how many * instructions might have freed registers in the previous cycle. */ unsigned commitWidth; /** The instruction that rename is currently on. It needs to have * persistent state so that when a stall occurs in the middle of a * group of instructions, it can restart at the proper instruction. */ unsigned numInst; Stats::Scalar<> renameSquashCycles; Stats::Scalar<> renameIdleCycles; Stats::Scalar<> renameBlockCycles; Stats::Scalar<> renameUnblockCycles; Stats::Scalar<> renameRenamedInsts; Stats::Scalar<> renameSquashedInsts; Stats::Scalar<> renameROBFullEvents; Stats::Scalar<> renameIQFullEvents; Stats::Scalar<> renameFullRegistersEvents; Stats::Scalar<> renameRenamedOperands; Stats::Scalar<> renameRenameLookups; Stats::Scalar<> renameHBPlaceHolders; Stats::Scalar<> renameCommittedMaps; Stats::Scalar<> renameUndoneMaps; Stats::Scalar<> renameValidUndoneMaps;};#endif // __CPU_O3_CPU_SIMPLE_RENAME_HH__
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?