blob: eca3c284656749f1a5c04144499523ee4864be3f [file] [log] [blame] [edit]
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 requestor-responder ports
system.mem_mode = "timing"
# set the clock frequency 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.cpu_side_ports
# connect the system port even if it is not used in this example
system.system_port = system.membus.cpu_side_ports
if options.arch == "mixed":
for i in range(int(options.num_tgen / 2)):
system.tgen[i].port = system.membus.cpu_side_ports
hh = system.hmc_host
if options.enable_global_monitor:
system.tgen[2].port = hh.lmonitor[2].cpu_side_port
hh.lmonitor[2].mem_side_port = hh.seriallink[2].cpu_side_port
system.tgen[3].port = hh.lmonitor[3].cpu_side_port
hh.lmonitor[3].mem_side_port = hh.seriallink[3].cpu_side_port
else:
system.tgen[2].port = hh.seriallink[2].cpu_side_port
system.tgen[3].port = hh.seriallink[3].cpu_side_port
# connect the system port even if it is not used in this example
system.system_port = system.membus.cpu_side_ports
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].cpu_side_port
else:
system.tgen[i].port = hh.seriallink[i].cpu_side_port
# 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()