gem5  v19.0.0.0
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
mem_dep_unit.hh
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2012, 2014 ARM Limited
3  * All rights reserved
4  *
5  * The license below extends only to copyright in the software and shall
6  * not be construed as granting a license to any other intellectual
7  * property including but not limited to intellectual property relating
8  * to a hardware implementation of the functionality of the software
9  * licensed hereunder. You may use the software subject to the license
10  * terms below provided that you ensure that this notice is replicated
11  * unmodified and in its entirety in all distributions of the software,
12  * modified or unmodified, in source code or in binary form.
13  *
14  * Copyright (c) 2004-2006 The Regents of The University of Michigan
15  * All rights reserved.
16  *
17  * Redistribution and use in source and binary forms, with or without
18  * modification, are permitted provided that the following conditions are
19  * met: redistributions of source code must retain the above copyright
20  * notice, this list of conditions and the following disclaimer;
21  * redistributions in binary form must reproduce the above copyright
22  * notice, this list of conditions and the following disclaimer in the
23  * documentation and/or other materials provided with the distribution;
24  * neither the name of the copyright holders nor the names of its
25  * contributors may be used to endorse or promote products derived from
26  * this software without specific prior written permission.
27  *
28  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
29  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
30  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
31  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
32  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
33  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
34  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
35  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
36  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
37  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
38  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
39  *
40  * Authors: Kevin Lim
41  */
42 
43 #ifndef __CPU_O3_MEM_DEP_UNIT_HH__
44 #define __CPU_O3_MEM_DEP_UNIT_HH__
45 
46 #include <list>
47 #include <memory>
48 #include <set>
49 #include <unordered_map>
50 
51 #include "base/statistics.hh"
52 #include "cpu/inst_seq.hh"
53 #include "debug/MemDepUnit.hh"
54 
55 struct SNHash {
56  size_t operator() (const InstSeqNum &seq_num) const {
57  unsigned a = (unsigned)seq_num;
58  unsigned hash = (((a >> 14) ^ ((a >> 2) & 0xffff))) & 0x7FFFFFFF;
59 
60  return hash;
61  }
62 };
63 
64 struct DerivO3CPUParams;
65 
66 template <class Impl>
67 class InstructionQueue;
68 
80 template <class MemDepPred, class Impl>
82 {
83  protected:
84  std::string _name;
85 
86  public:
87  typedef typename Impl::DynInstPtr DynInstPtr;
88  typedef typename Impl::DynInstConstPtr DynInstConstPtr;
89 
91  MemDepUnit();
92 
94  MemDepUnit(DerivO3CPUParams *params);
95 
97  ~MemDepUnit();
98 
100  std::string name() const { return _name; }
101 
103  void init(DerivO3CPUParams *params, ThreadID tid);
104 
106  void regStats();
107 
109  bool isDrained() const;
110 
112  void drainSanityCheck() const;
113 
115  void takeOverFrom();
116 
118  void setIQ(InstructionQueue<Impl> *iq_ptr);
119 
121  void insert(const DynInstPtr &inst);
122 
124  void insertNonSpec(const DynInstPtr &inst);
125 
127  void insertBarrier(const DynInstPtr &barr_inst);
128 
130  void regsReady(const DynInstPtr &inst);
131 
133  void nonSpecInstReady(const DynInstPtr &inst);
134 
136  void reschedule(const DynInstPtr &inst);
137 
141  void replay();
142 
144  void completed(const DynInstPtr &inst);
145 
147  void completeBarrier(const DynInstPtr &inst);
148 
150  void wakeDependents(const DynInstPtr &inst);
151 
155  void squash(const InstSeqNum &squashed_num, ThreadID tid);
156 
158  void violation(const DynInstPtr &store_inst,
159  const DynInstPtr &violating_load);
160 
162  void issue(const DynInstPtr &inst);
163 
165  void dumpLists();
166 
167  private:
169 
170  class MemDepEntry;
171 
172  typedef std::shared_ptr<MemDepEntry> MemDepEntryPtr;
173 
178  class MemDepEntry {
179  public:
181  MemDepEntry(const DynInstPtr &new_inst)
182  : inst(new_inst), regsReady(false), memDepReady(false),
183  completed(false), squashed(false)
184  {
185 #ifdef DEBUG
186  ++memdep_count;
187 
188  DPRINTF(MemDepUnit, "Memory dependency entry created. "
189  "memdep_count=%i %s\n", memdep_count, inst->pcState());
190 #endif
191  }
192 
195  {
196  for (int i = 0; i < dependInsts.size(); ++i) {
197  dependInsts[i] = NULL;
198  }
199 #ifdef DEBUG
200  --memdep_count;
201 
202  DPRINTF(MemDepUnit, "Memory dependency entry deleted. "
203  "memdep_count=%i %s\n", memdep_count, inst->pcState());
204 #endif
205  }
206 
208  std::string name() const { return "memdepentry"; }
209 
211  DynInstPtr inst;
212 
214  ListIt listIt;
215 
218 
220  bool regsReady;
224  bool completed;
226  bool squashed;
227 
229 #ifdef DEBUG
230  static int memdep_count;
231  static int memdep_insert;
232  static int memdep_erase;
233 #endif
234  };
235 
237  inline MemDepEntryPtr &findInHash(const DynInstConstPtr& inst);
238 
240  inline void moveToReady(MemDepEntryPtr &ready_inst_entry);
241 
242  typedef std::unordered_map<InstSeqNum, MemDepEntryPtr, SNHash> MemDepHash;
243 
244  typedef typename MemDepHash::iterator MemDepHashIt;
245 
247  MemDepHash memDepHash;
248 
250  std::list<DynInstPtr> instList[Impl::MaxThreads];
251 
254 
260  MemDepPred depPred;
261 
270 
273 
275  int id;
276 
285 };
286 
287 #endif // __CPU_O3_MEM_DEP_UNIT_HH__
#define DPRINTF(x,...)
Definition: trace.hh:229
MemDepHash memDepHash
A hash map of all memory dependence entries.
bool loadBarrier
Is there an outstanding load barrier that loads must wait on.
std::shared_ptr< MemDepEntry > MemDepEntryPtr
Bitfield< 7 > i
InstSeqNum storeBarrierSN
The sequence number of the store barrier.
std::list< DynInstPtr >::iterator ListIt
ListIt listIt
The iterator to the instruction&#39;s location inside the list.
size_t operator()(const InstSeqNum &seq_num) const
Definition: mem_dep_unit.hh:56
Bitfield< 8 > a
void takeOverFrom(ThreadContext &ntc, ThreadContext &otc)
Copy state between thread contexts in preparation for CPU handover.
bool storeBarrier
Is there an outstanding store barrier that loads must wait on.
bool memDepReady
If all memory dependencies have been satisfied.
~MemDepEntry()
Frees any pointers.
int id
The thread id of this memory dependence unit.
Impl::DynInstConstPtr DynInstConstPtr
Definition: mem_dep_unit.hh:88
std::vector< MemDepEntryPtr > dependInsts
A vector of any dependent instructions.
Declaration of Statistics objects.
This is a simple scalar statistic, like a counter.
Definition: statistics.hh:2508
MemDepEntry(const DynInstPtr &new_inst)
Constructs a memory dependence entry.
Stats::Scalar insertedLoads
Stat for number of inserted loads.
bool squashed
If the instruction is squashed.
InstructionQueue< Impl > * iqPtr
Pointer to the IQ.
Impl::DynInstPtr DynInstPtr
Definition: mem_dep_unit.hh:87
bool regsReady
If the registers are ready or not.
Stats::Scalar conflictingStores
Stat for number of conflicting stores that had to wait for a store.
Stats::Scalar conflictingLoads
Stat for number of conflicting loads that had to wait for a store.
bool completed
If the instruction is completed.
uint64_t InstSeqNum
Definition: inst_seq.hh:40
Memory dependence entries that track memory operations, marking when the instruction is ready to exec...
STL list class.
Definition: stl.hh:54
Stats::Scalar insertedStores
Stat for number of inserted stores.
MemDepPred depPred
The memory dependence predictor.
Memory dependency unit class.
Definition: mem_dep_unit.hh:81
int16_t ThreadID
Thread index/ID type.
Definition: types.hh:227
std::string name() const
Returns the name of the memory dependence entry.
InstSeqNum loadBarrierSN
The sequence number of the load barrier.
std::list< DynInstPtr > instsToReplay
A list of all instructions that are going to be replayed.
std::string name() const
Returns the name of the memory dependence unit.
std::unordered_map< InstSeqNum, MemDepEntryPtr, SNHash > MemDepHash
A standard instruction queue class.
Definition: inst_queue.hh:83
const FlagsType init
This Stat is Initialized.
Definition: info.hh:47
std::string _name
Definition: mem_dep_unit.hh:84
DynInstPtr inst
The instruction being tracked.
MemDepHash::iterator MemDepHashIt

Generated on Fri Feb 28 2020 16:26:59 for gem5 by doxygen 1.8.13