gem5 [DEVELOP-FOR-25.0]
Loading...
Searching...
No Matches
dram_rot_gen.cc
Go to the documentation of this file.
1/*
2 * Copyright (c) 2012-2013, 2016-2017, 2019 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 here under. 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
39
40#include <algorithm>
41
42#include "base/trace.hh"
43#include "debug/TrafficGen.hh"
44#include "enums/AddrMap.hh"
45
46namespace gem5
47{
48
51{
52 // if this is the first of the packets in series to be generated,
53 // start counting again
54 if (countNumSeqPkts == 0) {
56
57 // choose if we generate a read or a write here
58 if (readPercent == 50) {
59 if ((nextSeqCount % nbrOfBanksUtil) == 0) {
60 // Change type after all banks have been rotated
61 // Otherwise, keep current value
62 isRead = !isRead;
63 }
64 } else {
65 // Set randomly based on percentage
66 isRead = readPercent != 0;
67 }
68
69 assert((readPercent == 0 && !isRead) ||
70 (readPercent == 100 && isRead) ||
71 readPercent != 100);
72
73 // Overwrite random bank value
74 // Rotate across banks
75 unsigned int new_bank = nextSeqCount % nbrOfBanksUtil;
76
77 // Overwrite random rank value
78 // Will rotate to the next rank after rotating through all banks,
79 // for each specified command type.
80
81 // Use modular function to ensure that calculated rank is within
82 // system limits after state transition
83 unsigned int new_rank = (nextSeqCount / maxSeqCountPerRank) %
85
86 // Increment nextSeqCount
87 // Roll back to 0 after completing a full rotation across
88 // banks, command type, and ranks
91
92 DPRINTF(TrafficGen, "DramRotGen::getNextPacket nextSeqCount: %d "
93 "new_rank: %d new_bank: %d\n",
94 nextSeqCount, new_rank, new_bank);
95
96 // Generate the start address of the command series
97 // routine will update addr variable with bank, rank, and col
98 // bits updated for rotation scheme
99 genStartAddr(new_bank, new_rank);
100
101 } else {
102 // increment the column by one
103 if (addrMapping == enums::RoRaBaCoCh ||
104 addrMapping == enums::RoRaBaChCo)
105 // Simply increment addr by blocksize to
106 // increment the column by one
107 addr += blocksize;
108
109 else if (addrMapping == enums::RoCoRaBaCh) {
110 // Explicity increment the column bits
111
112 unsigned int new_col = ((addr / blocksize /
114 (pageSize / blocksize)) + 1;
116 blockBits + bankBits + rankBits, new_col);
117 }
118 }
119
120 DPRINTF(TrafficGen, "DramRotGen::getNextPacket: %c to addr %#x, "
121 "size %d, countNumSeqPkts: %d, numSeqPkts: %d\n",
123
124 // create a new request packet
127
128 // add the amount of data manipulated to the total
130
131 // subtract the number of packets remained to be generated
133
134 // return the generated packet
135 return pkt;
136}
137
138} // namespace gem5
#define DPRINTF(x,...)
Definition trace.hh:209
PacketPtr getPacket(Addr addr, unsigned size, const MemCmd &cmd, Request::FlagsType flags=0)
Generate a new request and associated packet.
Definition base_gen.cc:55
bool isRead
Remember type of requests to be generated in series.
Definition dram_gen.hh:121
const unsigned int nbrOfBanksUtil
Number of banks to be utilized for a given configuration.
Definition dram_gen.hh:139
const unsigned int nbrOfBanksDRAM
Number of banks in DRAM.
Definition dram_gen.hh:136
const unsigned int blockBits
Number of block bits in DRAM address.
Definition dram_gen.hh:133
Addr addr
Address of request.
Definition dram_gen.hh:118
unsigned int countNumSeqPkts
Track number of sequential packets generated for a request.
Definition dram_gen.hh:115
const unsigned int nbrOfRanks
Number of ranks to be utilized for a given configuration.
Definition dram_gen.hh:148
const unsigned int rankBits
Number of rank bits in DRAM address.
Definition dram_gen.hh:145
void genStartAddr(unsigned int new_bank, unsigned int new_rank)
Insert bank, rank, and column bits into packed address to create address for 1st command in a series.
Definition dram_gen.cc:145
const unsigned int numSeqPkts
Number of sequential DRAM packets to be generated per cpu request.
Definition dram_gen.hh:112
enums::AddrMap addrMapping
Address mapping to be used.
Definition dram_gen.hh:142
const unsigned int pageBits
Number of page bits in DRAM address.
Definition dram_gen.hh:127
const unsigned int pageSize
Page size of DRAM.
Definition dram_gen.hh:124
const unsigned int bankBits
Number of bank bits in DRAM address.
Definition dram_gen.hh:130
unsigned int nextSeqCount
Next packet series count used to set rank and bank, and update isRead Incremented at the start of a n...
PacketPtr getNextPacket()
Get the next generated packet.
const unsigned int maxSeqCountPerRank
Number of command series issued before the rank is changed.
Addr dataManipulated
Counter to determine the amount of data manipulated.
const Addr blocksize
Blocksize and address increment.
Definition base_gen.hh:160
const uint8_t readPercent
Percent of generated transactions that should be reads.
Definition base_gen.hh:172
The traffic generator is a module that generates stimuli for the memory system, based on a collection...
Declaration of DRAM rotation generator that rotates through each rank.
constexpr void replaceBits(T &val, unsigned first, unsigned last, B bit_val)
A convenience function to replace bits first to last of val with bit_val in place.
Definition bitfield.hh:216
Copyright (c) 2024 Arm Limited All rights reserved.
Definition binary32.hh:36
Packet * PacketPtr

Generated on Mon May 26 2025 09:19:09 for gem5 by doxygen 1.13.2