Python 2.7 used to return lists for operations such as map and range, this has changed in Python 3. To make the configs Python 3 compliant, add explicit conversions from iterators to lists where needed, replace xrange with range, and fix changes to exec syntax. This change doesn't fix import paths since that might require us to restructure the configs slightly. Change-Id: Idcea8482b286779fc98b4e144ca8f54069c08024 Signed-off-by: Andreas Sandberg <andreas.sandberg@arm.com> Reviewed-on: https://gem5-review.googlesource.com/c/16002 Reviewed-by: Gabe Black <gabeblack@google.com>
116 lines
4.4 KiB
Python
116 lines
4.4 KiB
Python
from __future__ import print_function
|
|
|
|
import sys
|
|
import argparse
|
|
import subprocess
|
|
from pprint import pprint
|
|
|
|
import m5
|
|
from m5.objects import *
|
|
from m5.util import *
|
|
|
|
addToPath('../')
|
|
|
|
from common import MemConfig
|
|
from common import HMC
|
|
|
|
|
|
def add_options(parser):
|
|
parser.add_argument("--external-memory-system", default=0, action="store",
|
|
type=int, help="External memory system")
|
|
# TLM related options, currently optional in configs/common/MemConfig.py
|
|
parser.add_argument("--tlm-memory", action="store_true", help="use\
|
|
external port for SystemC TLM co-simulation. Default:\
|
|
no")
|
|
# Elastic traces related options, currently optional in
|
|
# configs/common/MemConfig.py
|
|
parser.add_argument("--elastic-trace-en", action="store_true",
|
|
help="enable capture of data dependency and\
|
|
instruction fetch traces using elastic trace\
|
|
probe.\nDefault: no")
|
|
# Options related to traffic generation
|
|
parser.add_argument("--num-tgen", default=4, action="store", type=int,
|
|
choices=[4], help="number of traffic generators.\
|
|
Right now this script supports only 4.\nDefault: 4")
|
|
parser.add_argument("--tgen-cfg-file",
|
|
default="./configs/example/hmc_tgen.cfg",
|
|
type=str, help="Traffic generator(s) configuration\
|
|
file. Note: this script uses the same configuration\
|
|
file for all traffic generators")
|
|
|
|
|
|
# considering 4GB HMC device with following parameters
|
|
# hmc_device_size = '4GB'
|
|
# hmc_vault_size = '256MB'
|
|
# hmc_stack_size = 8
|
|
# hmc_bank_in_stack = 2
|
|
# hmc_bank_size = '16MB'
|
|
# hmc_bank_in_vault = 16
|
|
def build_system(options):
|
|
# create the system we are going to simulate
|
|
system = System()
|
|
# use timing mode for the interaction between master-slave ports
|
|
system.mem_mode = 'timing'
|
|
# set the clock fequency of the system
|
|
clk = '100GHz'
|
|
vd = VoltageDomain(voltage='1V')
|
|
system.clk_domain = SrcClockDomain(clock=clk, voltage_domain=vd)
|
|
# add traffic generators to the system
|
|
system.tgen = [TrafficGen(config_file=options.tgen_cfg_file) for i in
|
|
range(options.num_tgen)]
|
|
# Config memory system with given HMC arch
|
|
MemConfig.config_mem(options, system)
|
|
# Connect the traffic generatiors
|
|
if options.arch == "distributed":
|
|
for i in range(options.num_tgen):
|
|
system.tgen[i].port = system.membus.slave
|
|
# connect the system port even if it is not used in this example
|
|
system.system_port = system.membus.slave
|
|
if options.arch == "mixed":
|
|
for i in range(int(options.num_tgen/2)):
|
|
system.tgen[i].port = system.membus.slave
|
|
hh = system.hmc_host
|
|
if options.enable_global_monitor:
|
|
system.tgen[2].port = hh.lmonitor[2].slave
|
|
hh.lmonitor[2].master = hh.seriallink[2].slave
|
|
system.tgen[3].port = hh.lmonitor[3].slave
|
|
hh.lmonitor[3].master = hh.seriallink[3].slave
|
|
else:
|
|
system.tgen[2].port = hh.seriallink[2].slave
|
|
system.tgen[3].port = hh.seriallink[3].slave
|
|
# connect the system port even if it is not used in this example
|
|
system.system_port = system.membus.slave
|
|
if options.arch == "same":
|
|
hh = system.hmc_host
|
|
for i in range(options.num_links_controllers):
|
|
if options.enable_global_monitor:
|
|
system.tgen[i].port = hh.lmonitor[i].slave
|
|
else:
|
|
system.tgen[i].port = hh.seriallink[i].slave
|
|
# set up the root SimObject
|
|
root = Root(full_system=False, system=system)
|
|
return root
|
|
|
|
|
|
def main():
|
|
parser = argparse.ArgumentParser(description="Simple system using HMC as\
|
|
main memory")
|
|
HMC.add_options(parser)
|
|
add_options(parser)
|
|
options = parser.parse_args()
|
|
# build the system
|
|
root = build_system(options)
|
|
# instantiate all of the objects we've created so far
|
|
m5.instantiate()
|
|
print("Beginning simulation!")
|
|
event = m5.simulate(10000000000)
|
|
m5.stats.dump()
|
|
print('Exiting @ tick %i because %s (exit code is %i)' % (m5.curTick(),
|
|
event.getCause(),
|
|
event.getCode()))
|
|
print("Done")
|
|
|
|
|
|
if __name__ == "__m5_main__":
|
|
main()
|