gem5  v20.0.0.3
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 
41 #ifndef __CPU_O3_MEM_DEP_UNIT_HH__
42 #define __CPU_O3_MEM_DEP_UNIT_HH__
43 
44 #include <list>
45 #include <memory>
46 #include <set>
47 #include <unordered_map>
48 
49 #include "base/statistics.hh"
50 #include "cpu/inst_seq.hh"
51 #include "debug/MemDepUnit.hh"
52 
53 struct SNHash {
54  size_t operator() (const InstSeqNum &seq_num) const {
55  unsigned a = (unsigned)seq_num;
56  unsigned hash = (((a >> 14) ^ ((a >> 2) & 0xffff))) & 0x7FFFFFFF;
57 
58  return hash;
59  }
60 };
61 
62 struct DerivO3CPUParams;
63 
64 template <class Impl>
65 class InstructionQueue;
66 
78 template <class MemDepPred, class Impl>
80 {
81  protected:
82  std::string _name;
83 
84  public:
85  typedef typename Impl::DynInstPtr DynInstPtr;
86  typedef typename Impl::DynInstConstPtr DynInstConstPtr;
87 
89  MemDepUnit();
90 
92  MemDepUnit(DerivO3CPUParams *params);
93 
95  ~MemDepUnit();
96 
98  std::string name() const { return _name; }
99 
101  void init(DerivO3CPUParams *params, ThreadID tid);
102 
104  void regStats();
105 
107  bool isDrained() const;
108 
110  void drainSanityCheck() const;
111 
113  void takeOverFrom();
114 
116  void setIQ(InstructionQueue<Impl> *iq_ptr);
117 
119  void insert(const DynInstPtr &inst);
120 
122  void insertNonSpec(const DynInstPtr &inst);
123 
125  void insertBarrier(const DynInstPtr &barr_inst);
126 
128  void regsReady(const DynInstPtr &inst);
129 
131  void nonSpecInstReady(const DynInstPtr &inst);
132 
134  void reschedule(const DynInstPtr &inst);
135 
139  void replay();
140 
142  void completed(const DynInstPtr &inst);
143 
145  void completeBarrier(const DynInstPtr &inst);
146 
148  void wakeDependents(const DynInstPtr &inst);
149 
153  void squash(const InstSeqNum &squashed_num, ThreadID tid);
154 
156  void violation(const DynInstPtr &store_inst,
157  const DynInstPtr &violating_load);
158 
160  void issue(const DynInstPtr &inst);
161 
163  void dumpLists();
164 
165  private:
167 
168  class MemDepEntry;
169 
170  typedef std::shared_ptr<MemDepEntry> MemDepEntryPtr;
171 
176  class MemDepEntry {
177  public:
179  MemDepEntry(const DynInstPtr &new_inst)
180  : inst(new_inst), regsReady(false), memDepReady(false),
181  completed(false), squashed(false)
182  {
183 #ifdef DEBUG
184  ++memdep_count;
185 
186  DPRINTF(MemDepUnit, "Memory dependency entry created. "
187  "memdep_count=%i %s\n", memdep_count, inst->pcState());
188 #endif
189  }
190 
193  {
194  for (int i = 0; i < dependInsts.size(); ++i) {
195  dependInsts[i] = NULL;
196  }
197 #ifdef DEBUG
198  --memdep_count;
199 
200  DPRINTF(MemDepUnit, "Memory dependency entry deleted. "
201  "memdep_count=%i %s\n", memdep_count, inst->pcState());
202 #endif
203  }
204 
206  std::string name() const { return "memdepentry"; }
207 
209  DynInstPtr inst;
210 
212  ListIt listIt;
213 
216 
218  bool regsReady;
222  bool completed;
224  bool squashed;
225 
227 #ifdef DEBUG
228  static int memdep_count;
229  static int memdep_insert;
230  static int memdep_erase;
231 #endif
232  };
233 
235  inline MemDepEntryPtr &findInHash(const DynInstConstPtr& inst);
236 
238  inline void moveToReady(MemDepEntryPtr &ready_inst_entry);
239 
240  typedef std::unordered_map<InstSeqNum, MemDepEntryPtr, SNHash> MemDepHash;
241 
242  typedef typename MemDepHash::iterator MemDepHashIt;
243 
245  MemDepHash memDepHash;
246 
248  std::list<DynInstPtr> instList[Impl::MaxThreads];
249 
252 
258  MemDepPred depPred;
259 
268 
271 
273  int id;
274 
283 };
284 
285 #endif // __CPU_O3_MEM_DEP_UNIT_HH__
#define DPRINTF(x,...)
Definition: trace.hh:225
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:54
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:86
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:2505
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:85
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:37
Memory dependence entries that track memory operations, marking when the instruction is ready to exec...
STL list class.
Definition: stl.hh:51
Stats::Scalar insertedStores
Stat for number of inserted stores.
MemDepPred depPred
The memory dependence predictor.
Memory dependency unit class.
Definition: mem_dep_unit.hh:79
int16_t ThreadID
Thread index/ID type.
Definition: types.hh:225
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.
Definition: mem_dep_unit.hh:98
std::unordered_map< InstSeqNum, MemDepEntryPtr, SNHash > MemDepHash
A standard instruction queue class.
Definition: inst_queue.hh:81
const FlagsType init
This Stat is Initialized.
Definition: info.hh:45
std::string _name
Definition: mem_dep_unit.hh:82
DynInstPtr inst
The instruction being tracked.
MemDepHash::iterator MemDepHashIt

Generated on Fri Jul 3 2020 15:53:00 for gem5 by doxygen 1.8.13