gem5  v22.1.0.0
Sequencer.hh
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2019-2021 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) 1999-2008 Mark D. Hill and David A. Wood
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 __MEM_RUBY_SYSTEM_SEQUENCER_HH__
42 #define __MEM_RUBY_SYSTEM_SEQUENCER_HH__
43 
44 #include <iostream>
45 #include <list>
46 #include <unordered_map>
47 
49 #include "mem/ruby/protocol/MachineType.hh"
50 #include "mem/ruby/protocol/RubyRequestType.hh"
51 #include "mem/ruby/protocol/SequencerRequestType.hh"
54 #include "params/RubySequencer.hh"
55 
56 namespace gem5
57 {
58 
59 namespace ruby
60 {
61 
63 {
65  RubyRequestType m_type;
66  RubyRequestType m_second_type;
68  SequencerRequest(PacketPtr _pkt, RubyRequestType _m_type,
69  RubyRequestType _m_second_type, Cycles _issue_time)
70  : pkt(_pkt), m_type(_m_type), m_second_type(_m_second_type),
71  issue_time(_issue_time)
72  {}
73 
74  bool functionalWrite(Packet *func_pkt) const
75  {
76  // Follow-up on RubyRequest::functionalWrite
77  // This makes sure the hitCallback won't overrite the value we
78  // expect to find
79  assert(func_pkt->isWrite());
80  return func_pkt->trySatisfyFunctional(pkt);
81  }
82 };
83 
84 std::ostream& operator<<(std::ostream& out, const SequencerRequest& obj);
85 
86 class Sequencer : public RubyPort
87 {
88  public:
89  typedef RubySequencerParams Params;
90  Sequencer(const Params &);
91  ~Sequencer();
92 
97  void writeCallbackScFail(Addr address,
98  DataBlock& data);
99 
100  // Public Methods
101  virtual void wakeup(); // Used only for deadlock detection
102  void resetStats() override;
103  void collateStats();
104 
105  void writeCallback(Addr address,
106  DataBlock& data,
107  const bool externalHit = false,
108  const MachineType mach = MachineType_NUM,
109  const Cycles initialRequestTime = Cycles(0),
110  const Cycles forwardRequestTime = Cycles(0),
111  const Cycles firstResponseTime = Cycles(0),
112  const bool noCoales = false);
113 
114  // Write callback that prevents coalescing
116  {
117  writeCallback(address, data, true, MachineType_NUM, Cycles(0),
118  Cycles(0), Cycles(0), true);
119  }
120 
121  void readCallback(Addr address,
122  DataBlock& data,
123  const bool externalHit = false,
124  const MachineType mach = MachineType_NUM,
125  const Cycles initialRequestTime = Cycles(0),
126  const Cycles forwardRequestTime = Cycles(0),
127  const Cycles firstResponseTime = Cycles(0));
128 
129  void unaddressedCallback(Addr unaddressedReqId,
130  RubyRequestType requestType,
131  const MachineType mach = MachineType_NUM,
132  const Cycles initialRequestTime = Cycles(0),
133  const Cycles forwardRequestTime = Cycles(0),
134  const Cycles firstResponseTime = Cycles(0));
135 
136  RequestStatus makeRequest(PacketPtr pkt) override;
137  virtual bool empty() const;
138  int outstandingCount() const override { return m_outstanding_count; }
139 
140  bool isDeadlockEventScheduled() const override
141  { return deadlockCheckEvent.scheduled(); }
142 
143  void descheduleDeadlockEvent() override
145 
146  virtual void print(std::ostream& out) const;
147 
148  void markRemoved();
149  void evictionCallback(Addr address);
150  int coreId() const { return m_coreId; }
151 
152  virtual int functionalWrite(Packet *func_pkt) override;
153 
154  void recordRequestType(SequencerRequestType requestType);
156 
159  { return *m_typeLatencyHist[t]; }
160 
163  { return *m_hitTypeLatencyHist[t]; }
164 
166  { return *m_hitMachLatencyHist[t]; }
167 
169  { return *m_hitTypeMachLatencyHist[r][t]; }
170 
172  { return m_missLatencyHist; }
174  { return *m_missTypeLatencyHist[t]; }
175 
177  { return *m_missMachLatencyHist[t]; }
178 
180  getMissTypeMachLatencyHist(uint32_t r, uint32_t t) const
181  { return *m_missTypeMachLatencyHist[r][t]; }
182 
184  { return *m_IssueToInitialDelayHist[t]; }
185 
187  getInitialToForwardDelayHist(const MachineType t) const
188  { return *m_InitialToForwardDelayHist[t]; }
189 
191  getForwardRequestToFirstResponseHist(const MachineType t) const
193 
195  getFirstResponseToCompletionDelayHist(const MachineType t) const
197 
198  statistics::Counter getIncompleteTimes(const MachineType t) const
199  { return m_IncompleteTimes[t]; }
200 
201  private:
202  void issueRequest(PacketPtr pkt, RubyRequestType type);
203 
204  void hitCallback(SequencerRequest* srequest, DataBlock& data,
205  bool llscSuccess,
206  const MachineType mach, const bool externalHit,
207  const Cycles initialRequestTime,
208  const Cycles forwardRequestTime,
209  const Cycles firstResponseTime,
210  const bool was_coalesced);
211 
212  void recordMissLatency(SequencerRequest* srequest, bool llscSuccess,
213  const MachineType respondingMach,
214  bool isExternalHit, Cycles initialRequestTime,
215  Cycles forwardRequestTime,
216  Cycles firstResponseTime);
217 
218  // Private copy constructor and assignment operator
219  Sequencer(const Sequencer& obj);
221 
222  protected:
223  // RequestTable contains both read and write requests, handles aliasing
224  std::unordered_map<Addr, std::list<SequencerRequest>> m_RequestTable;
225  // UnadressedRequestTable contains "unaddressed" requests,
226  // guaranteed not to alias each other
227  std::unordered_map<uint64_t, SequencerRequest> m_UnaddressedRequestTable;
228 
230 
231  virtual RequestStatus insertRequest(PacketPtr pkt,
232  RubyRequestType primary_type,
233  RubyRequestType secondary_type);
234 
235  private:
237 
239 
240  // The cache access latency for top-level caches (L0/L1). These are
241  // currently assessed at the beginning of each memory access through the
242  // sequencer.
243  // TODO: Migrate these latencies into top-level cache controllers.
246 
247  // Global outstanding request count, across all request tables
250 
251  int m_coreId;
252 
254 
256 
259 
263 
268 
273 
278 
284 
291 
293 
294  // support for LL/SC
295 
300  void llscLoadLinked(const Addr);
301 
306  void llscClearMonitor(const Addr);
307 
316  bool llscStoreConditional(const Addr);
317 
318 
323 
328  uint64_t getCurrentUnaddressedTransactionID() const;
329 
330  public:
337  bool llscCheckMonitor(const Addr);
338 
339 
344  void llscClearLocalMonitor();
345 };
346 
347 inline std::ostream&
348 operator<<(std::ostream& out, const Sequencer& obj)
349 {
350  obj.print(out);
351  out << std::flush;
352  return out;
353 }
354 
355 } // namespace ruby
356 } // namespace gem5
357 
358 #endif // __MEM_RUBY_SYSTEM_SEQUENCER_HH__
const char data[]
Cycles is a wrapper class for representing cycle counts, i.e.
Definition: types.hh:79
A Packet is used to encapsulate a transfer between two objects in the memory system (e....
Definition: packet.hh:294
bool isWrite() const
Definition: packet.hh:593
bool trySatisfyFunctional(PacketPtr other)
Check a functional request against a memory value stored in another packet (i.e.
Definition: packet.hh:1386
RubyPortParams Params
Definition: RubyPort.hh:153
statistics::Histogram m_outstandReqHist
Histogram for number of outstanding requests per cycle.
Definition: Sequencer.hh:258
void resetStats() override
Callback to reset stats.
Definition: Sequencer.cc:274
statistics::Histogram & getHitLatencyHist()
Definition: Sequencer.hh:161
Sequencer(const Sequencer &obj)
std::unordered_map< Addr, std::list< SequencerRequest > > m_RequestTable
Definition: Sequencer.hh:224
int outstandingCount() const override
Definition: Sequencer.hh:138
virtual bool empty() const
Definition: Sequencer.cc:754
void writeCallback(Addr address, DataBlock &data, const bool externalHit=false, const MachineType mach=MachineType_NUM, const Cycles initialRequestTime=Cycles(0), const Cycles forwardRequestTime=Cycles(0), const Cycles firstResponseTime=Cycles(0), const bool noCoales=false)
Definition: Sequencer.cc:448
statistics::Histogram & getHitTypeLatencyHist(uint32_t t)
Definition: Sequencer.hh:162
statistics::Histogram & getForwardRequestToFirstResponseHist(const MachineType t) const
Definition: Sequencer.hh:191
std::vector< statistics::Counter > m_IncompleteTimes
Definition: Sequencer.hh:290
bool llscCheckMonitor(const Addr)
Searches for cache line address in the global monitor tagged with this Sequencer object's version id.
Definition: Sequencer.cc:203
statistics::Histogram & getMissTypeMachLatencyHist(uint32_t r, uint32_t t) const
Definition: Sequencer.hh:180
virtual int functionalWrite(Packet *func_pkt) override
Definition: Sequencer.cc:260
std::vector< statistics::Histogram * > m_InitialToForwardDelayHist
Definition: Sequencer.hh:287
statistics::Histogram & getHitTypeMachLatencyHist(uint32_t r, uint32_t t)
Definition: Sequencer.hh:168
std::vector< statistics::Histogram * > m_hitMachLatencyHist
Histograms for profiling the latencies for requests that did not required external messages.
Definition: Sequencer.hh:271
void recordMissLatency(SequencerRequest *srequest, bool llscSuccess, const MachineType respondingMach, bool isExternalHit, Cycles initialRequestTime, Cycles forwardRequestTime, Cycles firstResponseTime)
Definition: Sequencer.cc:375
statistics::Histogram & getMissTypeLatencyHist(uint32_t t)
Definition: Sequencer.hh:173
statistics::Histogram & getMissLatencyHist()
Definition: Sequencer.hh:171
std::vector< statistics::Histogram * > m_typeLatencyHist
Definition: Sequencer.hh:262
statistics::Histogram & getOutstandReqHist()
Definition: Sequencer.hh:155
bool isDeadlockEventScheduled() const override
Definition: Sequencer.hh:140
void writeCallbackScFail(Addr address, DataBlock &data)
Proxy function to writeCallback that first invalidates the line address in the local monitor.
Definition: Sequencer.cc:441
CacheMemory * m_dataCache_ptr
Definition: Sequencer.hh:238
statistics::Histogram & getLatencyHist()
Definition: Sequencer.hh:157
std::vector< statistics::Histogram * > m_FirstResponseToCompletionDelayHist
Definition: Sequencer.hh:289
void incrementUnaddressedTransactionCnt()
Increment the unaddressed transaction counter.
Definition: Sequencer.cc:984
statistics::Histogram & getIssueToInitialDelayHist(uint32_t t) const
Definition: Sequencer.hh:183
void hitCallback(SequencerRequest *srequest, DataBlock &data, bool llscSuccess, const MachineType mach, const bool externalHit, const Cycles initialRequestTime, const Cycles forwardRequestTime, const Cycles firstResponseTime, const bool was_coalesced)
Definition: Sequencer.cc:605
statistics::Counter getIncompleteTimes(const MachineType t) const
Definition: Sequencer.hh:198
void llscLoadLinked(const Addr)
Places the cache line address into the global monitor tagged with this Sequencer object's version id.
Definition: Sequencer.cc:153
uint64_t getCurrentUnaddressedTransactionID() const
Generate the current unaddressed transaction ID based on the counter and the Sequencer object's versi...
Definition: Sequencer.cc:998
Sequencer(const Params &)
Definition: Sequencer.cc:70
statistics::Histogram m_latencyHist
Histogram for holding latency profile of all requests.
Definition: Sequencer.hh:261
Sequencer & operator=(const Sequencer &obj)
void issueRequest(PacketPtr pkt, RubyRequestType type)
Definition: Sequencer.cc:874
bool llscStoreConditional(const Addr)
Searches for cache line address in the global monitor tagged with this Sequencer object's version id.
Definition: Sequencer.cc:180
void unaddressedCallback(Addr unaddressedReqId, RubyRequestType requestType, const MachineType mach=MachineType_NUM, const Cycles initialRequestTime=Cycles(0), const Cycles forwardRequestTime=Cycles(0), const Cycles firstResponseTime=Cycles(0))
Definition: Sequencer.cc:704
virtual RequestStatus insertRequest(PacketPtr pkt, RubyRequestType primary_type, RubyRequestType secondary_type)
Definition: Sequencer.cc:306
statistics::Histogram & getTypeLatencyHist(uint32_t t)
Definition: Sequencer.hh:158
EventFunctionWrapper deadlockCheckEvent
Definition: Sequencer.hh:292
std::unordered_map< uint64_t, SequencerRequest > m_UnaddressedRequestTable
Definition: Sequencer.hh:227
uint64_t m_unaddressedTransactionCnt
Definition: Sequencer.hh:253
std::vector< statistics::Histogram * > m_hitTypeLatencyHist
Definition: Sequencer.hh:267
statistics::Histogram & getFirstResponseToCompletionDelayHist(const MachineType t) const
Definition: Sequencer.hh:195
statistics::Histogram m_hitLatencyHist
Histogram for holding latency profile of all requests that hit in the controller connected to this se...
Definition: Sequencer.hh:266
RequestStatus makeRequest(PacketPtr pkt) override
Definition: Sequencer.cc:761
statistics::Histogram & getInitialToForwardDelayHist(const MachineType t) const
Definition: Sequencer.hh:187
void descheduleDeadlockEvent() override
Definition: Sequencer.hh:143
Cycles m_data_cache_hit_latency
Definition: Sequencer.hh:244
void llscClearLocalMonitor()
Removes all addresses from the local monitor.
Definition: Sequencer.cc:219
void recordRequestType(SequencerRequestType requestType)
Definition: Sequencer.cc:971
std::vector< statistics::Histogram * > m_IssueToInitialDelayHist
Histograms for recording the breakdown of miss latency.
Definition: Sequencer.hh:286
virtual void print(std::ostream &out) const
Definition: Sequencer.cc:962
RubySequencerParams Params
Definition: Sequencer.hh:89
std::vector< std::vector< statistics::Histogram * > > m_hitTypeMachLatencyHist
Definition: Sequencer.hh:272
void llscClearMonitor(const Addr)
Removes the cache line address from the global monitor.
Definition: Sequencer.cc:166
void writeUniqueCallback(Addr address, DataBlock &data)
Definition: Sequencer.hh:115
Cycles m_inst_cache_hit_latency
Definition: Sequencer.hh:245
virtual void wakeup()
Definition: Sequencer.cc:225
void evictionCallback(Addr address)
Definition: Sequencer.cc:977
statistics::Histogram & getMissMachLatencyHist(uint32_t t) const
Definition: Sequencer.hh:176
std::vector< statistics::Histogram * > m_ForwardToFirstResponseDelayHist
Definition: Sequencer.hh:288
void readCallback(Addr address, DataBlock &data, const bool externalHit=false, const MachineType mach=MachineType_NUM, const Cycles initialRequestTime=Cycles(0), const Cycles forwardRequestTime=Cycles(0), const Cycles firstResponseTime=Cycles(0))
Definition: Sequencer.cc:550
int coreId() const
Definition: Sequencer.hh:150
std::vector< statistics::Histogram * > m_missMachLatencyHist
Histograms for profiling the latencies for requests that required external messages.
Definition: Sequencer.hh:281
std::vector< statistics::Histogram * > m_missTypeLatencyHist
Definition: Sequencer.hh:277
statistics::Histogram m_missLatencyHist
Histogram for holding latency profile of all requests that miss in the controller connected to this s...
Definition: Sequencer.hh:276
statistics::Histogram & getHitMachLatencyHist(uint32_t t)
Definition: Sequencer.hh:165
std::vector< std::vector< statistics::Histogram * > > m_missTypeMachLatencyHist
Definition: Sequencer.hh:283
A simple histogram stat.
Definition: statistics.hh:2127
STL vector class.
Definition: stl.hh:37
void deschedule(Event &event)
Definition: eventq.hh:1028
bool scheduled() const
Determine if the current event is scheduled.
Definition: eventq.hh:465
Bitfield< 5 > r
Definition: pagetable.hh:60
Bitfield< 51 > t
Definition: pagetable.hh:56
std::ostream & operator<<(std::ostream &os, const BoolVec &myvector)
Definition: BoolVec.cc:49
double Counter
All counters are of 64-bit values.
Definition: types.hh:47
Reference material can be found at the JEDEC website: UFS standard http://www.jedec....
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
Definition: types.hh:147
SequencerRequest(PacketPtr _pkt, RubyRequestType _m_type, RubyRequestType _m_second_type, Cycles _issue_time)
Definition: Sequencer.hh:68
RubyRequestType m_second_type
Definition: Sequencer.hh:66
RubyRequestType m_type
Definition: Sequencer.hh:65
bool functionalWrite(Packet *func_pkt) const
Definition: Sequencer.hh:74

Generated on Wed Dec 21 2022 10:22:39 for gem5 by doxygen 1.9.1