113680Syazakram@ucdavis.edu# -*- coding: utf-8 -*-
213680Syazakram@ucdavis.edu# Copyright (c) 2018 The Regents of the University of California
313680Syazakram@ucdavis.edu# All Rights Reserved.
413680Syazakram@ucdavis.edu#
513680Syazakram@ucdavis.edu# Redistribution and use in source and binary forms, with or without
613680Syazakram@ucdavis.edu# modification, are permitted provided that the following conditions are
713680Syazakram@ucdavis.edu# met: redistributions of source code must retain the above copyright
813680Syazakram@ucdavis.edu# notice, this list of conditions and the following disclaimer;
913680Syazakram@ucdavis.edu# redistributions in binary form must reproduce the above copyright
1013680Syazakram@ucdavis.edu# notice, this list of conditions and the following disclaimer in the
1113680Syazakram@ucdavis.edu# documentation and/or other materials provided with the distribution;
1213680Syazakram@ucdavis.edu# neither the name of the copyright holders nor the names of its
1313680Syazakram@ucdavis.edu# contributors may be used to endorse or promote products derived from
1413680Syazakram@ucdavis.edu# this software without specific prior written permission.
1513680Syazakram@ucdavis.edu#
1613680Syazakram@ucdavis.edu# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1713680Syazakram@ucdavis.edu# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1813680Syazakram@ucdavis.edu# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1913680Syazakram@ucdavis.edu# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2013680Syazakram@ucdavis.edu# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2113680Syazakram@ucdavis.edu# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2213680Syazakram@ucdavis.edu# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2313680Syazakram@ucdavis.edu# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2413680Syazakram@ucdavis.edu# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2513680Syazakram@ucdavis.edu# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2613680Syazakram@ucdavis.edu# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2713680Syazakram@ucdavis.edu#
2813680Syazakram@ucdavis.edu# Authors: Jason Lowe-Power
2913680Syazakram@ucdavis.edu
3013680Syazakram@ucdavis.eduimport os
3113680Syazakram@ucdavis.eduimport argparse
3213680Syazakram@ucdavis.edu
3313680Syazakram@ucdavis.eduimport m5
3413680Syazakram@ucdavis.edufrom m5.objects import *
3513680Syazakram@ucdavis.edu
3613680Syazakram@ucdavis.educlass L1Cache(Cache):
3713680Syazakram@ucdavis.edu    """Simple L1 Cache with default values"""
3813680Syazakram@ucdavis.edu
3913680Syazakram@ucdavis.edu    assoc = 8
4013680Syazakram@ucdavis.edu    tag_latency = 1
4113680Syazakram@ucdavis.edu    data_latency = 1
4213680Syazakram@ucdavis.edu    response_latency = 1
4313680Syazakram@ucdavis.edu    mshrs = 16
4413680Syazakram@ucdavis.edu    tgts_per_mshr = 20
4513680Syazakram@ucdavis.edu
4613680Syazakram@ucdavis.edu    def connectBus(self, bus):
4713680Syazakram@ucdavis.edu        """Connect this cache to a memory-side bus"""
4813680Syazakram@ucdavis.edu        self.mem_side = bus.slave
4913680Syazakram@ucdavis.edu
5013680Syazakram@ucdavis.edu    def connectCPU(self, cpu):
5113680Syazakram@ucdavis.edu        """Connect this cache's port to a CPU-side port
5213680Syazakram@ucdavis.edu           This must be defined in a subclass"""
5313680Syazakram@ucdavis.edu        raise NotImplementedError
5413680Syazakram@ucdavis.edu
5513680Syazakram@ucdavis.educlass L1ICache(L1Cache):
5613680Syazakram@ucdavis.edu    """Simple L1 instruction cache with default values"""
5713680Syazakram@ucdavis.edu
5813680Syazakram@ucdavis.edu    # Set the default size
5913680Syazakram@ucdavis.edu    size = '32kB'
6013680Syazakram@ucdavis.edu
6113680Syazakram@ucdavis.edu    def connectCPU(self, cpu):
6213680Syazakram@ucdavis.edu        """Connect this cache's port to a CPU icache port"""
6313680Syazakram@ucdavis.edu        self.cpu_side = cpu.icache_port
6413680Syazakram@ucdavis.edu
6513680Syazakram@ucdavis.educlass L1DCache(L1Cache):
6613680Syazakram@ucdavis.edu    """Simple L1 data cache with default values"""
6713680Syazakram@ucdavis.edu
6813680Syazakram@ucdavis.edu    # Set the default size
6913680Syazakram@ucdavis.edu    size = '32kB'
7013680Syazakram@ucdavis.edu
7113680Syazakram@ucdavis.edu    def connectCPU(self, cpu):
7213680Syazakram@ucdavis.edu        """Connect this cache's port to a CPU dcache port"""
7313680Syazakram@ucdavis.edu        self.cpu_side = cpu.dcache_port
7413680Syazakram@ucdavis.edu
7513680Syazakram@ucdavis.educlass L2Cache(Cache):
7613680Syazakram@ucdavis.edu    """Simple L2 Cache with default values"""
7713680Syazakram@ucdavis.edu
7813680Syazakram@ucdavis.edu    # Default parameters
7913680Syazakram@ucdavis.edu    size = '512kB'
8013680Syazakram@ucdavis.edu    assoc = 16
8113680Syazakram@ucdavis.edu    tag_latency = 10
8213680Syazakram@ucdavis.edu    data_latency = 10
8313680Syazakram@ucdavis.edu    response_latency = 1
8413680Syazakram@ucdavis.edu    mshrs = 20
8513680Syazakram@ucdavis.edu    tgts_per_mshr = 12
8613680Syazakram@ucdavis.edu
8713680Syazakram@ucdavis.edu    def connectCPUSideBus(self, bus):
8813680Syazakram@ucdavis.edu        self.cpu_side = bus.master
8913680Syazakram@ucdavis.edu
9013680Syazakram@ucdavis.edu    def connectMemSideBus(self, bus):
9113680Syazakram@ucdavis.edu        self.mem_side = bus.slave
9213680Syazakram@ucdavis.edu
9313680Syazakram@ucdavis.edu
9413680Syazakram@ucdavis.educlass MySimpleMemory(SimpleMemory):
9513680Syazakram@ucdavis.edu    latency = '1ns'
9613680Syazakram@ucdavis.edu
9713680Syazakram@ucdavis.eduif buildEnv['TARGET_ISA'] == 'x86':
9813680Syazakram@ucdavis.edu  valid_cpu = {'AtomicSimpleCPU': AtomicSimpleCPU,
9913680Syazakram@ucdavis.edu               'TimingSimpleCPU': TimingSimpleCPU,
10013680Syazakram@ucdavis.edu               'DerivO3CPU': DerivO3CPU
10113680Syazakram@ucdavis.edu              }
10213680Syazakram@ucdavis.eduelse:
10313680Syazakram@ucdavis.edu  valid_cpu = {'AtomicSimpleCPU': AtomicSimpleCPU,
10413680Syazakram@ucdavis.edu               'TimingSimpleCPU': TimingSimpleCPU,
10513680Syazakram@ucdavis.edu               'MinorCPU': MinorCPU,
10613680Syazakram@ucdavis.edu               'DerivO3CPU': DerivO3CPU,
10713680Syazakram@ucdavis.edu              }
10813680Syazakram@ucdavis.edu
10913680Syazakram@ucdavis.eduvalid_mem = {'SimpleMemory': MySimpleMemory,
11013680Syazakram@ucdavis.edu             'DDR3_1600_8x8': DDR3_1600_8x8
11113680Syazakram@ucdavis.edu            }
11213680Syazakram@ucdavis.edu
11313680Syazakram@ucdavis.eduparser = argparse.ArgumentParser()
11413680Syazakram@ucdavis.eduparser.add_argument('binary', type = str)
11513680Syazakram@ucdavis.eduparser.add_argument('--cpu', choices = valid_cpu.keys(),
11613680Syazakram@ucdavis.edu                    default = 'TimingSimpleCPU')
11713680Syazakram@ucdavis.eduparser.add_argument('--mem', choices = valid_mem.keys(),
11813680Syazakram@ucdavis.edu                    default = 'SimpleMemory')
11913680Syazakram@ucdavis.edu
12013680Syazakram@ucdavis.eduargs = parser.parse_args()
12113680Syazakram@ucdavis.edu
12213680Syazakram@ucdavis.edusystem = System()
12313680Syazakram@ucdavis.edu
12413680Syazakram@ucdavis.edusystem.clk_domain = SrcClockDomain()
12513680Syazakram@ucdavis.edusystem.clk_domain.clock = '1GHz'
12613680Syazakram@ucdavis.edusystem.clk_domain.voltage_domain = VoltageDomain()
12713680Syazakram@ucdavis.edu
12813680Syazakram@ucdavis.eduif args.cpu != "AtomicSimpleCPU":
12913680Syazakram@ucdavis.edu        system.mem_mode = 'timing'
13013680Syazakram@ucdavis.edu
13113680Syazakram@ucdavis.edusystem.mem_ranges = [AddrRange('512MB')]
13213680Syazakram@ucdavis.edu
13313680Syazakram@ucdavis.edusystem.cpu = valid_cpu[args.cpu]()
13413680Syazakram@ucdavis.edu
13513680Syazakram@ucdavis.eduif args.cpu == "AtomicSimpleCPU":
13613680Syazakram@ucdavis.edu    system.membus = SystemXBar()
13713680Syazakram@ucdavis.edu    system.cpu.icache_port = system.membus.slave
13813680Syazakram@ucdavis.edu    system.cpu.dcache_port = system.membus.slave
13913680Syazakram@ucdavis.eduelse:
14013680Syazakram@ucdavis.edu    system.cpu.l1d = L1DCache()
14113680Syazakram@ucdavis.edu    system.cpu.l1i = L1ICache()
14213680Syazakram@ucdavis.edu    system.l1_to_l2 = L2XBar()
14313680Syazakram@ucdavis.edu    system.l2cache = L2Cache()
14413680Syazakram@ucdavis.edu    system.membus = SystemXBar()
14513680Syazakram@ucdavis.edu    system.cpu.l1d.connectCPU(system.cpu)
14613680Syazakram@ucdavis.edu    system.cpu.l1d.connectBus(system.l1_to_l2)
14713680Syazakram@ucdavis.edu    system.cpu.l1i.connectCPU(system.cpu)
14813680Syazakram@ucdavis.edu    system.cpu.l1i.connectBus(system.l1_to_l2)
14913680Syazakram@ucdavis.edu    system.l2cache.connectCPUSideBus(system.l1_to_l2)
15013680Syazakram@ucdavis.edu    system.l2cache.connectMemSideBus(system.membus)
15113680Syazakram@ucdavis.edu
15213680Syazakram@ucdavis.edusystem.cpu.createInterruptController()
15313680Syazakram@ucdavis.eduif m5.defines.buildEnv['TARGET_ISA'] == "x86":
15413680Syazakram@ucdavis.edu    system.cpu.interrupts[0].pio = system.membus.master
15513680Syazakram@ucdavis.edu    system.cpu.interrupts[0].int_master = system.membus.slave
15613680Syazakram@ucdavis.edu    system.cpu.interrupts[0].int_slave = system.membus.master
15713680Syazakram@ucdavis.edu
15813680Syazakram@ucdavis.edusystem.mem_ctrl = valid_mem[args.mem]()
15913680Syazakram@ucdavis.edusystem.mem_ctrl.range = system.mem_ranges[0]
16013680Syazakram@ucdavis.edusystem.mem_ctrl.port = system.membus.master
16113680Syazakram@ucdavis.edusystem.system_port = system.membus.slave
16213680Syazakram@ucdavis.edu
16313680Syazakram@ucdavis.eduprocess = Process()
16413680Syazakram@ucdavis.eduprocess.cmd = [args.binary]
16513680Syazakram@ucdavis.edusystem.cpu.workload = process
16613680Syazakram@ucdavis.edusystem.cpu.createThreads()
16713680Syazakram@ucdavis.edu
16813680Syazakram@ucdavis.eduroot = Root(full_system = False, system = system)
16913680Syazakram@ucdavis.edum5.instantiate()
17013680Syazakram@ucdavis.edu
17113680Syazakram@ucdavis.eduexit_event = m5.simulate()
17213680Syazakram@ucdavis.edu
17313680Syazakram@ucdavis.eduif exit_event.getCause() != 'exiting with last active thread context':
17413680Syazakram@ucdavis.edu    exit(1)
175