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