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