gem5 v24.0.0.0
Loading...
Searching...
No Matches
base.hh
Go to the documentation of this file.
1/*
2 * Copyright (c) 2012-2013, 2016-2020 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 * Redistribution and use in source and binary forms, with or without
15 * modification, are permitted provided that the following conditions are
16 * met: redistributions of source code must retain the above copyright
17 * notice, this list of conditions and the following disclaimer;
18 * redistributions in binary form must reproduce the above copyright
19 * notice, this list of conditions and the following disclaimer in the
20 * documentation and/or other materials provided with the distribution;
21 * neither the name of the copyright holders nor the names of its
22 * contributors may be used to endorse or promote products derived from
23 * this software without specific prior written permission.
24 *
25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
28 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
29 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
30 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
31 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 */
37
38#ifndef __CPU_TRAFFIC_GEN_BASE_HH__
39#define __CPU_TRAFFIC_GEN_BASE_HH__
40
41#include <memory>
42#include <tuple>
43#include <unordered_map>
44
45#include "base/statistics.hh"
46#include "enums/AddrMap.hh"
47#include "mem/qport.hh"
48#include "sim/clocked_object.hh"
49
50namespace gem5
51{
52
53class BaseGen;
54class StreamGen;
55class System;
56struct BaseTrafficGenParams;
57
68{
69 friend class BaseGen;
70
71 protected: // Params
76 System *const system;
77
82 const bool elasticReq;
83
89
90 private:
95 void recvReqRetry();
96
97 void retryReq();
98
99 bool recvTimingResp(PacketPtr pkt);
100
102 void transition();
103
108 void scheduleUpdate();
109
113 void noProgress();
114
119
122
125
127
128
131 {
132 public:
133
134 TrafficGenPort(const std::string& name, BaseTrafficGen& traffic_gen)
135 : RequestPort(name), trafficGen(traffic_gen)
136 { }
137
138 protected:
139
141
143 { return trafficGen.recvTimingResp(pkt); }
144
146
148
149 Tick recvAtomicSnoop(PacketPtr pkt) { return 0; }
150
151 private:
152
154
155 };
156
161 void update();
162
165
168
171
174
180 {
181 assert(waitingResp.find(pkt->req) == waitingResp.end());
182 assert(pkt->needsResponse());
183
184 waitingResp[pkt->req] = curTick();
185
186 return (maxOutstandingReqs > 0) &&
188 }
189
192
193 protected: // Stats
195 std::unordered_map<RequestPtr,Tick> waitingResp;
196
243
244 public:
245 BaseTrafficGen(const BaseTrafficGenParams &p);
246
248
249 Port &getPort(const std::string &if_name,
250 PortID idx=InvalidPortID) override;
251
252 void init() override;
253
254 DrainState drain() override;
255
256 void serialize(CheckpointOut &cp) const override;
257 void unserialize(CheckpointIn &cp) override;
258
259 public: // Generator factory methods
260 std::shared_ptr<BaseGen> createIdle(Tick duration);
261 std::shared_ptr<BaseGen> createExit(Tick duration);
262
263 std::shared_ptr<BaseGen> createLinear(
264 Tick duration,
265 Addr start_addr, Addr end_addr, Addr blocksize,
266 Tick min_period, Tick max_period,
267 uint8_t read_percent, Addr data_limit);
268
269 std::shared_ptr<BaseGen> createRandom(
270 Tick duration,
271 Addr start_addr, Addr end_addr, Addr blocksize,
272 Tick min_period, Tick max_period,
273 uint8_t read_percent, Addr data_limit);
274
275 std::shared_ptr<BaseGen> createDram(
276 Tick duration,
277 Addr start_addr, Addr end_addr, Addr blocksize,
278 Tick min_period, Tick max_period,
279 uint8_t read_percent, Addr data_limit,
280 unsigned int num_seq_pkts, unsigned int page_size,
281 unsigned int nbr_of_banks, unsigned int nbr_of_banks_util,
282 enums::AddrMap addr_mapping,
283 unsigned int nbr_of_ranks);
284
285 std::shared_ptr<BaseGen> createDramRot(
286 Tick duration,
287 Addr start_addr, Addr end_addr, Addr blocksize,
288 Tick min_period, Tick max_period,
289 uint8_t read_percent, Addr data_limit,
290 unsigned int num_seq_pkts, unsigned int page_size,
291 unsigned int nbr_of_banks, unsigned int nbr_of_banks_util,
292 enums::AddrMap addr_mapping,
293 unsigned int nbr_of_ranks,
294 unsigned int max_seq_count_per_rank);
295
296 std::shared_ptr<BaseGen> createHybrid(
297 Tick duration,
298 Addr start_addr_dram, Addr end_addr_dram, Addr blocksize_dram,
299 Addr start_addr_nvm, Addr end_addr_nvm, Addr blocksize_nvm,
300 Tick min_period, Tick max_period,
301 uint8_t read_percent, Addr data_limit,
302 unsigned int num_seq_pkts_dram, unsigned int page_size_dram,
303 unsigned int nbr_of_banks_dram, unsigned int nbr_of_banks_util_dram,
304 unsigned int num_seq_pkts_nvm, unsigned int buffer_size_nvm,
305 unsigned int nbr_of_banks_nvm, unsigned int nbr_of_banks_util_nvm,
306 enums::AddrMap addr_mapping,
307 unsigned int nbr_of_ranks_dram,
308 unsigned int nbr_of_ranks_nvm,
309 uint8_t nvm_percent);
310
311 std::shared_ptr<BaseGen> createNvm(
312 Tick duration,
313 Addr start_addr, Addr end_addr, Addr blocksize,
314 Tick min_period, Tick max_period,
315 uint8_t read_percent, Addr data_limit,
316 unsigned int num_seq_pkts, unsigned int buffer_size,
317 unsigned int nbr_of_banks, unsigned int nbr_of_banks_util,
318 enums::AddrMap addr_mapping,
319 unsigned int nbr_of_ranks);
320
321 std::shared_ptr<BaseGen> createStrided(
322 Tick duration,
323 Addr start_addr, Addr end_addr, Addr offset,
324 Addr block_size, Addr superblock_size, Addr stride_size,
325 Tick min_period, Tick max_period,
326 uint8_t read_percent, Addr data_limit);
327
328 std::shared_ptr<BaseGen> createTrace(
329 Tick duration,
330 const std::string& trace_file, Addr addr_offset);
331
332 protected:
333 void start();
334
335 virtual std::shared_ptr<BaseGen> nextGenerator() = 0;
336
341
343 std::shared_ptr<BaseGen> activeGenerator;
344
346 std::unique_ptr<StreamGen> streamGenerator;
347};
348
349} // namespace gem5
350
351#endif //__CPU_TRAFFIC_GEN_BASE_HH__
Base class for all generators, with the shared functionality and virtual functions for entering,...
Definition base_gen.hh:65
Request port specialisation for the traffic generator.
Definition base.hh:131
TrafficGenPort(const std::string &name, BaseTrafficGen &traffic_gen)
Definition base.hh:134
void recvTimingSnoopReq(PacketPtr pkt)
Receive a timing snoop request from the peer.
Definition base.hh:145
bool recvTimingResp(PacketPtr pkt)
Receive a timing response from the peer.
Definition base.hh:142
Tick recvAtomicSnoop(PacketPtr pkt)
Default implementations.
Definition base.hh:149
void recvReqRetry()
Called by the peer if sendTimingReq was called on this peer (causing recvTimingReq to be called on th...
Definition base.hh:140
void recvFunctionalSnoop(PacketPtr pkt)
Receive a functional snoop request packet from the peer.
Definition base.hh:147
The traffic generator is a module that generates stimuli for the memory system, based on a collection...
Definition base.hh:68
void update()
Schedules event for next update and generates a new packet or requests a new generatoir depending on ...
Definition base.cc:169
Tick nextPacketTick
Time of the next packet.
Definition base.hh:124
void init() override
init() is called after all C++ SimObjects have been created and all ports are connected.
Definition base.cc:104
std::shared_ptr< BaseGen > createIdle(Tick duration)
Definition base.cc:370
std::shared_ptr< BaseGen > createLinear(Tick duration, Addr start_addr, Addr end_addr, Addr blocksize, Tick min_period, Tick max_period, uint8_t read_percent, Addr data_limit)
Definition base.cc:384
std::shared_ptr< BaseGen > createTrace(Tick duration, const std::string &trace_file, Addr addr_offset)
Definition base.cc:547
std::shared_ptr< BaseGen > createHybrid(Tick duration, Addr start_addr_dram, Addr end_addr_dram, Addr blocksize_dram, Addr start_addr_nvm, Addr end_addr_nvm, Addr blocksize_nvm, Tick min_period, Tick max_period, uint8_t read_percent, Addr data_limit, unsigned int num_seq_pkts_dram, unsigned int page_size_dram, unsigned int nbr_of_banks_dram, unsigned int nbr_of_banks_util_dram, unsigned int num_seq_pkts_nvm, unsigned int buffer_size_nvm, unsigned int nbr_of_banks_nvm, unsigned int nbr_of_banks_util_nvm, enums::AddrMap addr_mapping, unsigned int nbr_of_ranks_dram, unsigned int nbr_of_ranks_nvm, uint8_t nvm_percent)
Definition base.cc:463
DrainState drain() override
Draining is the process of clearing out the states of SimObjects.These are the SimObjects that are pa...
Definition base.cc:113
const bool elasticReq
Determine whether to add elasticity in the request injection, thus responding to backpressure by slow...
Definition base.hh:82
std::unordered_map< RequestPtr, Tick > waitingResp
Reqs waiting for response.
Definition base.hh:195
std::shared_ptr< BaseGen > createStrided(Tick duration, Addr start_addr, Addr end_addr, Addr offset, Addr block_size, Addr superblock_size, Addr stride_size, Tick min_period, Tick max_period, uint8_t read_percent, Addr data_limit)
Definition base.cc:530
void scheduleUpdate()
Schedule the update event based on nextPacketTick and nextTransitionTick.
Definition base.cc:258
std::shared_ptr< BaseGen > createDramRot(Tick duration, Addr start_addr, Addr end_addr, Addr blocksize, Tick min_period, Tick max_period, uint8_t read_percent, Addr data_limit, unsigned int num_seq_pkts, unsigned int page_size, unsigned int nbr_of_banks, unsigned int nbr_of_banks_util, enums::AddrMap addr_mapping, unsigned int nbr_of_ranks, unsigned int max_seq_count_per_rank)
Definition base.cc:436
void transition()
Transition to the next generator.
Definition base.cc:230
virtual std::shared_ptr< BaseGen > nextGenerator()=0
bool blockedWaitingResp
Set when we blocked waiting for outstanding reqs.
Definition base.hh:173
Tick retryPktTick
Tick when the stalled packet was meant to be sent.
Definition base.hh:170
void recvReqRetry()
Receive a retry from the neighbouring port and attempt to resend the waiting packet.
Definition base.cc:289
gem5::BaseTrafficGen::StatGroup stats
System *const system
The system used to determine which mode we are currently operating in.
Definition base.hh:76
std::shared_ptr< BaseGen > activeGenerator
Currently active generator.
Definition base.hh:343
BaseTrafficGen(const BaseTrafficGenParams &p)
Definition base.cc:70
Tick nextTransitionTick
Time of next transition.
Definition base.hh:121
TrafficGenPort port
The instance of request port used by the traffic generator.
Definition base.hh:164
const Tick progressCheck
Time to tolerate waiting for retries (not making progress), until we declare things broken.
Definition base.hh:88
bool recvTimingResp(PacketPtr pkt)
Definition base.cc:559
std::shared_ptr< BaseGen > createExit(Tick duration)
Definition base.cc:377
std::shared_ptr< BaseGen > createNvm(Tick duration, Addr start_addr, Addr end_addr, Addr blocksize, Tick min_period, Tick max_period, uint8_t read_percent, Addr data_limit, unsigned int num_seq_pkts, unsigned int buffer_size, unsigned int nbr_of_banks, unsigned int nbr_of_banks_util, enums::AddrMap addr_mapping, unsigned int nbr_of_ranks)
Definition base.cc:506
EventFunctionWrapper noProgressEvent
Event to keep track of our progress, or lack thereof.
Definition base.hh:118
const RequestorID requestorId
RequestorID used in generated requests.
Definition base.hh:340
EventFunctionWrapper updateEvent
Event for scheduling updates.
Definition base.hh:191
void noProgress()
Method to inform the user we have made no progress.
Definition base.cc:329
std::shared_ptr< BaseGen > createDram(Tick duration, Addr start_addr, Addr end_addr, Addr blocksize, Tick min_period, Tick max_period, uint8_t read_percent, Addr data_limit, unsigned int num_seq_pkts, unsigned int page_size, unsigned int nbr_of_banks, unsigned int nbr_of_banks_util, enums::AddrMap addr_mapping, unsigned int nbr_of_ranks)
Definition base.cc:412
const int maxOutstandingReqs
Definition base.hh:126
PacketPtr retryPkt
Packet waiting to be sent.
Definition base.hh:167
bool allocateWaitingRespSlot(PacketPtr pkt)
Puts this packet in the waitingResp list and returns true if we are above the maximum number of ousta...
Definition base.hh:179
void serialize(CheckpointOut &cp) const override
Serialize an object.
Definition base.cc:132
Port & getPort(const std::string &if_name, PortID idx=InvalidPortID) override
Get a port with a given name and index.
Definition base.cc:94
void unserialize(CheckpointIn &cp) override
Unserialize an object.
Definition base.cc:152
std::shared_ptr< BaseGen > createRandom(Tick duration, Addr start_addr, Addr end_addr, Addr blocksize, Tick min_period, Tick max_period, uint8_t read_percent, Addr data_limit)
Definition base.cc:398
std::unique_ptr< StreamGen > streamGenerator
Stream/SubstreamID Generator.
Definition base.hh:346
The ClockedObject class extends the SimObject with a clock and accessor functions to relate ticks to ...
A Packet is used to encapsulate a transfer between two objects in the memory system (e....
Definition packet.hh:295
bool needsResponse() const
Definition packet.hh:608
RequestPtr req
A pointer to the original request.
Definition packet.hh:377
Ports are used to interface objects to each other.
Definition port.hh:62
const std::string name() const
Return port name (for DPRINTF).
Definition port.hh:111
A RequestPort is a specialisation of a Port, which implements the default protocol for the three diff...
Definition port.hh:136
A formula for statistics that is calculated when printed.
Statistics container.
Definition group.hh:93
This is a simple scalar statistic, like a counter.
ClockedObject declaration and implementation.
DrainState
Object drain/handover states.
Definition drain.hh:75
Bitfield< 23, 0 > offset
Definition types.hh:144
Bitfield< 0 > p
Copyright (c) 2024 - Pranith Kumar Copyright (c) 2020 Inria All rights reserved.
Definition binary32.hh:36
const PortID InvalidPortID
Definition types.hh:246
Tick curTick()
The universal simulation clock.
Definition cur_tick.hh:46
std::ostream CheckpointOut
Definition serialize.hh:66
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
Definition types.hh:147
int16_t PortID
Port index/ID type, and a symbolic name for an invalid port id.
Definition types.hh:245
uint64_t Tick
Tick count type.
Definition types.hh:58
uint16_t RequestorID
Definition request.hh:95
Declaration of the queued port.
Declaration of Statistics objects.
statistics::Scalar totalReads
Count the number reads.
Definition base.hh:226
statistics::Scalar numRetries
Count the number of retries.
Definition base.hh:208
statistics::Scalar retryTicks
Count the time incurred from back-pressure.
Definition base.hh:211
statistics::Scalar totalReadLatency
Total num of ticks read reqs took to complete
Definition base.hh:220
statistics::Formula writeBW
Write bandwidth in bytes/s
Definition base.hh:241
statistics::Formula avgReadLatency
Avg num of ticks each read req took to complete
Definition base.hh:232
statistics::Scalar bytesWritten
Count the number of bytes written.
Definition base.hh:217
statistics::Formula avgWriteLatency
Avg num of ticks each write reqs took to complete
Definition base.hh:235
statistics::Scalar numSuppressed
Count the number of dropped requests.
Definition base.hh:202
statistics::Formula readBW
Read bandwidth in bytes/s
Definition base.hh:238
statistics::Scalar bytesRead
Count the number of bytes read.
Definition base.hh:214
statistics::Scalar totalWrites
Count the number writes.
Definition base.hh:229
statistics::Scalar totalWriteLatency
Total num of ticks write reqs took to complete
Definition base.hh:223
StatGroup(statistics::Group *parent)
Definition base.cc:335
statistics::Scalar numPackets
Count the number of generated packets.
Definition base.hh:205

Generated on Tue Jun 18 2024 16:24:02 for gem5 by doxygen 1.11.0