hmctest.py revision 11682
111552Sabdul.mutaal@gmail.comimport optparse
211552Sabdul.mutaal@gmail.comimport sys
311552Sabdul.mutaal@gmail.comimport subprocess
411552Sabdul.mutaal@gmail.com
511552Sabdul.mutaal@gmail.comimport m5
611552Sabdul.mutaal@gmail.comfrom m5.objects import *
711552Sabdul.mutaal@gmail.comfrom m5.util import addToPath
811552Sabdul.mutaal@gmail.com
911682Sandreas.hansson@arm.comaddToPath('../')
1011682Sandreas.hansson@arm.com
1111682Sandreas.hansson@arm.comfrom common import MemConfig
1211682Sandreas.hansson@arm.comfrom common import HMC
1311552Sabdul.mutaal@gmail.com
1411552Sabdul.mutaal@gmail.comparser = optparse.OptionParser()
1511552Sabdul.mutaal@gmail.com
1611552Sabdul.mutaal@gmail.com# Use a HMC_2500_x32 by default
1711552Sabdul.mutaal@gmail.comparser.add_option("--mem-type", type = "choice", default = "HMC_2500_x32",
1811552Sabdul.mutaal@gmail.com                  choices = MemConfig.mem_names(),
1911552Sabdul.mutaal@gmail.com                  help = "type of memory to use")
2011552Sabdul.mutaal@gmail.com
2111552Sabdul.mutaal@gmail.comparser.add_option("--ranks", "-r", type = "int", default = 1,
2211552Sabdul.mutaal@gmail.com                  help = "Number of ranks to iterate across")
2311552Sabdul.mutaal@gmail.com
2411552Sabdul.mutaal@gmail.comparser.add_option("--rd_perc", type ="int", default=100,
2511552Sabdul.mutaal@gmail.com                  help = "Percentage of read commands")
2611552Sabdul.mutaal@gmail.com
2711552Sabdul.mutaal@gmail.comparser.add_option("--mode", type ="choice", default ="DRAM",
2811552Sabdul.mutaal@gmail.com                  choices = ["DRAM", "DRAM_ROTATE", "RANDOM"],
2911552Sabdul.mutaal@gmail.com                  help = "DRAM: Random traffic; \
3011552Sabdul.mutaal@gmail.com                          DRAM_ROTATE: Traffic rotating across banks and ranks"
3111552Sabdul.mutaal@gmail.com                          )
3211552Sabdul.mutaal@gmail.com
3311552Sabdul.mutaal@gmail.comparser.add_option("--addr_map", type ="int", default = 1,
3411552Sabdul.mutaal@gmail.com                  help = "0: RoCoRaBaCh; 1: RoRaBaCoCh/RoRaBaChCo")
3511552Sabdul.mutaal@gmail.com
3611552Sabdul.mutaal@gmail.comparser.add_option("--arch", type = "choice", default = "distributed",
3711552Sabdul.mutaal@gmail.com                  choices = ["same", "distributed", "mixed"],
3811552Sabdul.mutaal@gmail.com                  help = "same: HMC-4 links with same range\
3911552Sabdul.mutaal@gmail.com                  distributed: HMC-4 links with distributed range\
4011552Sabdul.mutaal@gmail.com                  mixed: mixed with same & distributed range")
4111552Sabdul.mutaal@gmail.com
4211552Sabdul.mutaal@gmail.comparser.add_option("--linkaggr", type = "int", default = 0,
4311552Sabdul.mutaal@gmail.com                  help = "1: enable link crossbar, 0: disable link crossbar")
4411552Sabdul.mutaal@gmail.com
4511552Sabdul.mutaal@gmail.comparser.add_option("--num_cross", type = "int", default = 4,
4611552Sabdul.mutaal@gmail.com                  help = "1: number of crossbar in HMC=1;\
4711552Sabdul.mutaal@gmail.com                  4: number of crossbar = 4")
4811552Sabdul.mutaal@gmail.com
4911552Sabdul.mutaal@gmail.comparser.add_option("--tlm-memory", type = "string",
5011552Sabdul.mutaal@gmail.com                  help="use external port for SystemC TLM cosimulation")
5111552Sabdul.mutaal@gmail.com
5211552Sabdul.mutaal@gmail.comparser.add_option("--elastic-trace-en", action ="store_true",
5311552Sabdul.mutaal@gmail.com                  help = """Enable capture of data dependency and instruction
5411552Sabdul.mutaal@gmail.com                  fetch traces using elastic trace probe.""")
5511552Sabdul.mutaal@gmail.com
5611552Sabdul.mutaal@gmail.com(options, args) = parser.parse_args()
5711552Sabdul.mutaal@gmail.com
5811552Sabdul.mutaal@gmail.comif args:
5911552Sabdul.mutaal@gmail.com    print "Error: script doesn't take any positional arguments"
6011552Sabdul.mutaal@gmail.com    sys.exit(1)
6111552Sabdul.mutaal@gmail.com
6211552Sabdul.mutaal@gmail.comsystem = System()
6311552Sabdul.mutaal@gmail.comsystem.clk_domain = SrcClockDomain(clock='100GHz',
6411552Sabdul.mutaal@gmail.com                                   voltage_domain=
6511552Sabdul.mutaal@gmail.com                                   VoltageDomain(voltage = '1V'))
6611552Sabdul.mutaal@gmail.com# Create additional crossbar for arch1
6711552Sabdul.mutaal@gmail.comif options.arch == "distributed" or options.arch == "mixed" :
6811552Sabdul.mutaal@gmail.com    system.membus = NoncoherentXBar( width=8 )
6911552Sabdul.mutaal@gmail.com    system.membus.badaddr_responder = BadAddr()
7011552Sabdul.mutaal@gmail.com    system.membus.default = Self.badaddr_responder.pio
7111552Sabdul.mutaal@gmail.com    system.membus.width = 8
7211552Sabdul.mutaal@gmail.com    system.membus.frontend_latency = 3
7311552Sabdul.mutaal@gmail.com    system.membus.forward_latency = 4
7411552Sabdul.mutaal@gmail.com    system.membus.response_latency = 2
7511552Sabdul.mutaal@gmail.com
7611552Sabdul.mutaal@gmail.com    system.membus.clk_domain = SrcClockDomain(clock='100GHz', voltage_domain=
7711552Sabdul.mutaal@gmail.com            VoltageDomain(voltage = '1V'))
7811552Sabdul.mutaal@gmail.com
7911552Sabdul.mutaal@gmail.com# we are considering 4GB HMC device with following parameters
8011552Sabdul.mutaal@gmail.com# hmc_device_size = '4GB'
8111552Sabdul.mutaal@gmail.com# hmc_num_vaults = 16
8211552Sabdul.mutaal@gmail.com# hmc_vault_size = '256MB'
8311552Sabdul.mutaal@gmail.com# hmc_stack_size = 8
8411552Sabdul.mutaal@gmail.com# hmc_bank_in_stack = 2
8511552Sabdul.mutaal@gmail.com# hmc_bank_size = '16MB'
8611552Sabdul.mutaal@gmail.com# hmc_bank_in_vault = 16
8711552Sabdul.mutaal@gmail.com
8811552Sabdul.mutaal@gmail.com# determine the burst length in bytes
8911552Sabdul.mutaal@gmail.comburst_size = 256
9011552Sabdul.mutaal@gmail.comnum_serial_links = 4
9111552Sabdul.mutaal@gmail.comnum_vault_ctrl = 16
9211552Sabdul.mutaal@gmail.comoptions.mem_channels = 1
9311552Sabdul.mutaal@gmail.comoptions.external_memory_system = 0
9411552Sabdul.mutaal@gmail.comoptions.mem_ranks=1
9511552Sabdul.mutaal@gmail.comstride_size = burst_size
9611552Sabdul.mutaal@gmail.comsystem.cache_line_size = burst_size
9711552Sabdul.mutaal@gmail.com
9811552Sabdul.mutaal@gmail.com# Enable performance monitoring
9911552Sabdul.mutaal@gmail.comoptions.enable_global_monitor = True
10011552Sabdul.mutaal@gmail.comoptions.enable_link_monitor = False
10111552Sabdul.mutaal@gmail.com
10211552Sabdul.mutaal@gmail.com# Bytes used for calculations
10311552Sabdul.mutaal@gmail.comoneGBytes = 1024 * 1024 * 1024
10411552Sabdul.mutaal@gmail.comoneMBytes = 1024 * 1024
10511552Sabdul.mutaal@gmail.com
10611552Sabdul.mutaal@gmail.com# Memory ranges of 16 vault controller - Total_HMC_size / 16
10711552Sabdul.mutaal@gmail.commem_range_vault = [ AddrRange(i * 256 * oneMBytes, ((i + 1) * 256 * oneMBytes)
10811552Sabdul.mutaal@gmail.com    - 1)
10911552Sabdul.mutaal@gmail.com        for i in range(num_vault_ctrl)]
11011552Sabdul.mutaal@gmail.com
11111552Sabdul.mutaal@gmail.com# Memmory ranges of serial link for arch-0
11211552Sabdul.mutaal@gmail.com# Same as the ranges of vault controllers - 4 vault - to - 1 serial link
11311552Sabdul.mutaal@gmail.comif options.arch == "same":
11411552Sabdul.mutaal@gmail.com    ser_range  = [ AddrRange(0, (4 * oneGBytes) - 1)
11511552Sabdul.mutaal@gmail.com            for i in range(num_serial_links)]
11611552Sabdul.mutaal@gmail.com    options.ser_ranges = ser_range
11711552Sabdul.mutaal@gmail.com
11811552Sabdul.mutaal@gmail.com# Memmory ranges of serial link for arch-1
11911552Sabdul.mutaal@gmail.com# Distributed range accross links
12011552Sabdul.mutaal@gmail.comif options.arch == "distributed":
12111552Sabdul.mutaal@gmail.com    ser_range  = [ AddrRange(i * oneGBytes, ((i + 1) * oneGBytes) - 1)
12211552Sabdul.mutaal@gmail.com            for i in range(num_serial_links)]
12311552Sabdul.mutaal@gmail.com    options.ser_ranges = ser_range
12411552Sabdul.mutaal@gmail.com
12511552Sabdul.mutaal@gmail.com# Memmory ranges of serial link for arch-2
12611552Sabdul.mutaal@gmail.com# "Mixed" address distribution over links
12711552Sabdul.mutaal@gmail.comif options.arch == "mixed":
12811552Sabdul.mutaal@gmail.com    ser_range0  = AddrRange(0              , (1 * oneGBytes) - 1)
12911552Sabdul.mutaal@gmail.com    ser_range1  = AddrRange(1 * oneGBytes  , (2 * oneGBytes) - 1)
13011552Sabdul.mutaal@gmail.com    ser_range2  = AddrRange(0              , (4 * oneGBytes) - 1)
13111552Sabdul.mutaal@gmail.com    ser_range3  = AddrRange(0              , (4 * oneGBytes) - 1)
13211552Sabdul.mutaal@gmail.com    options.ser_ranges = [ser_range0, ser_range1, ser_range2, ser_range3]
13311552Sabdul.mutaal@gmail.com
13411552Sabdul.mutaal@gmail.com# Assign ranges of vault controller to system ranges
13511552Sabdul.mutaal@gmail.comsystem.mem_ranges = mem_range_vault
13611552Sabdul.mutaal@gmail.com
13711552Sabdul.mutaal@gmail.com# open traffic generator
13811552Sabdul.mutaal@gmail.comcfg_file_name = "./tests/quick/se/70.tgen/traffic.cfg"
13911552Sabdul.mutaal@gmail.comcfg_file = open(cfg_file_name, 'r')
14011552Sabdul.mutaal@gmail.com
14111552Sabdul.mutaal@gmail.com# number of traffic generator
14211552Sabdul.mutaal@gmail.comnp = 4
14311552Sabdul.mutaal@gmail.com# create a traffic generator, and point it to the file we just created
14411552Sabdul.mutaal@gmail.comsystem.tgen = [ TrafficGen(config_file = cfg_file_name) for i in xrange(np)]
14511552Sabdul.mutaal@gmail.com
14611552Sabdul.mutaal@gmail.com# Config memory system with given HMC arch
14711552Sabdul.mutaal@gmail.comMemConfig.config_mem(options, system)
14811552Sabdul.mutaal@gmail.com
14911552Sabdul.mutaal@gmail.comif options.arch == "distributed":
15011552Sabdul.mutaal@gmail.com    for i in xrange(np):
15111552Sabdul.mutaal@gmail.com        system.tgen[i].port = system.membus.slave
15211552Sabdul.mutaal@gmail.com    # connect the system port even if it is not used in this example
15311552Sabdul.mutaal@gmail.com    system.system_port = system.membus.slave
15411552Sabdul.mutaal@gmail.com
15511552Sabdul.mutaal@gmail.comif options.arch == "mixed":
15611552Sabdul.mutaal@gmail.com    for i in xrange(int(np/2)):
15711552Sabdul.mutaal@gmail.com        system.tgen[i].port = system.membus.slave
15811552Sabdul.mutaal@gmail.com    # connect the system port even if it is not used in this example
15911552Sabdul.mutaal@gmail.com    system.system_port = system.membus.slave
16011552Sabdul.mutaal@gmail.com
16111552Sabdul.mutaal@gmail.com
16211552Sabdul.mutaal@gmail.com# run Forrest, run!
16311552Sabdul.mutaal@gmail.comroot = Root(full_system = False, system = system)
16411552Sabdul.mutaal@gmail.comroot.system.mem_mode = 'timing'
16511552Sabdul.mutaal@gmail.com
16611552Sabdul.mutaal@gmail.comm5.instantiate()
16711552Sabdul.mutaal@gmail.comm5.simulate(10000000000)
16811552Sabdul.mutaal@gmail.com
16911552Sabdul.mutaal@gmail.comm5.stats.dump()
17011552Sabdul.mutaal@gmail.com
17111552Sabdul.mutaal@gmail.comprint "Done!"
172