| 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() |