1/* 2 * Copyright (c) 2005-2006 The Regents of The University of Michigan 3 * Copyright (c) 2013 Advanced Micro Devices, Inc. 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions are 8 * met: redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer; 10 * redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution; 13 * neither the name of the copyright holders nor the names of its 14 * contributors may be used to endorse or promote products derived from 15 * this software without specific prior written permission. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 18 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 19 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 20 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 21 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 22 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 23 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 * 29 * Authors: Korey Sewell 30 * Kevin Lim 31 * Steve Reinhardt 32 */ 33 34#ifndef __CPU_O3_SCOREBOARD_HH__ 35#define __CPU_O3_SCOREBOARD_HH__ 36 37#include <iostream> 38#include <utility> 39#include <vector> 40 41#include "base/trace.hh" 42#include "config/the_isa.hh" 43#include "cpu/o3/comm.hh" 44#include "debug/Scoreboard.hh" 45 46/** 47 * Implements a simple scoreboard to track which registers are 48 * ready. This class operates on the unified physical register space, 49 * because the different classes of registers do not need to be distinguished. 50 * Registers being part of a fixed mapping are always considered ready. 51 */ 52class Scoreboard 53{ 54 private: 55 /** The object name, for DPRINTF. We have to declare this 56 * explicitly because Scoreboard is not a SimObject. */ 57 const std::string _name; 58 59 /** Scoreboard of physical integer registers, saying whether or not they 60 * are ready. */ 61 std::vector<bool> regScoreBoard; 62 63 /** The number of actual physical registers */ 64 unsigned M5_CLASS_VAR_USED numPhysRegs; 65 66 public: 67 /** Constructs a scoreboard. 68 * @param _numPhysicalRegs Number of physical registers. 69 * @param _numMiscRegs Number of miscellaneous registers. 70 */ 71 Scoreboard(const std::string &_my_name, 72 unsigned _numPhysicalRegs); 73 74 /** Destructor. */ 75 ~Scoreboard() {} 76 77 /** Returns the name of the scoreboard. */ 78 std::string name() const { return _name; }; 79 80 /** Checks if the register is ready. */ 81 bool getReg(PhysRegIdPtr phys_reg) const 82 { 83 assert(phys_reg->flatIndex() < numPhysRegs); 84 85 if (phys_reg->isFixedMapping()) { 86 // Fixed mapping regs are always ready 87 return true; 88 } 89 90 bool ready = regScoreBoard[phys_reg->flatIndex()]; 91 92 if (phys_reg->isZeroReg()) 93 assert(ready); 94 95 return ready; 96 } 97 98 /** Sets the register as ready. */ 99 void setReg(PhysRegIdPtr phys_reg) 100 { 101 assert(phys_reg->flatIndex() < numPhysRegs); 102 103 if (phys_reg->isFixedMapping()) { 104 // Fixed mapping regs are always ready, ignore attempts to change 105 // that 106 return; 107 } 108 109 DPRINTF(Scoreboard, "Setting reg %i (%s) as ready\n", 110 phys_reg->index(), phys_reg->className()); 111 112 regScoreBoard[phys_reg->flatIndex()] = true; 113 } 114 115 /** Sets the register as not ready. */ 116 void unsetReg(PhysRegIdPtr phys_reg) 117 { 118 assert(phys_reg->flatIndex() < numPhysRegs); 119 120 if (phys_reg->isFixedMapping()) { 121 // Fixed mapping regs are always ready, ignore attempts to 122 // change that 123 return; 124 } 125 126 // zero reg should never be marked unready 127 if (phys_reg->isZeroReg()) 128 return; 129 130 regScoreBoard[phys_reg->flatIndex()] = false; 131 } 132 133}; 134 135#endif 136