diff options
author | Wendy Elsasser <wendy.elsasser@arm.com> | 2014-09-20 17:17:55 -0400 |
---|---|---|
committer | Wendy Elsasser <wendy.elsasser@arm.com> | 2014-09-20 17:17:55 -0400 |
commit | a384525355c37f8776e03c78e12279c38c5c3097 (patch) | |
tree | 748dec1bacd7bb72d62198f8f23e728251c92b47 /configs/dram | |
parent | 3f7a9348dd365edcfe58b8ecdf293b17a7d779ce (diff) | |
download | gem5-a384525355c37f8776e03c78e12279c38c5c3097.tar.xz |
cpu: Update DRAM traffic gen
Add new DRAM_ROTATE mode to traffic generator.
This mode will generate DRAM traffic that rotates across
banks per rank, command types, and ranks per channel
The looping order is illustrated below:
for (ranks per channel)
for (command types)
for (banks per rank)
// Generate DRAM Command Series
This patch also adds the read percentage as an input argument to the
DRAM sweep script. If the simulated read percentage is 0 or 100, the
middle for loop does not generate additional commands. This loop is
used only when the read percentage is set to 50, in which case the
middle loop will toggle between read and write commands.
Modified sweep.py script, which generates DRAM traffic.
Added input arguments and support for new DRAM_ROTATE mode.
The script now has input arguments for:
1) Read percentage
2) Number of ranks
3) Address mapping
4) Traffic generator mode (DRAM or DRAM_ROTATE)
The default values are:
100% reads, 1 rank, RoRaBaCoCh address mapping, and DRAM traffic gen mode
For the DRAM traffic mode, added multi-rank support.
Diffstat (limited to 'configs/dram')
-rw-r--r-- | configs/dram/sweep.py | 37 |
1 files changed, 31 insertions, 6 deletions
diff --git a/configs/dram/sweep.py b/configs/dram/sweep.py index 9b7cfd35e..631d82e07 100644 --- a/configs/dram/sweep.py +++ b/configs/dram/sweep.py @@ -58,6 +58,20 @@ parser.add_option("--mem-type", type="choice", default="ddr3_1600_x64", choices=MemConfig.mem_names(), help = "type of memory to use") +parser.add_option("--ranks", "-r", type="int", default=1, + help = "Number of ranks to iterate across") + +parser.add_option("--rd_perc", type="int", default=100, + help = "Percentage of read commands") + +parser.add_option("--mode", type="choice", default="DRAM", + choices=["DRAM", "DRAM_ROTATE"], + help = "DRAM: Random traffic; \ + DRAM_ROTATE: Traffic rotating across banks and ranks") + +parser.add_option("--addr_map", type="int", default=1, + help = "0: RoCoRaBaCh; 1: RoRaBaCoCh/RoRaBaChCo") + (options, args) = parser.parse_args() if args: @@ -89,8 +103,17 @@ MemConfig.config_mem(options, system) if not isinstance(system.mem_ctrls[0], m5.objects.DRAMCtrl): fatal("This script assumes the memory is a DRAMCtrl subclass") -# for now the generator assumes a single rank -system.mem_ctrls[0].ranks_per_channel = 1 +# Set number of ranks based on input argument; default is 1 rank +system.mem_ctrls[0].ranks_per_channel = options.ranks + +# Set the address mapping based on input argument +# Default to RoRaBaCoCh +if options.addr_map == 0: + system.mem_ctrls[0].addr_mapping = "RoCoRaBaCh" +elif options.addr_map == 1: + system.mem_ctrls[0].addr_mapping = "RoRaBaCoCh" +else: + fatal("Did not specify a valid address map argument") # stay in each state for 0.25 ms, long enough to warm things up, and # short enough to avoid hitting a refresh @@ -134,10 +157,12 @@ max_stride = min(512, page_size) nxt_state = 0 for bank in range(1, nbr_banks + 1): for stride_size in range(burst_size, max_stride + 1, burst_size): - cfg_file.write("STATE %d %d DRAM 100 0 %d " - "%d %d %d %d %d %d %d %d 1\n" % - (nxt_state, period, max_addr, burst_size, itt, itt, 0, - stride_size, page_size, nbr_banks, bank)) + cfg_file.write("STATE %d %d %s %d 0 %d %d " + "%d %d %d %d %d %d %d %d %d\n" % + (nxt_state, period, options.mode, options.rd_perc, + max_addr, burst_size, itt, itt, 0, stride_size, + page_size, nbr_banks, bank, options.addr_map, + options.ranks)) nxt_state = nxt_state + 1 cfg_file.write("INIT 0\n") |