changeset 7a3ad4b09ce4 in /z/repo/gem5 details: http://repo.gem5.org/gem5?cmd=changeset;node=7a3ad4b09ce4 description: ruby: single physical memory in fs mode Both ruby and the system used to maintain memory copies. With the changes carried for programmed io accesses, only one single memory is required for fs simulations. This patch sets the copy of memory that used to reside with the system to null, so that no space is allocated, but address checks can still be carried out. All the memory accesses now source and sink values to the memory maintained by ruby.
diffstat: configs/example/fs.py | 15 +++++++-------- configs/example/ruby_direct_test.py | 2 +- configs/example/ruby_mem_test.py | 8 +------- configs/example/ruby_network_test.py | 4 +--- configs/example/ruby_random_test.py | 8 +------- configs/example/se.py | 2 +- configs/ruby/MESI_Three_Level.py | 17 ++++++++++++++++- configs/ruby/MESI_Two_Level.py | 23 ++++++++++++++++++----- configs/ruby/MI_example.py | 19 +++++++++++++++++-- configs/ruby/MOESI_CMP_directory.py | 28 +++++++++++++++++++++++++--- configs/ruby/MOESI_CMP_token.py | 27 +++++++++++++++++++++++---- configs/ruby/MOESI_hammer.py | 23 +++++++++++++++++++---- configs/ruby/Network_test.py | 2 +- configs/ruby/Ruby.py | 5 +++-- src/mem/protocol/MESI_Two_Level-dma.sm | 5 ----- src/mem/protocol/MOESI_CMP_directory-dma.sm | 5 ----- src/mem/protocol/MOESI_CMP_token-dma.sm | 5 ----- src/mem/ruby/system/DMASequencer.cc | 23 ++++++++--------------- src/mem/ruby/system/DMASequencer.hh | 5 +---- src/mem/ruby/system/Sequencer.py | 5 +---- tests/configs/memtest-ruby.py | 2 +- tests/configs/pc-simple-timing-ruby.py | 14 +++++++------- tests/configs/rubytest-ruby.py | 2 +- tests/configs/simple-timing-mp-ruby.py | 2 +- tests/configs/simple-timing-ruby.py | 2 +- 25 files changed, 155 insertions(+), 98 deletions(-) diffs (truncated from 700 to 300 lines): diff -r 30e3715c9405 -r 7a3ad4b09ce4 configs/example/fs.py --- a/configs/example/fs.py Thu Nov 06 00:55:09 2014 -0600 +++ b/configs/example/fs.py Thu Nov 06 05:41:44 2014 -0600 @@ -135,7 +135,10 @@ print >> sys.stderr, "Ruby requires TimingSimpleCPU or O3CPU!!" sys.exit(1) - Ruby.create_system(options, test_sys, test_sys.iobus, test_sys._dma_ports) + Ruby.create_system(options, True, test_sys, test_sys.iobus, + test_sys._dma_ports) + test_sys.physmem = [SimpleMemory(range = r, null = True) + for r in test_sys.mem_ranges] # Create a seperate clock domain for Ruby test_sys.ruby.clk_domain = SrcClockDomain(clock = options.ruby_clock, @@ -160,13 +163,9 @@ cpu.interrupts.int_master = test_sys.ruby._cpu_ports[i].slave cpu.interrupts.int_slave = test_sys.ruby._cpu_ports[i].master - test_sys.ruby._cpu_ports[i].access_phys_mem = True - - # Create the appropriate memory controllers - # and connect them to the IO bus - test_sys.mem_ctrls = [TestMemClass(range = r) for r in test_sys.mem_ranges] - for i in xrange(len(test_sys.mem_ctrls)): - test_sys.mem_ctrls[i].port = test_sys.iobus.master + # Connect the ruby io port to the PIO bus, + # assuming that there is just one such port. + test_sys.iobus.master = test_sys.ruby._io_port.slave else: if options.caches or options.l2cache: diff -r 30e3715c9405 -r 7a3ad4b09ce4 configs/example/ruby_direct_test.py --- a/configs/example/ruby_direct_test.py Thu Nov 06 00:55:09 2014 -0600 +++ b/configs/example/ruby_direct_test.py Thu Nov 06 05:41:44 2014 -0600 @@ -109,7 +109,7 @@ options.requests, generator = generator) -Ruby.create_system(options, system) +Ruby.create_system(options, False, system) # Since Ruby runs at an independent frequency, create a seperate clock system.ruby.clk_domain = SrcClockDomain(clock = options.ruby_clock, diff -r 30e3715c9405 -r 7a3ad4b09ce4 configs/example/ruby_mem_test.py --- a/configs/example/ruby_mem_test.py Thu Nov 06 00:55:09 2014 -0600 +++ b/configs/example/ruby_mem_test.py Thu Nov 06 05:41:44 2014 -0600 @@ -128,7 +128,7 @@ dma_ports = [] for (i, dma) in enumerate(dmas): dma_ports.append(dma.test) -Ruby.create_system(options, system, dma_ports = dma_ports) +Ruby.create_system(options, False, system, dma_ports = dma_ports) # Create a top-level voltage domain and clock domain system.voltage_domain = VoltageDomain(voltage = options.sys_voltage) @@ -159,12 +159,6 @@ # system.ruby._cpu_ports[i].deadlock_threshold = 5000000 - # - # Ruby doesn't need the backing image of memory when running with - # the tester. - # - system.ruby._cpu_ports[i].access_phys_mem = False - for (i, dma) in enumerate(dmas): # # Tie the dma memtester ports to the correct functional port diff -r 30e3715c9405 -r 7a3ad4b09ce4 configs/example/ruby_network_test.py --- a/configs/example/ruby_network_test.py Thu Nov 06 00:55:09 2014 -0600 +++ b/configs/example/ruby_network_test.py Thu Nov 06 05:41:44 2014 -0600 @@ -113,7 +113,7 @@ system.clk_domain = SrcClockDomain(clock = options.sys_clock, voltage_domain = system.voltage_domain) -Ruby.create_system(options, system) +Ruby.create_system(options, False, system) # Create a seperate clock domain for Ruby system.ruby.clk_domain = SrcClockDomain(clock = options.ruby_clock, @@ -125,8 +125,6 @@ # Tie the cpu test ports to the ruby cpu port # cpus[i].test = ruby_port.slave - ruby_port.access_phys_mem = False - i += 1 # ----------------------- diff -r 30e3715c9405 -r 7a3ad4b09ce4 configs/example/ruby_random_test.py --- a/configs/example/ruby_random_test.py Thu Nov 06 00:55:09 2014 -0600 +++ b/configs/example/ruby_random_test.py Thu Nov 06 05:41:44 2014 -0600 @@ -106,7 +106,7 @@ system.clk_domain = SrcClockDomain(clock = options.sys_clock, voltage_domain = system.voltage_domain) -Ruby.create_system(options, system) +Ruby.create_system(options, False, system) # Create a seperate clock domain for Ruby system.ruby.clk_domain = SrcClockDomain(clock = options.ruby_clock, @@ -137,12 +137,6 @@ # ruby_port.using_ruby_tester = True - # - # Ruby doesn't need the backing image of memory when running with - # the tester. - # - ruby_port.access_phys_mem = False - # ----------------------- # run simulation # ----------------------- diff -r 30e3715c9405 -r 7a3ad4b09ce4 configs/example/se.py --- a/configs/example/se.py Thu Nov 06 00:55:09 2014 -0600 +++ b/configs/example/se.py Thu Nov 06 05:41:44 2014 -0600 @@ -231,7 +231,7 @@ system.physmem = SimpleMemory(range=AddrRange(options.mem_size), null = True) options.use_map = True - Ruby.create_system(options, system) + Ruby.create_system(options, False, system) assert(options.num_cpus == len(system.ruby._cpu_ports)) system.ruby.clk_domain = SrcClockDomain(clock = options.ruby_clock, diff -r 30e3715c9405 -r 7a3ad4b09ce4 configs/ruby/MESI_Three_Level.py --- a/configs/ruby/MESI_Three_Level.py Thu Nov 06 00:55:09 2014 -0600 +++ b/configs/ruby/MESI_Three_Level.py Thu Nov 06 05:41:44 2014 -0600 @@ -56,7 +56,7 @@ caches private to clusters") return -def create_system(options, system, dma_ports, ruby_system): +def create_system(options, full_system, system, dma_ports, ruby_system): if buildEnv['PROTOCOL'] != 'MESI_Three_Level': fatal("This script requires the MESI_Three_Level protocol to be built.") @@ -231,5 +231,20 @@ dir_cntrl_nodes + \ dma_cntrl_nodes + # Create the io controller and the sequencer + if full_system: + io_seq = DMASequencer(version=len(dma_ports), ruby_system=ruby_system) + ruby_system._io_port = io_seq + io_controller = DMA_Controller(version = len(dma_ports), + dma_sequencer = io_seq, + ruby_system = ruby_system) + ruby_system.io_controller = io_controller + + # Connect the dma controller to the network + io_controller.responseFromDir = ruby_system.network.master + io_controller.requestToDir = ruby_system.network.slave + + all_cntrls = all_cntrls + [io_controller] + topology = create_topology(all_cntrls, options) return (cpu_sequencers, dir_cntrl_nodes, topology) diff -r 30e3715c9405 -r 7a3ad4b09ce4 configs/ruby/MESI_Two_Level.py --- a/configs/ruby/MESI_Two_Level.py Thu Nov 06 00:55:09 2014 -0600 +++ b/configs/ruby/MESI_Two_Level.py Thu Nov 06 05:41:44 2014 -0600 @@ -48,7 +48,7 @@ def define_options(parser): return -def create_system(options, system, dma_ports, ruby_system): +def create_system(options, full_system, system, dma_ports, ruby_system): if buildEnv['PROTOCOL'] != 'MESI_Two_Level': fatal("This script requires the MESI_Two_Level protocol to be built.") @@ -196,7 +196,8 @@ for i, dma_port in enumerate(dma_ports): # Create the Ruby objects associated with the dma controller dma_seq = DMASequencer(version = i, - ruby_system = ruby_system) + ruby_system = ruby_system, + slave = dma_port) dma_cntrl = DMA_Controller(version = i, dma_sequencer = dma_seq, @@ -204,19 +205,31 @@ ruby_system = ruby_system) exec("ruby_system.dma_cntrl%d = dma_cntrl" % i) - exec("ruby_system.dma_cntrl%d.dma_sequencer.slave = dma_port" % i) dma_cntrl_nodes.append(dma_cntrl) # Connect the dma controller to the network dma_cntrl.responseFromDir = ruby_system.network.master dma_cntrl.requestToDir = ruby_system.network.slave - all_cntrls = l1_cntrl_nodes + \ l2_cntrl_nodes + \ dir_cntrl_nodes + \ dma_cntrl_nodes + # Create the io controller and the sequencer + if full_system: + io_seq = DMASequencer(version=len(dma_ports), ruby_system=ruby_system) + ruby_system._io_port = io_seq + io_controller = DMA_Controller(version = len(dma_ports), + dma_sequencer = io_seq, + ruby_system = ruby_system) + ruby_system.io_controller = io_controller + + # Connect the dma controller to the network + io_controller.responseFromDir = ruby_system.network.master + io_controller.requestToDir = ruby_system.network.slave + + all_cntrls = all_cntrls + [io_controller] + topology = create_topology(all_cntrls, options) - return (cpu_sequencers, dir_cntrl_nodes, topology) diff -r 30e3715c9405 -r 7a3ad4b09ce4 configs/ruby/MI_example.py --- a/configs/ruby/MI_example.py Thu Nov 06 00:55:09 2014 -0600 +++ b/configs/ruby/MI_example.py Thu Nov 06 05:41:44 2014 -0600 @@ -42,7 +42,7 @@ def define_options(parser): return -def create_system(options, system, dma_ports, ruby_system): +def create_system(options, full_system, system, dma_ports, ruby_system): if buildEnv['PROTOCOL'] != 'MI_example': panic("This script requires the MI_example protocol to be built.") @@ -173,7 +173,22 @@ dma_cntrl.requestToDir = ruby_system.network.master dma_cntrl.responseFromDir = ruby_system.network.slave + all_cntrls = l1_cntrl_nodes + dir_cntrl_nodes + dma_cntrl_nodes - all_cntrls = l1_cntrl_nodes + dir_cntrl_nodes + dma_cntrl_nodes + # Create the io controller and the sequencer + if full_system: + io_seq = DMASequencer(version=len(dma_ports), ruby_system=ruby_system) + ruby_system._io_port = io_seq + io_controller = DMA_Controller(version = len(dma_ports), + dma_sequencer = io_seq, + ruby_system = ruby_system) + ruby_system.io_controller = io_controller + + # Connect the dma controller to the network + io_controller.responseFromDir = ruby_system.network.master + io_controller.requestToDir = ruby_system.network.slave + + all_cntrls = all_cntrls + [io_controller] + topology = create_topology(all_cntrls, options) return (cpu_sequencers, dir_cntrl_nodes, topology) diff -r 30e3715c9405 -r 7a3ad4b09ce4 configs/ruby/MOESI_CMP_directory.py --- a/configs/ruby/MOESI_CMP_directory.py Thu Nov 06 00:55:09 2014 -0600 +++ b/configs/ruby/MOESI_CMP_directory.py Thu Nov 06 05:41:44 2014 -0600 @@ -48,7 +48,7 @@ def define_options(parser): return -def create_system(options, system, dma_ports, ruby_system): +def create_system(options, full_system, system, dma_ports, ruby_system): if buildEnv['PROTOCOL'] != 'MOESI_CMP_directory': panic("This script requires the MOESI_CMP_directory protocol to be built.") @@ -192,7 +192,8 @@ # Create the Ruby objects associated with the dma controller # dma_seq = DMASequencer(version = i, - ruby_system = ruby_system) + ruby_system = ruby_system, + slave = dma_port) dma_cntrl = DMA_Controller(version = i, dma_sequencer = dma_seq, @@ -200,14 +201,35 @@ ruby_system = ruby_system) exec("ruby_system.dma_cntrl%d = dma_cntrl" % i) - exec("ruby_system.dma_cntrl%d.dma_sequencer.slave = dma_port" % i) dma_cntrl_nodes.append(dma_cntrl) + # Connect the dma controller to the network + dma_cntrl.responseFromDir = ruby_system.network.master + dma_cntrl.reqToDir = ruby_system.network.slave + dma_cntrl.respToDir = ruby_system.network.slave + all_cntrls = l1_cntrl_nodes + \ l2_cntrl_nodes + \ dir_cntrl_nodes + \ dma_cntrl_nodes + # Create the io controller and the sequencer + if full_system: + io_seq = DMASequencer(version=len(dma_ports), ruby_system=ruby_system) + ruby_system._io_port = io_seq + io_controller = DMA_Controller(version = len(dma_ports), + dma_sequencer = io_seq, + ruby_system = ruby_system) _______________________________________________ gem5-dev mailing list gem5-dev@gem5.org http://m5sim.org/mailman/listinfo/gem5-dev