gem5 v23.0.0.1
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
56namespace gem5
57{
58
59namespace 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
84std::ostream& operator<<(std::ostream& out, const SequencerRequest& obj);
85
86class Sequencer : public RubyPort
87{
88 public:
89 typedef RubySequencerParams Params;
90 Sequencer(const Params &);
91 ~Sequencer();
92
97 void writeCallbackScFail(Addr address,
99
100 // Public Methods
101 virtual void wakeup(); // Used only for deadlock detection
102 void resetStats() override;
104
105 void writeCallback(Addr address,
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,
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
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
193
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
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
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
345};
346
347inline std::ostream&
348operator<<(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:295
bool isWrite() const
Definition packet.hh:594
bool trySatisfyFunctional(PacketPtr other)
Check a functional request against a memory value stored in another packet (i.e.
Definition packet.hh:1399
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 & getLatencyHist()
Definition Sequencer.hh:157
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:747
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 & getMissTypeLatencyHist(uint32_t t)
Definition Sequencer.hh:173
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
virtual int functionalWrite(Packet *func_pkt) override
Definition Sequencer.cc:260
std::vector< statistics::Histogram * > m_InitialToForwardDelayHist
Definition Sequencer.hh:287
statistics::Histogram & getMissMachLatencyHist(uint32_t t) const
Definition Sequencer.hh:176
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
std::vector< statistics::Histogram * > m_typeLatencyHist
Definition Sequencer.hh:262
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
statistics::Histogram & getHitTypeMachLatencyHist(uint32_t r, uint32_t t)
Definition Sequencer.hh:168
CacheMemory * m_dataCache_ptr
Definition Sequencer.hh:238
std::vector< statistics::Histogram * > m_FirstResponseToCompletionDelayHist
Definition Sequencer.hh:289
void incrementUnaddressedTransactionCnt()
Increment the unaddressed transaction counter.
Definition Sequencer.cc:977
statistics::Histogram & getTypeLatencyHist(uint32_t t)
Definition Sequencer.hh:158
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:598
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:991
statistics::Histogram m_latencyHist
Histogram for holding latency profile of all requests.
Definition Sequencer.hh:261
statistics::Histogram & getHitMachLatencyHist(uint32_t t)
Definition Sequencer.hh:165
void issueRequest(PacketPtr pkt, RubyRequestType type)
Definition Sequencer.cc:867
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
statistics::Histogram & getIssueToInitialDelayHist(uint32_t t) const
Definition Sequencer.hh:183
statistics::Histogram & getInitialToForwardDelayHist(const MachineType t) const
Definition Sequencer.hh:187
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:697
virtual RequestStatus insertRequest(PacketPtr pkt, RubyRequestType primary_type, RubyRequestType secondary_type)
Definition Sequencer.cc:306
Sequencer & operator=(const Sequencer &obj)
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 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:754
statistics::Histogram & getMissTypeMachLatencyHist(uint32_t r, uint32_t t) const
Definition Sequencer.hh:180
void descheduleDeadlockEvent() override
Definition Sequencer.hh:143
Cycles m_data_cache_hit_latency
Definition Sequencer.hh:244
statistics::Histogram & getFirstResponseToCompletionDelayHist(const MachineType t) const
Definition Sequencer.hh:195
void llscClearLocalMonitor()
Removes all addresses from the local monitor.
Definition Sequencer.cc:219
void recordRequestType(SequencerRequestType requestType)
Definition Sequencer.cc:964
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:955
statistics::Histogram & getOutstandReqHist()
Definition Sequencer.hh:155
statistics::Histogram & getHitLatencyHist()
Definition Sequencer.hh:161
statistics::Histogram & getHitTypeLatencyHist(uint32_t t)
Definition Sequencer.hh:162
RubySequencerParams Params
Definition Sequencer.hh:89
std::vector< std::vector< statistics::Histogram * > > m_hitTypeMachLatencyHist
Definition Sequencer.hh:272
statistics::Histogram & getMissLatencyHist()
Definition Sequencer.hh:171
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:970
std::vector< statistics::Histogram * > m_ForwardToFirstResponseDelayHist
Definition Sequencer.hh:288
statistics::Histogram & getForwardRequestToFirstResponseHist(const MachineType t) const
Definition Sequencer.hh:191
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:546
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
std::vector< std::vector< statistics::Histogram * > > m_missTypeMachLatencyHist
Definition Sequencer.hh:283
A simple histogram stat.
STL vector class.
Definition stl.hh:37
void deschedule(Event &event)
Definition eventq.hh:1021
bool scheduled() const
Determine if the current event is scheduled.
Definition eventq.hh:458
Bitfield< 5 > t
Definition misc_types.hh:71
double Counter
All counters are of 64-bit values.
Definition types.hh:46
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
std::ostream & operator<<(std::ostream &os, const ArmSemihosting::InPlaceArg &ipa)
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
bool functionalWrite(Packet *func_pkt) const
Definition Sequencer.hh:74

Generated on Mon Jul 10 2023 15:32:05 for gem5 by doxygen 1.9.7