Hello everyone,
I am attempting to create an L3 cache to run in FS mode with the ARM detailed processor; however, I am encountering an error when trying to run the simulator. When I try run the simulator, the following occurs: --BEGIN TERMINAL-- $:~/Documents/gem5/gem5$ sudo build/ARM/gem5.opt configs/example/fs.py --kernel=/home/suchy/Documents/gem5/gem5/Benchmark/asimBenchmark/binaries/vmlinux.smp.ics.arm.asimbench.2.6.35 --dtb-file=/home/suchy/Documents/gem5/gem5/Benchmark/asimBenchmark/binaries/vexpress-v2p-ca15-tc1.dtb --disk-image=/home/suchy/Documents/gem5/gem5/Benchmark/asimBenchmark/disks/ARMv7a-ICS-Android.SMP.Asimbench-v3.img --script=/home/suchy/Documents/gem5/gem5/Benchmark/asimBenchmark/scripts/ttpod.rcS --os-type=android-ics --mem-size=256MB --machine-type=RealView_PBX --caches --l3cache gem5 Simulator System. http://gem5.org gem5 is copyrighted software; use the --copyright option for details. gem5 compiled Feb 2 2017 23:49:17 gem5 started Feb 2 2017 23:56:43 gem5 executing on SmallButMIghty, pid 11798 command line: build/ARM/gem5.opt configs/example/fs.py --kernel=/home/suchy/Documents/gem5/gem5/Benchmark/asimBenchmark/binaries/vmlinux.smp.ics.arm.asimbench.2.6.35 --dtb-file=/home/suchy/Documents/gem5/gem5/Benchmark/asimBenchmark/binaries/vexpress-v2p-ca15-tc1.dtb --disk-image=/home/suchy/Documents/gem5/gem5/Benchmark/asimBenchmark/disks/ARMv7a-ICS-Android.SMP.Asimbench-v3.img --script=/home/suchy/Documents/gem5/gem5/Benchmark/asimBenchmark/scripts/ttpod.rcS --os-type=android-ics --mem-size=256MB --machine-type=RealView_PBX --caches --l3cache Traceback (most recent call last): File "<string>", line 1, in <module> File "/home/suchy/Documents/gem5/gem5/src/python/m5/main.py", line 400, in main exec filecode in scope File "configs/example/fs.py", line 341, in <module> test_sys = build_test_system(np) File "configs/example/fs.py", line 230, in build_test_system CacheConfig.config_cache(options, test_sys) File "/home/suchy/Documents/gem5/gem5/configs/common/CacheConfig.py", line 195, in config_cache system.cpu[i].connectAllPorts(system.cpu[i].tol3bus, system.membus) File "/home/suchy/Documents/gem5/gem5/src/python/m5/SimObject.py", line 1095, in __getattr__ raise AttributeError, err_string AttributeError: object 'O3_ARM_v7a_3' has no attribute 'tol3bus' (C++ object is not yet constructed, so wrapped C++ methods are unavailable.) --END TERMINAL-- I cannot track down where I go about adding the tol3bus to get past this stage. Is there anyone who can recommend where to look? Also, I have my default processor set to detailed_arm. The following are also my CacheConfig.Py, O3_ARM-V7a.Py, and Caches.Py files: Side note: I am also trying to create a victim cache, but it encounters the same issue. SO if you see a vcache or anything like that, please feel free to ignore it --Begin CacheConfig.Py-- import m5 from m5.objects import * from Caches import * from O3_ARM_v7a import * def config_cache(options, system): if options.external_memory_system and (options.caches or options.l2cache or options.l3cache or options.vcache): print "External caches and internal caches are exclusive options.\n" sys.exit(1) if options.external_memory_system: ExternalCache = ExternalCacheFactory(options.external_memory_system) # Set the cache line size of the system system.cache_line_size = options.cacheline_size # If elastic trace generation is enabled, make sure the memory system is # minimal so that compute delays do not include memory access latencies. # Configure the compulsory L1 caches for the O3CPU, do not configure # any more caches. if options.l2cache and options.elastic_trace_en: fatal("When elastic trace is enabled, do not configure L2 caches.") if options.cpu_type == "arm_detailed": #try: #from O3_ARM_v7a import * # except: # print "arm_detailed is unavailable. Did you compile the O3 model?" # sys.exit(1) dcache_class, icache_class, l2_cache_class, l3_cache_class, v_cache_class, walk_cache_class = \ O3_ARM_v7a_DCache, O3_ARM_v7a_ICache, O3_ARM_v7aL2, O3_ARM_v7aL3, O3_ARM_v7aV, \ O3_ARM_v7aWalkCache else: dcache_class, icache_class, l2_cache_class, l3_cache_class, v_cache_class, walk_cache_class = \ L1_DCache, L1_ICache, L2Cache, L3Cache, VCache, None if buildEnv['TARGET_ISA'] == 'x86': walk_cache_class = PageTableWalkerCache if options.l2cache: # Provide a clock for the L2 and the L1-to-L2 bus here as they # are not connected using addTwoLevelCacheHierarchy. Use the # same clock as the CPUs. system.l2 = l2_cache_class(clk_domain=system.cpu_clk_domain, size=options.l2_size, assoc=options.l2_assoc) system.tol2bus = L2XBar(clk_domain = system.cpu_clk_domain) system.l2.cpu_side = system.tol2bus.master system.l2.mem_side = system.membus.slave #Added L3 and VCache if options.l3cache: system.l3 = l3_cache_class(clk_domain=system.cpu_clk_domain, size=options.l3_size,assoc=options.l3_assoc) system.tol3bus = L2XBar(clk_domain = system.cpu_clk_domain) system.l3.cpu_side = system.tol3bus.master system.l3.mem_side = system.membus.slave # if options.vcache: system.v = v_cache_class(clk_domain=system.cpu_clk_domain, size=options.v_size,assoc=options.v_assoc) system.tovbus = L2XBar(clk_domain = system.cpu_clk_domain) system.v.cpu_side = system.tovbus.master system.v.mem_side = system.membus.slave if options.memchecker: system.memchecker = MemChecker() for i in xrange(options.num_cpus): if options.caches: icache = icache_class(size=options.l1i_size, assoc=options.l1i_assoc) dcache = dcache_class(size=options.l1d_size, assoc=options.l1d_assoc) #Added L3 and VCache Options if options.l3cache: system.cpu[i].l2 = l2_cache_class(size=options.l2_size, assoc=options.l2_assoc) system.cpu[i].tol2bus = L2XBar(clk_domain = system.cpu_clk_domain) system.cpu[i].l2.cpu_side = system.cpu[i].tol2bus.master system.cpu[i].l2.mem_side = system.tol3bus.slave if options.vcache: system.cpu[i].l3 = l3_cache_class(size=options.l3_size, assoc=options.l3_assoc) system.cpu[i].tol3bus = L2XBar(clk_domain = system.cpu_clk_domain) system.cpu[i].l3.cpu_side = system.cpu[i].tol3bus.master system.cpu[i].l3.mem_side = system.tovbus.slave # If we have a walker cache specified, instantiate two # instances here if walk_cache_class: iwalkcache = walk_cache_class() dwalkcache = walk_cache_class() else: iwalkcache = None dwalkcache = None if options.memchecker: dcache_mon = MemCheckerMonitor(warn_only=True) dcache_real = dcache # Do not pass the memchecker into the constructor of # MemCheckerMonitor, as it would create a copy; we require # exactly one MemChecker instance. dcache_mon.memchecker = system.memchecker # Connect monitor dcache_mon.mem_side = dcache.cpu_side # Let CPU connect to monitors dcache = dcache_mon # When connecting the caches, the clock is also inherited # from the CPU in question system.cpu[i].addPrivateSplitL1Caches(icache, dcache, iwalkcache, dwalkcache) if options.memchecker: # The mem_side ports of the caches haven't been connected yet. # Make sure connectAllPorts connects the right objects. system.cpu[i].dcache = dcache_real system.cpu[i].dcache_mon = dcache_mon elif options.external_memory_system: # These port names are presented to whatever 'external' system # gem5 is connecting to. Its configuration will likely depend # on these names. For simplicity, we would advise configuring # it to use this naming scheme; if this isn't possible, change # the names below. if buildEnv['TARGET_ISA'] in ['x86', 'arm']: system.cpu[i].addPrivateSplitL1Caches( ExternalCache("cpu%d.icache" % i), ExternalCache("cpu%d.dcache" % i), ExternalCache("cpu%d.itb_walker_cache" % i), ExternalCache("cpu%d.dtb_walker_cache" % i)) else: system.cpu[i].addPrivateSplitL1Caches( ExternalCache("cpu%d.icache" % i), ExternalCache("cpu%d.dcache" % i)) system.cpu[i].createInterruptController() #added this if options.vcache: system.cpu[i].connectAllPorts(system.cpu[i].tovbus, system.membus) else: if options.l3cache: system.cpu[i].connectAllPorts(system.cpu[i].tol3bus, system.membus) #same as before else: if options.l2cache: system.cpu[i].connectAllPorts(system.tol2bus, system.membus) else: if options.external_memory_system: system.cpu[i].connectUncachedPorts(system.membus) else: system.cpu[i].connectAllPorts(system.membus) return system # ExternalSlave provides a "port", but when that port connects to a cache, # the connecting CPU SimObject wants to refer to its "cpu_side". # The 'ExternalCache' class provides this adaptation by rewriting the name, # eliminating distracting changes elsewhere in the config code. class ExternalCache(ExternalSlave): def __getattr__(cls, attr): if (attr == "cpu_side"): attr = "port" return super(ExternalSlave, cls).__getattr__(attr) def __setattr__(cls, attr, value): if (attr == "cpu_side"): attr = "port" return super(ExternalSlave, cls).__setattr__(attr, value) def ExternalCacheFactory(port_type): def make(name): return ExternalCache(port_data=name, port_type=port_type, addr_ranges=[AllMemory]) return make --END CacheConfig.Py-- --BEGIN Caches.py-- from m5.defines import buildEnv from m5.objects import * # Base implementations of L1, L2, IO and TLB-walker caches. There are # used in the regressions and also as base components in the # system-configuration scripts. The values are meant to serve as a # starting point, and specific parameters can be overridden in the # specific instantiations. class L1Cache(Cache): """Simple L1 Cache with default values""" # Default parameters for both L1 I and D caches assoc = 2 tag_latency = 2 data_latency = 2 response_latency = 2 mshrs = 4 tgts_per_mshr = 20 # is_top_level = True def __init__(self, options=None): super(L1Cache, self).__init__() pass def connectCPU(self, cpu_port): """"Connect this cache's port to a CPU port""" self.cpu_side = cpu_port def connectBus(self, bus): """"Connect this cache to a memory-side bus""" self.mem_side = bus.slave class L1_ICache(L1Cache): """Simple L1 instruction cache with default values""" # Set the default size size = '16kB' def __init__(self, options=None): super(L1_ICache, self).__init__() pass def connectCPU(self, cpu_port): """"Connect this cache's port to a CPU port""" self.cpu_side = cpu_port.icache_port def connectBus(self, bus): """"Connect this cache to a memory-side bus""" self.mem_side = bus.slave # super(L1ICache, self).__init__(options) # if not options or not options.l1i_size: # return #self.size = options.l1i_size class L1_DCache(L1Cache): """Simple L1 data cache with default values""" # Set the default size size = '64kB' def __init__(self, options=None): super(L1_DCache, self).__init__() pass def connectCPU(self, cpu_port): """"Connect this cache's port to a CPU port""" self.cpu_side = cpu_port.dcache_port def connectBus(self, bus): """"Connect this cache to a memory-side bus""" self.mem_side = bus.slave #super(L1DCache, self).__init__(options) #if not options or not options.l1d_size: # return #self.size = options.l1d_size class L2Cache(Cache): """Simple L2 Cache with default values""" # Default parameters size = '256kB' assoc = 8 tag_latency = 6 data_latency = 6 response_latency = 6 mshrs = 20 tgts_per_mshr = 12 def __init__(self, options=None): super(L2Cache, self).__init__() pass #super(L2Cache, self).__init__() #if not options or not options.l2_size: # return #self.size = options.l2_size def connectCPUSideBus(self, bus): """"Connect this cache to a cpu-side bus""" self.cpu_side = bus.master def connectMemSideBus(self, bus): """"Connect this cache to a memory-side bus""" self.mem_side = bus.slave # # added L3 cache here # class L3Cache(Cache): size = '2MB' assoc = 16 tag_latency = 20 data_latency = 20 response_latency = 20 mshrs = 512 tgts_per_mshr = 20 write_buffers = 256 def __init__(self, options=None): super(L3Cache, self).__init__() pass #super(L3Cache, self).__init__() #if not options or not options.l2_size: # return #self.size = options.l2_size def connectCPUSideBus(self, bus): """"Connect this cache to a cpu-side bus""" self.cpu_side = bus.master def connectMemSideBus(self, bus): """"Connect this cache to a memory-side bus""" self.mem_side = bus.slave class VCache(Cache): size = '16kB' assoc = 1 tag_latency = 2 data_latency = 2 response_latency = 2 mshrs = 4 tgts_per_mshr = 20 write_buffers = 256 prefetcher = TaggedPrefetcher(degree=3) tags = LRU() def __init__(self, options=None): super(VCache, self).__init__() pass #super(L3Cache, self).__init__() #if not options or not options.l2_size: # return #self.size = options.l2_size def connectCPUSideBus(self, bus): """"Connect this cache to a cpu-side bus""" self.cpu_side = bus.master def connectMemSideBus(self, bus): """"Connect this cache to a memory-side bus""" self.mem_side = bus.slave #prefetcher = 'tagged' # # # class IOCache(Cache): assoc = 8 tag_latency = 50 data_latency = 50 response_latency = 50 mshrs = 20 size = '1kB' tgts_per_mshr = 12 # here to # forward_snoops = False # is_top_level = True # class PageTableWalkerCache(Cache): assoc = 2 tag_latency = 2 data_latency = 2 response_latency = 2 mshrs = 10 size = '1kB' tgts_per_mshr = 12 # # added this line # # is_top_level = True # # the x86 table walker actually writes to the table-walker cache if buildEnv['TARGET_ISA'] == 'x86': is_read_only = False else: is_read_only = True # Writeback clean lines as well writeback_clean = True --END Caches.py-- --BEGIN O3_ARM_v7a.py-- from m5.objects import * # Simple ALU Instructions have a latency of 1 class O3_ARM_v7a_Simple_Int(FUDesc): opList = [ OpDesc(opClass='IntAlu', opLat=1) ] count = 2 # Complex ALU instructions have a variable latencies class O3_ARM_v7a_Complex_Int(FUDesc): opList = [ OpDesc(opClass='IntMult', opLat=3, pipelined=True), OpDesc(opClass='IntDiv', opLat=12, pipelined=False), OpDesc(opClass='IprAccess', opLat=3, pipelined=True) ] count = 1 # Floating point and SIMD instructions class O3_ARM_v7a_FP(FUDesc): opList = [ OpDesc(opClass='SimdAdd', opLat=4), OpDesc(opClass='SimdAddAcc', opLat=4), OpDesc(opClass='SimdAlu', opLat=4), OpDesc(opClass='SimdCmp', opLat=4), OpDesc(opClass='SimdCvt', opLat=3), OpDesc(opClass='SimdMisc', opLat=3), OpDesc(opClass='SimdMult',opLat=5), OpDesc(opClass='SimdMultAcc',opLat=5), OpDesc(opClass='SimdShift',opLat=3), OpDesc(opClass='SimdShiftAcc', opLat=3), OpDesc(opClass='SimdSqrt', opLat=9), OpDesc(opClass='SimdFloatAdd',opLat=5), OpDesc(opClass='SimdFloatAlu',opLat=5), OpDesc(opClass='SimdFloatCmp', opLat=3), OpDesc(opClass='SimdFloatCvt', opLat=3), OpDesc(opClass='SimdFloatDiv', opLat=3), OpDesc(opClass='SimdFloatMisc', opLat=3), OpDesc(opClass='SimdFloatMult', opLat=3), OpDesc(opClass='SimdFloatMultAcc',opLat=5), OpDesc(opClass='SimdFloatSqrt', opLat=9), OpDesc(opClass='FloatAdd', opLat=5), OpDesc(opClass='FloatCmp', opLat=5), OpDesc(opClass='FloatCvt', opLat=5), OpDesc(opClass='FloatDiv', opLat=9, pipelined=False), OpDesc(opClass='FloatSqrt', opLat=33, pipelined=False), OpDesc(opClass='FloatMult', opLat=4), OpDesc(opClass='FloatMultAcc', opLat=5), OpDesc(opClass='FloatMisc', opLat=3) ] count = 2 # Load/Store Units class O3_ARM_v7a_Load(FUDesc): opList = [ OpDesc(opClass='MemRead',opLat=2), OpDesc(opClass='FloatMemRead',opLat=2) ] count = 1 class O3_ARM_v7a_Store(FUDesc): opList = [ OpDesc(opClass='MemWrite',opLat=2), OpDesc(opClass='FloatMemWrite',opLat=2) ] count = 1 # Functional Units for this CPU class O3_ARM_v7a_FUP(FUPool): FUList = [O3_ARM_v7a_Simple_Int(), O3_ARM_v7a_Complex_Int(), O3_ARM_v7a_Load(), O3_ARM_v7a_Store(), O3_ARM_v7a_FP()] # Bi-Mode Branch Predictor class O3_ARM_v7a_BP(BiModeBP): globalPredictorSize = 8192 globalCtrBits = 2 choicePredictorSize = 8192 choiceCtrBits = 2 BTBEntries = 2048 BTBTagSize = 18 RASSize = 16 instShiftAmt = 2 class O3_ARM_v7a_3(DerivO3CPU): LQEntries = 16 SQEntries = 16 LSQDepCheckShift = 0 LFSTSize = 1024 SSITSize = 1024 decodeToFetchDelay = 1 renameToFetchDelay = 1 iewToFetchDelay = 1 commitToFetchDelay = 1 renameToDecodeDelay = 1 iewToDecodeDelay = 1 commitToDecodeDelay = 1 iewToRenameDelay = 1 commitToRenameDelay = 1 commitToIEWDelay = 1 fetchWidth = 3 fetchBufferSize = 16 fetchToDecodeDelay = 3 decodeWidth = 3 decodeToRenameDelay = 2 renameWidth = 3 renameToIEWDelay = 1 issueToExecuteDelay = 1 dispatchWidth = 6 issueWidth = 8 wbWidth = 8 fuPool = O3_ARM_v7a_FUP() iewToCommitDelay = 1 renameToROBDelay = 1 commitWidth = 8 squashWidth = 8 trapLatency = 13 backComSize = 5 forwardComSize = 5 numPhysIntRegs = 128 numPhysFloatRegs = 192 numIQEntries = 32 numROBEntries = 40 switched_out = False branchPred = O3_ARM_v7a_BP() # Instruction Cache class O3_ARM_v7a_ICache(Cache): tag_latency = 1 data_latency = 1 response_latency = 1 mshrs = 2 tgts_per_mshr = 8 size = '16kB' assoc = 2 is_read_only = True # Writeback clean lines as well writeback_clean = True # Data Cache class O3_ARM_v7a_DCache(Cache): tag_latency = 2 data_latency = 2 response_latency = 2 mshrs = 6 tgts_per_mshr = 8 size = '64kB' assoc = 2 write_buffers = 16 # Consider the L2 a victim cache also for clean lines writeback_clean = True # TLB Cache # Use a cache as a L2 TLB class O3_ARM_v7aWalkCache(Cache): tag_latency = 4 data_latency = 4 response_latency = 4 mshrs = 6 tgts_per_mshr = 8 size = '1kB' assoc = 8 write_buffers = 16 is_read_only = True # Writeback clean lines as well writeback_clean = True # L2 Cache class O3_ARM_v7aL2(Cache): tag_latency = 12 data_latency = 12 response_latency = 12 mshrs = 16 tgts_per_mshr = 8 size = '256kB' assoc = 16 write_buffers = 8 prefetch_on_access = True clusivity = 'mostly_excl' # L2 Cache class O3_ARM_v7aL3(Cache): tag_latency = 20 data_latency = 20 response_latency = 20 mshrs = 512 tgts_per_mshr = 20 size = '2MB' assoc = 16 write_buffers = 256 prefetch_on_access = True clusivity = 'mostly_excl' # L2 Cache class O3_ARM_v7aV(Cache): tag_latency = 2 data_latency = 2 response_latency = 2 mshrs = 6 tgts_per_mshr = 20 size = '16kB' assoc = 1 write_buffers = 256 # Consider the L2 a victim cache also for clean lines writeback_clean = True prefetcher = TaggedPrefetcher(degree=3) tags = LRU() --END O3_ARM_v7a.py-- Thank you all for your help. -Brian Suchy
_______________________________________________ gem5-users mailing list gem5-users@gem5.org http://m5sim.org/cgi-bin/mailman/listinfo/gem5-users