113774Sandreas.sandberg@arm.com 212564Sgabeblack@google.comfrom __future__ import print_function 313774Sandreas.sandberg@arm.comfrom __future__ import absolute_import 412564Sgabeblack@google.com 511552Sabdul.mutaal@gmail.comimport sys 612340Szulian@eit.uni-kl.deimport argparse 711552Sabdul.mutaal@gmail.comimport subprocess 812340Szulian@eit.uni-kl.defrom pprint import pprint 911552Sabdul.mutaal@gmail.com 1011552Sabdul.mutaal@gmail.comimport m5 1111552Sabdul.mutaal@gmail.comfrom m5.objects import * 1212340Szulian@eit.uni-kl.defrom m5.util import * 1311552Sabdul.mutaal@gmail.com 1411682Sandreas.hansson@arm.comaddToPath('../') 1511682Sandreas.hansson@arm.com 1611682Sandreas.hansson@arm.comfrom common import MemConfig 1711682Sandreas.hansson@arm.comfrom common import HMC 1811552Sabdul.mutaal@gmail.com 1911552Sabdul.mutaal@gmail.com 2012340Szulian@eit.uni-kl.dedef add_options(parser): 2112340Szulian@eit.uni-kl.de parser.add_argument("--external-memory-system", default=0, action="store", 2212340Szulian@eit.uni-kl.de type=int, help="External memory system") 2312340Szulian@eit.uni-kl.de # TLM related options, currently optional in configs/common/MemConfig.py 2412340Szulian@eit.uni-kl.de parser.add_argument("--tlm-memory", action="store_true", help="use\ 2512340Szulian@eit.uni-kl.de external port for SystemC TLM co-simulation. Default:\ 2612340Szulian@eit.uni-kl.de no") 2712340Szulian@eit.uni-kl.de # Elastic traces related options, currently optional in 2812340Szulian@eit.uni-kl.de # configs/common/MemConfig.py 2912340Szulian@eit.uni-kl.de parser.add_argument("--elastic-trace-en", action="store_true", 3012340Szulian@eit.uni-kl.de help="enable capture of data dependency and\ 3112340Szulian@eit.uni-kl.de instruction fetch traces using elastic trace\ 3212340Szulian@eit.uni-kl.de probe.\nDefault: no") 3312340Szulian@eit.uni-kl.de # Options related to traffic generation 3412340Szulian@eit.uni-kl.de parser.add_argument("--num-tgen", default=4, action="store", type=int, 3512340Szulian@eit.uni-kl.de choices=[4], help="number of traffic generators.\ 3612340Szulian@eit.uni-kl.de Right now this script supports only 4.\nDefault: 4") 3712340Szulian@eit.uni-kl.de parser.add_argument("--tgen-cfg-file", 3812340Szulian@eit.uni-kl.de default="./configs/example/hmc_tgen.cfg", 3912340Szulian@eit.uni-kl.de type=str, help="Traffic generator(s) configuration\ 4012340Szulian@eit.uni-kl.de file. Note: this script uses the same configuration\ 4112340Szulian@eit.uni-kl.de file for all traffic generators") 4211552Sabdul.mutaal@gmail.com 4311552Sabdul.mutaal@gmail.com 4412340Szulian@eit.uni-kl.de# considering 4GB HMC device with following parameters 4511552Sabdul.mutaal@gmail.com# hmc_device_size = '4GB' 4611552Sabdul.mutaal@gmail.com# hmc_vault_size = '256MB' 4711552Sabdul.mutaal@gmail.com# hmc_stack_size = 8 4811552Sabdul.mutaal@gmail.com# hmc_bank_in_stack = 2 4911552Sabdul.mutaal@gmail.com# hmc_bank_size = '16MB' 5011552Sabdul.mutaal@gmail.com# hmc_bank_in_vault = 16 5112340Szulian@eit.uni-kl.dedef build_system(options): 5212340Szulian@eit.uni-kl.de # create the system we are going to simulate 5312340Szulian@eit.uni-kl.de system = System() 5412340Szulian@eit.uni-kl.de # use timing mode for the interaction between master-slave ports 5512340Szulian@eit.uni-kl.de system.mem_mode = 'timing' 5612340Szulian@eit.uni-kl.de # set the clock fequency of the system 5712340Szulian@eit.uni-kl.de clk = '100GHz' 5812340Szulian@eit.uni-kl.de vd = VoltageDomain(voltage='1V') 5912340Szulian@eit.uni-kl.de system.clk_domain = SrcClockDomain(clock=clk, voltage_domain=vd) 6012340Szulian@eit.uni-kl.de # add traffic generators to the system 6112340Szulian@eit.uni-kl.de system.tgen = [TrafficGen(config_file=options.tgen_cfg_file) for i in 6213731Sandreas.sandberg@arm.com range(options.num_tgen)] 6312340Szulian@eit.uni-kl.de # Config memory system with given HMC arch 6412340Szulian@eit.uni-kl.de MemConfig.config_mem(options, system) 6512340Szulian@eit.uni-kl.de # Connect the traffic generatiors 6612340Szulian@eit.uni-kl.de if options.arch == "distributed": 6713731Sandreas.sandberg@arm.com for i in range(options.num_tgen): 6812340Szulian@eit.uni-kl.de system.tgen[i].port = system.membus.slave 6912340Szulian@eit.uni-kl.de # connect the system port even if it is not used in this example 7012340Szulian@eit.uni-kl.de system.system_port = system.membus.slave 7112340Szulian@eit.uni-kl.de if options.arch == "mixed": 7213731Sandreas.sandberg@arm.com for i in range(int(options.num_tgen/2)): 7312340Szulian@eit.uni-kl.de system.tgen[i].port = system.membus.slave 7412340Szulian@eit.uni-kl.de hh = system.hmc_host 7512340Szulian@eit.uni-kl.de if options.enable_global_monitor: 7612340Szulian@eit.uni-kl.de system.tgen[2].port = hh.lmonitor[2].slave 7712340Szulian@eit.uni-kl.de hh.lmonitor[2].master = hh.seriallink[2].slave 7812340Szulian@eit.uni-kl.de system.tgen[3].port = hh.lmonitor[3].slave 7912340Szulian@eit.uni-kl.de hh.lmonitor[3].master = hh.seriallink[3].slave 8012340Szulian@eit.uni-kl.de else: 8112340Szulian@eit.uni-kl.de system.tgen[2].port = hh.seriallink[2].slave 8212340Szulian@eit.uni-kl.de system.tgen[3].port = hh.seriallink[3].slave 8312340Szulian@eit.uni-kl.de # connect the system port even if it is not used in this example 8412340Szulian@eit.uni-kl.de system.system_port = system.membus.slave 8512340Szulian@eit.uni-kl.de if options.arch == "same": 8612340Szulian@eit.uni-kl.de hh = system.hmc_host 8713731Sandreas.sandberg@arm.com for i in range(options.num_links_controllers): 8812340Szulian@eit.uni-kl.de if options.enable_global_monitor: 8912340Szulian@eit.uni-kl.de system.tgen[i].port = hh.lmonitor[i].slave 9012340Szulian@eit.uni-kl.de else: 9112340Szulian@eit.uni-kl.de system.tgen[i].port = hh.seriallink[i].slave 9212340Szulian@eit.uni-kl.de # set up the root SimObject 9312340Szulian@eit.uni-kl.de root = Root(full_system=False, system=system) 9412340Szulian@eit.uni-kl.de return root 9511552Sabdul.mutaal@gmail.com 9611552Sabdul.mutaal@gmail.com 9712340Szulian@eit.uni-kl.dedef main(): 9812340Szulian@eit.uni-kl.de parser = argparse.ArgumentParser(description="Simple system using HMC as\ 9912340Szulian@eit.uni-kl.de main memory") 10012340Szulian@eit.uni-kl.de HMC.add_options(parser) 10112340Szulian@eit.uni-kl.de add_options(parser) 10212340Szulian@eit.uni-kl.de options = parser.parse_args() 10312340Szulian@eit.uni-kl.de # build the system 10412340Szulian@eit.uni-kl.de root = build_system(options) 10512340Szulian@eit.uni-kl.de # instantiate all of the objects we've created so far 10612340Szulian@eit.uni-kl.de m5.instantiate() 10712564Sgabeblack@google.com print("Beginning simulation!") 10812340Szulian@eit.uni-kl.de event = m5.simulate(10000000000) 10912340Szulian@eit.uni-kl.de m5.stats.dump() 11012564Sgabeblack@google.com print('Exiting @ tick %i because %s (exit code is %i)' % (m5.curTick(), 11112340Szulian@eit.uni-kl.de event.getCause(), 11212564Sgabeblack@google.com event.getCode())) 11312564Sgabeblack@google.com print("Done") 11411552Sabdul.mutaal@gmail.com 11511552Sabdul.mutaal@gmail.com 11612340Szulian@eit.uni-kl.deif __name__ == "__m5_main__": 11712340Szulian@eit.uni-kl.de main() 118