gem5  v21.0.0.0
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
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 
57 {
59  RubyRequestType m_type;
60  RubyRequestType m_second_type;
62  SequencerRequest(PacketPtr _pkt, RubyRequestType _m_type,
63  RubyRequestType _m_second_type, Cycles _issue_time)
64  : pkt(_pkt), m_type(_m_type), m_second_type(_m_second_type),
65  issue_time(_issue_time)
66  {}
67 
68  bool functionalWrite(Packet *func_pkt) const
69  {
70  // Follow-up on RubyRequest::functionalWrite
71  // This makes sure the hitCallback won't overrite the value we
72  // expect to find
73  assert(func_pkt->isWrite());
74  return func_pkt->trySatisfyFunctional(pkt);
75  }
76 };
77 
78 std::ostream& operator<<(std::ostream& out, const SequencerRequest& obj);
79 
80 class Sequencer : public RubyPort
81 {
82  public:
83  typedef RubySequencerParams Params;
84  Sequencer(const Params &);
85  ~Sequencer();
86 
91  void writeCallbackScFail(Addr address,
92  DataBlock& data);
93 
94  // Public Methods
95  virtual void wakeup(); // Used only for deadlock detection
96  void resetStats() override;
97  void collateStats();
98 
99  void writeCallback(Addr address,
100  DataBlock& data,
101  const bool externalHit = false,
102  const MachineType mach = MachineType_NUM,
103  const Cycles initialRequestTime = Cycles(0),
104  const Cycles forwardRequestTime = Cycles(0),
105  const Cycles firstResponseTime = Cycles(0),
106  const bool noCoales = false);
107 
108  // Write callback that prevents coalescing
110  {
111  writeCallback(address, data, true, MachineType_NUM, Cycles(0),
112  Cycles(0), Cycles(0), true);
113  }
114 
115  void readCallback(Addr address,
116  DataBlock& data,
117  const bool externalHit = false,
118  const MachineType mach = MachineType_NUM,
119  const Cycles initialRequestTime = Cycles(0),
120  const Cycles forwardRequestTime = Cycles(0),
121  const Cycles firstResponseTime = Cycles(0));
122 
123  RequestStatus makeRequest(PacketPtr pkt) override;
124  virtual bool empty() const;
125  int outstandingCount() const override { return m_outstanding_count; }
126 
127  bool isDeadlockEventScheduled() const override
128  { return deadlockCheckEvent.scheduled(); }
129 
130  void descheduleDeadlockEvent() override
132 
133  virtual void print(std::ostream& out) const;
134 
135  void markRemoved();
136  void evictionCallback(Addr address);
137  int coreId() const { return m_coreId; }
138 
139  virtual int functionalWrite(Packet *func_pkt) override;
140 
141  void recordRequestType(SequencerRequestType requestType);
143 
146  { return *m_typeLatencyHist[t]; }
147 
150  { return *m_hitTypeLatencyHist[t]; }
151 
153  { return *m_hitMachLatencyHist[t]; }
154 
156  { return *m_hitTypeMachLatencyHist[r][t]; }
157 
159  { return m_missLatencyHist; }
161  { return *m_missTypeLatencyHist[t]; }
162 
164  { return *m_missMachLatencyHist[t]; }
165 
167  getMissTypeMachLatencyHist(uint32_t r, uint32_t t) const
168  { return *m_missTypeMachLatencyHist[r][t]; }
169 
171  { return *m_IssueToInitialDelayHist[t]; }
172 
174  getInitialToForwardDelayHist(const MachineType t) const
175  { return *m_InitialToForwardDelayHist[t]; }
176 
178  getForwardRequestToFirstResponseHist(const MachineType t) const
180 
182  getFirstResponseToCompletionDelayHist(const MachineType t) const
184 
185  Stats::Counter getIncompleteTimes(const MachineType t) const
186  { return m_IncompleteTimes[t]; }
187 
188  private:
189  void issueRequest(PacketPtr pkt, RubyRequestType type);
190 
191  void hitCallback(SequencerRequest* srequest, DataBlock& data,
192  bool llscSuccess,
193  const MachineType mach, const bool externalHit,
194  const Cycles initialRequestTime,
195  const Cycles forwardRequestTime,
196  const Cycles firstResponseTime,
197  const bool was_coalesced);
198 
199  void recordMissLatency(SequencerRequest* srequest, bool llscSuccess,
200  const MachineType respondingMach,
201  bool isExternalHit, Cycles initialRequestTime,
202  Cycles forwardRequestTime,
203  Cycles firstResponseTime);
204 
205  // Private copy constructor and assignment operator
206  Sequencer(const Sequencer& obj);
207  Sequencer& operator=(const Sequencer& obj);
208 
209  protected:
210  // RequestTable contains both read and write requests, handles aliasing
211  std::unordered_map<Addr, std::list<SequencerRequest>> m_RequestTable;
212 
214 
215  virtual RequestStatus insertRequest(PacketPtr pkt,
216  RubyRequestType primary_type,
217  RubyRequestType secondary_type);
218 
219  private:
221 
223 
224  // The cache access latency for top-level caches (L0/L1). These are
225  // currently assessed at the beginning of each memory access through the
226  // sequencer.
227  // TODO: Migrate these latencies into top-level cache controllers.
230 
231  // Global outstanding request count, across all request tables
234 
235  int m_coreId;
236 
238 
241 
245 
250 
255 
260 
265 
272 
274 
275  // support for LL/SC
276 
281  void llscLoadLinked(const Addr);
282 
287  void llscClearMonitor(const Addr);
288 
297  bool llscStoreConditional(const Addr);
298 
299  public:
306  bool llscCheckMonitor(const Addr);
307 
308 
313  void llscClearLocalMonitor();
314 };
315 
316 inline std::ostream&
317 operator<<(std::ostream& out, const Sequencer& obj)
318 {
319  obj.print(out);
320  out << std::flush;
321  return out;
322 }
323 
324 #endif // __MEM_RUBY_SYSTEM_SEQUENCER_HH__
Sequencer::getLatencyHist
Stats::Histogram & getLatencyHist()
Definition: Sequencer.hh:144
Event::scheduled
bool scheduled() const
Determine if the current event is scheduled.
Definition: eventq.hh:462
Sequencer::m_ForwardToFirstResponseDelayHist
std::vector< Stats::Histogram * > m_ForwardToFirstResponseDelayHist
Definition: Sequencer.hh:269
Sequencer::getIncompleteTimes
Stats::Counter getIncompleteTimes(const MachineType t) const
Definition: Sequencer.hh:185
Sequencer::getTypeLatencyHist
Stats::Histogram & getTypeLatencyHist(uint32_t t)
Definition: Sequencer.hh:145
Sequencer::getMissMachLatencyHist
Stats::Histogram & getMissMachLatencyHist(uint32_t t) const
Definition: Sequencer.hh:163
Sequencer::getOutstandReqHist
Stats::Histogram & getOutstandReqHist()
Definition: Sequencer.hh:142
Sequencer::getHitLatencyHist
Stats::Histogram & getHitLatencyHist()
Definition: Sequencer.hh:148
Sequencer::getMissTypeMachLatencyHist
Stats::Histogram & getMissTypeMachLatencyHist(uint32_t r, uint32_t t) const
Definition: Sequencer.hh:167
Sequencer::m_outstanding_count
int m_outstanding_count
Definition: Sequencer.hh:232
Sequencer::functionalWrite
virtual int functionalWrite(Packet *func_pkt) override
Definition: Sequencer.cc:245
Sequencer::m_outstandReqHist
Stats::Histogram m_outstandReqHist
Histogram for number of outstanding requests per cycle.
Definition: Sequencer.hh:240
SequencerRequest::pkt
PacketPtr pkt
Definition: Sequencer.hh:58
Sequencer::getHitMachLatencyHist
Stats::Histogram & getHitMachLatencyHist(uint32_t t)
Definition: Sequencer.hh:152
Sequencer::empty
virtual bool empty() const
Definition: Sequencer.cc:640
Sequencer::m_missMachLatencyHist
std::vector< Stats::Histogram * > m_missMachLatencyHist
Histograms for profiling the latencies for requests that required external messages.
Definition: Sequencer.hh:263
data
const char data[]
Definition: circlebuf.test.cc:47
Sequencer::resetStats
void resetStats() override
Callback to reset stats.
Definition: Sequencer.cc:259
Sequencer::m_max_outstanding_requests
int m_max_outstanding_requests
Definition: Sequencer.hh:220
Sequencer
Definition: Sequencer.hh:80
Sequencer::writeCallbackScFail
void writeCallbackScFail(Addr address, DataBlock &data)
Proxy function to writeCallback that first invalidates the line address in the local monitor.
Definition: Sequencer.cc:390
RubyPort::Params
RubyPortParams Params
Definition: RubyPort.hh:146
Sequencer::Sequencer
Sequencer(const Params &)
Definition: Sequencer.cc:62
Sequencer::m_hitTypeLatencyHist
std::vector< Stats::Histogram * > m_hitTypeLatencyHist
Definition: Sequencer.hh:249
Sequencer::getForwardRequestToFirstResponseHist
Stats::Histogram & getForwardRequestToFirstResponseHist(const MachineType t) const
Definition: Sequencer.hh:178
Sequencer::m_IssueToInitialDelayHist
std::vector< Stats::Histogram * > m_IssueToInitialDelayHist
Histograms for recording the breakdown of miss latency.
Definition: Sequencer.hh:267
Sequencer::getFirstResponseToCompletionDelayHist
Stats::Histogram & getFirstResponseToCompletionDelayHist(const MachineType t) const
Definition: Sequencer.hh:182
Sequencer::isDeadlockEventScheduled
bool isDeadlockEventScheduled() const override
Definition: Sequencer.hh:127
Sequencer::m_data_cache_hit_latency
Cycles m_data_cache_hit_latency
Definition: Sequencer.hh:228
SequencerRequest::m_type
RubyRequestType m_type
Definition: Sequencer.hh:59
Sequencer::m_dataCache_ptr
CacheMemory * m_dataCache_ptr
Definition: Sequencer.hh:222
Sequencer::wakeup
virtual void wakeup()
Definition: Sequencer.cc:210
Sequencer::~Sequencer
~Sequencer()
Definition: Sequencer.cc:133
Sequencer::makeRequest
RequestStatus makeRequest(PacketPtr pkt) override
Definition: Sequencer.cc:646
Sequencer::writeUniqueCallback
void writeUniqueCallback(Addr address, DataBlock &data)
Definition: Sequencer.hh:109
EventManager::deschedule
void deschedule(Event &event)
Definition: eventq.hh:1025
std::vector< Stats::Histogram * >
Sequencer::m_coreId
int m_coreId
Definition: Sequencer.hh:235
Sequencer::coreId
int coreId() const
Definition: Sequencer.hh:137
Sequencer::collateStats
void collateStats()
Sequencer::m_RequestTable
std::unordered_map< Addr, std::list< SequencerRequest > > m_RequestTable
Definition: Sequencer.hh:211
Sequencer::m_hitLatencyHist
Stats::Histogram m_hitLatencyHist
Histogram for holding latency profile of all requests that hit in the controller connected to this se...
Definition: Sequencer.hh:248
Sequencer::m_latencyHist
Stats::Histogram m_latencyHist
Histogram for holding latency profile of all requests.
Definition: Sequencer.hh:243
Sequencer::m_missTypeMachLatencyHist
std::vector< std::vector< Stats::Histogram * > > m_missTypeMachLatencyHist
Definition: Sequencer.hh:264
Sequencer::m_runningGarnetStandalone
bool m_runningGarnetStandalone
Definition: Sequencer.hh:237
SequencerRequest::SequencerRequest
SequencerRequest(PacketPtr _pkt, RubyRequestType _m_type, RubyRequestType _m_second_type, Cycles _issue_time)
Definition: Sequencer.hh:62
DataBlock
Definition: DataBlock.hh:54
Sequencer::getMissTypeLatencyHist
Stats::Histogram & getMissTypeLatencyHist(uint32_t t)
Definition: Sequencer.hh:160
EventFunctionWrapper
Definition: eventq.hh:1112
Stats::Histogram
A simple histogram stat.
Definition: statistics.hh:2126
SequencerRequest::issue_time
Cycles issue_time
Definition: Sequencer.hh:61
SequencerRequest::m_second_type
RubyRequestType m_second_type
Definition: Sequencer.hh:60
Sequencer::print
virtual void print(std::ostream &out) const
Definition: Sequencer.cc:821
Sequencer::insertRequest
virtual RequestStatus insertRequest(PacketPtr pkt, RubyRequestType primary_type, RubyRequestType secondary_type)
Definition: Sequencer.cc:291
CacheMemory.hh
Sequencer::recordMissLatency
void recordMissLatency(SequencerRequest *srequest, bool llscSuccess, const MachineType respondingMach, bool isExternalHit, Cycles initialRequestTime, Cycles forwardRequestTime, Cycles firstResponseTime)
Definition: Sequencer.cc:324
Sequencer::llscStoreConditional
bool llscStoreConditional(const Addr)
Searches for cache line address in the global monitor tagged with this Sequencer object's version id.
Definition: Sequencer.cc:165
Sequencer::getIssueToInitialDelayHist
Stats::Histogram & getIssueToInitialDelayHist(uint32_t t) const
Definition: Sequencer.hh:170
Sequencer::Params
RubySequencerParams Params
Definition: Sequencer.hh:83
Sequencer::readCallback
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:499
Sequencer::descheduleDeadlockEvent
void descheduleDeadlockEvent() override
Definition: Sequencer.hh:130
RubyPort
Definition: RubyPort.hh:58
Sequencer::markRemoved
void markRemoved()
Definition: Sequencer.cc:318
MipsISA::r
r
Definition: pra_constants.hh:95
Sequencer::m_deadlock_check_scheduled
bool m_deadlock_check_scheduled
Definition: Sequencer.hh:233
Sequencer::m_missLatencyHist
Stats::Histogram m_missLatencyHist
Histogram for holding latency profile of all requests that miss in the controller connected to this s...
Definition: Sequencer.hh:258
Sequencer::llscLoadLinked
void llscLoadLinked(const Addr)
Places the cache line address into the global monitor tagged with this Sequencer object's version id.
Definition: Sequencer.cc:138
Sequencer::getHitTypeMachLatencyHist
Stats::Histogram & getHitTypeMachLatencyHist(uint32_t r, uint32_t t)
Definition: Sequencer.hh:155
Sequencer::deadlockCheckEvent
EventFunctionWrapper deadlockCheckEvent
Definition: Sequencer.hh:273
CacheMemory
Definition: CacheMemory.hh:63
Sequencer::evictionCallback
void evictionCallback(Addr address)
Definition: Sequencer.cc:836
Sequencer::m_IncompleteTimes
std::vector< Stats::Counter > m_IncompleteTimes
Definition: Sequencer.hh:271
Sequencer::llscClearMonitor
void llscClearMonitor(const Addr)
Removes the cache line address from the global monitor.
Definition: Sequencer.cc:151
Sequencer::recordRequestType
void recordRequestType(SequencerRequestType requestType)
Definition: Sequencer.cc:830
Sequencer::hitCallback
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:554
SequencerRequest::functionalWrite
bool functionalWrite(Packet *func_pkt) const
Definition: Sequencer.hh:68
Addr
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
Definition: types.hh:148
Sequencer::m_hitTypeMachLatencyHist
std::vector< std::vector< Stats::Histogram * > > m_hitTypeMachLatencyHist
Definition: Sequencer.hh:254
Sequencer::llscCheckMonitor
bool llscCheckMonitor(const Addr)
Searches for cache line address in the global monitor tagged with this Sequencer object's version id.
Definition: Sequencer.cc:188
Sequencer::getMissLatencyHist
Stats::Histogram & getMissLatencyHist()
Definition: Sequencer.hh:158
Sequencer::outstandingCount
int outstandingCount() const override
Definition: Sequencer.hh:125
Stats::Counter
double Counter
All counters are of 64-bit values.
Definition: types.hh:41
Sequencer::m_hitMachLatencyHist
std::vector< Stats::Histogram * > m_hitMachLatencyHist
Histograms for profiling the latencies for requests that did not required external messages.
Definition: Sequencer.hh:253
Sequencer::m_InitialToForwardDelayHist
std::vector< Stats::Histogram * > m_InitialToForwardDelayHist
Definition: Sequencer.hh:268
Sequencer::m_deadlock_threshold
Cycles m_deadlock_threshold
Definition: Sequencer.hh:213
Address.hh
ArmISA::t
Bitfield< 5 > t
Definition: miscregs_types.hh:67
Sequencer::writeCallback
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:397
Packet
A Packet is used to encapsulate a transfer between two objects in the memory system (e....
Definition: packet.hh:258
Sequencer::m_typeLatencyHist
std::vector< Stats::Histogram * > m_typeLatencyHist
Definition: Sequencer.hh:244
Cycles
Cycles is a wrapper class for representing cycle counts, i.e.
Definition: types.hh:79
Packet::isWrite
bool isWrite() const
Definition: packet.hh:558
SequencerRequest
Definition: Sequencer.hh:56
X86ISA::type
type
Definition: misc.hh:727
Sequencer::issueRequest
void issueRequest(PacketPtr pkt, RubyRequestType type)
Definition: Sequencer.cc:762
Packet::trySatisfyFunctional
bool trySatisfyFunctional(PacketPtr other)
Check a functional request against a memory value stored in another packet (i.e.
Definition: packet.hh:1332
RubyPort.hh
Sequencer::operator=
Sequencer & operator=(const Sequencer &obj)
Sequencer::m_inst_cache_hit_latency
Cycles m_inst_cache_hit_latency
Definition: Sequencer.hh:229
operator<<
std::ostream & operator<<(std::ostream &out, const SequencerRequest &obj)
Sequencer::llscClearLocalMonitor
void llscClearLocalMonitor()
Removes all addresses from the local monitor.
Definition: Sequencer.cc:204
Sequencer::getHitTypeLatencyHist
Stats::Histogram & getHitTypeLatencyHist(uint32_t t)
Definition: Sequencer.hh:149
Sequencer::m_FirstResponseToCompletionDelayHist
std::vector< Stats::Histogram * > m_FirstResponseToCompletionDelayHist
Definition: Sequencer.hh:270
Sequencer::m_missTypeLatencyHist
std::vector< Stats::Histogram * > m_missTypeLatencyHist
Definition: Sequencer.hh:259
Sequencer::getInitialToForwardDelayHist
Stats::Histogram & getInitialToForwardDelayHist(const MachineType t) const
Definition: Sequencer.hh:174

Generated on Tue Mar 23 2021 19:41:28 for gem5 by doxygen 1.8.17