Hello Brian Suchy, its really hard to see code like this. maybe you should do a diff file?
also, i did two patches some time ago to have some new L2 configurations they may be of help for you look here: http://reviews.gem5.org/r/3495/ http://reviews.gem5.org/r/3506/ On Fri, Feb 3, 2017 at 6:05 AM, Suchy, Brian <suc...@rose-hulman.edu> wrote: > 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 >
_______________________________________________ gem5-users mailing list gem5-users@gem5.org http://m5sim.org/cgi-bin/mailman/listinfo/gem5-users