The SystemC TLM examples already include an example setup for elastic traces. However, in the provided examples the L2 cache is omitted. This patch provides an additionall example, which also includes an L2 cache on the gem5 side. Change-Id: I49e9fa074b60007694abff37663f0400caf72099 Reviewed-on: https://gem5-review.googlesource.com/4900 Reviewed-by: Jason Lowe-Power <jason@lowepower.com> Reviewed-by: Christian Menard <christian.menard@tu-dresden.de> Maintainer: Jason Lowe-Power <jason@lowepower.com>
205 lines
8.1 KiB
Plaintext
205 lines
8.1 KiB
Plaintext
This directory contains a demo of a coupling between gem5 and SystemC-TLM. It
|
|
is based on the gem5-systemc implementation in utils/systemc. This Readme gives
|
|
an overall overview (I), describes the source files in this directory (II),
|
|
explains the build steps (III), shows how to run example simulations (IV-VI)
|
|
and lists known issues (VII).
|
|
|
|
|
|
I. Overview
|
|
===========
|
|
|
|
The sources in this directory provide three SystemC modules that manage the
|
|
SystemC/gem5 co-simulation: Gem5SimControl, Gem5MasterTransactor, and
|
|
Gem5SlaveTransactor. They also implement gem5's ExternalMaster::Port interface
|
|
(SCMasterPort) and ExternalSlave::Port interface (SCSlavePort).
|
|
|
|
**SCMasterPort** and **Gem5MasterTransactor** together form a TLM-to-gem5
|
|
bridge. SCMasterPort implements gem5's ExternalMaster::Port interface and forms
|
|
the gem5 end of the bridge. Gem5MasterTransactor is a SystemC module that
|
|
provides a target socket and represents the TLM side of the bridge. All TLM
|
|
requests send to this target socket, are translated to gem5 requests and
|
|
forwarded to the gem5 world through the SCMasterPort. Then the gem5 world
|
|
handles the request and eventually issues a response. When the response arrives
|
|
at the SCMasterPort it gets translated back into a TLM response and forwarded
|
|
to the TLM world through target socket of the Gem5MasterTransactor.
|
|
SCMasterPort and Gem5MasterTransactor are bound to each other by configuring
|
|
them for the same port name.
|
|
|
|
**SCSlavePort** and **Gem5SlaveTransactor** together form a gem5-to-TLM bridge.
|
|
Gem5SlaveTransactor is a SystemC module that provides a initiator socket and
|
|
represents the TLM end of the bridge. SCSlavePort implements gem5's
|
|
ExternalSlave::Port interface and forms the gem5 side of the bridge. All gem5
|
|
requests sent to the SCSlavePort, are translated to TLM requests and forwarded
|
|
to the TLM world through the initiator socket of the Gem5SlaveTransactor. Then
|
|
the TLM world handles the request and eventually issues a response. When the
|
|
response arrives at the Gem5SlaveTransactor it gets translated back into a
|
|
gem5 response and forwarded to the gem5 world through the SCSlavePort. SCSLavePort
|
|
and Gem5SlaveTransactor are bound to each other by configuring them for the
|
|
same port name.
|
|
|
|
**Gem5SimControl** is the central SystemC module that represents the complete
|
|
gem5 world. It is responsible for instantiating all gem5 objects according to a
|
|
given configuration file, for configuring the simulation and for maintaining
|
|
the gem5 event queue. It also keeps track of all SCMasterPort and SCSlavePort
|
|
and responsible for connecting all Gem5MasterTransactor and Gem5SlaveTransactor
|
|
modules to their gem5 counterparts. This module must be instantiated exactly
|
|
once in order to run a gem5 simulation from within an SystemC environment.
|
|
|
|
|
|
II. Files
|
|
=========
|
|
|
|
src/sc_slave_port.{cc,hh} -- Implements SCSlavePort
|
|
src/sc_master_port.{cc,hh} -- Implements SCMasterPort
|
|
src/sc_mm.{cc,hh} -- Implementation of a TLM memory manager
|
|
src/sc_ext.{cc,hh} -- TLM extension that carries a gem5 packet
|
|
src/sc_peq.{cc,hh} -- TLM PEQ for scheduling gem5 events
|
|
src/sim_control.{cc,hh} -- Implements Gem5SimControl
|
|
src/slave_transactor.{cc,hh} -- Implements Gem5SlaveTransactor
|
|
src/master_transactor.{cc,hh} -- Implements Gem5MasterTransactor
|
|
|
|
examples/common/cli_parser.{cc,hh} -- Simple cli argument parser
|
|
examples/common/report_hanlder.{cc,hh} -- Custom SystemC report handler
|
|
|
|
examples/slave_port/main.cc -- demonstration of the slave port
|
|
examples/slave_port/sc_target.{cc,hh} -- an example TLM LT/AT memory module
|
|
|
|
examples/master_port/main.cc -- demonstration of the master port
|
|
examples/master_port/traffic_generator.{cc/hh}
|
|
-- an example traffic generator module
|
|
|
|
conf/tlm_slave.py -- simple gem5 configuration connecting to a
|
|
SytemC/TLM slave module
|
|
conf/tlm_elastic_slave.py -- gem5 configuration with an elastic trace
|
|
replayer
|
|
conf/tlm_master.py -- simple gem5 configuration connecting to a
|
|
SytemC/TLM master module
|
|
conf/tgen.cfg -- trace generator configuration
|
|
|
|
Other Files will be used from utils/systemc example:
|
|
|
|
sc_logger.{cc,hh},
|
|
sc_module.{cc,hh},
|
|
sc_gem5_control.{cc,hh},
|
|
stats.{cc,hh}
|
|
|
|
|
|
III. Build
|
|
==========
|
|
|
|
First build a normal gem5 (cxx-config not needed, Python needed).
|
|
Second build gem5 as a library with cxx-config support and (optionally)
|
|
without python.
|
|
|
|
> cd ../..
|
|
> scons build/ARM/gem5.opt
|
|
> scons --with-cxx-config --without-python --without-tcmalloc \
|
|
> build/ARM/libgem5_opt.so
|
|
> cd util/tlm
|
|
|
|
Note: For MAC / OSX this command should be used:
|
|
> scons --with-cxx-config --without-python --without-tcmalloc \
|
|
> build/ARM/libgem5_opt.dylib
|
|
|
|
To build all sources of the SystemC binding and the examples simply run scons:
|
|
|
|
> scons
|
|
|
|
|
|
IV. Simple Examples
|
|
===================
|
|
|
|
In order to run our example simulation, we first need to create a config.ini
|
|
that represents the gem5 configuration. We do so by starting gem5 with the
|
|
desired python configuration script.
|
|
|
|
> ../../build/ARM/gem5.opt conf/tlm_{master,slave}.py
|
|
|
|
The message "fatal: Can't find port handler type 'tlm_{master,slave}'" is okay.
|
|
The configuration will be stored in the m5out/ directory
|
|
|
|
The build step creates a binary 'gem5.sc' for each example in the
|
|
build/examples/{master|slave}_port directories. It can now be used to load in
|
|
the generated configuration file from the previous normal gem5 run.
|
|
|
|
Try:
|
|
|
|
> build/examples/{master,slave}_port/gem5.sc m5out/config.ini -e 1000000
|
|
|
|
It should run a simulation for 1us.
|
|
|
|
To see more information what happens inside the TLM modules use the -v flag:
|
|
|
|
> build/{master,slave}_port/gem5.sc m5out/config.ini -e 1000000 -v
|
|
|
|
|
|
V. Full System Setup
|
|
=====================
|
|
|
|
Apart from the simple examples, there is a full system example that uses
|
|
the gem5-to-TLM bridge.
|
|
|
|
Build gem5 as described in Section III. Then, make a config file for the
|
|
C++-configured gem5 using normal gem5
|
|
|
|
> ../../build/ARM/gem5.opt ../../configs/example/fs.py \
|
|
--tlm-memory=transactor --cpu-type=TimingSimpleCPU --num-cpu=1 \
|
|
--mem-type=SimpleMemory --mem-size=512MB --mem-channels=1 --caches \
|
|
--l2cache --machine-type=VExpress_EMM \
|
|
--dtb-filename=vexpress.aarch32.ll_20131205.0-gem5.1cpu.dtb \
|
|
--kernel=vmlinux.aarch32.ll_20131205.0-gem5 \
|
|
--disk-image=linux-aarch32-ael.img
|
|
|
|
The message "fatal: Can't find port handler type 'tlm_slave'" is okay.
|
|
The configuration will be stored in the m5out/ directory
|
|
|
|
The binary 'build/examples/slave_port/gem5.sc' can now be used to load in the
|
|
generated config file from the previous normal gem5 run.
|
|
|
|
Try:
|
|
|
|
> build/examples/slave_port/gem5.sc m5out/config.ini -o 2147483648
|
|
|
|
The parameter -o specifies the begining of the memory region (0x80000000).
|
|
The system should boot now.
|
|
|
|
For convenience a run_gem5_fs.sh file holds all those commands
|
|
|
|
|
|
VI. Elastic Trace Setup
|
|
========================
|
|
|
|
Elastic traces can also be replayed into the SystemC world.
|
|
For more information on elastic traces please refer to:
|
|
|
|
- http://www.gem5.org/TraceCPU
|
|
|
|
- Exploring System Performance using Elastic Traces:
|
|
Fast, Accurate and Portable
|
|
R. Jagtap, S. Diestelhorst, A. Hansson, M. Jung, N. Wehn.
|
|
IEEE International Conference on Embedded Computer Systems Architectures
|
|
Modeling and Simulation (SAMOS), July, 2016, Samos Island, Greece.
|
|
|
|
Similar to IV. the simulation can be set up with this command:
|
|
|
|
> ../../build/ARM/gem5.opt ./conf/tlm_elastic_slave.py
|
|
|
|
or
|
|
|
|
> ../../build/ARM/gem5.opt ./conf/tlm_elastic_slave_with_l2.py
|
|
|
|
Then:
|
|
|
|
> build/examples/slave_port/gem5.sc m5out/config.ini
|
|
|
|
|
|
VII. Knwon issues
|
|
=================
|
|
|
|
* For some toolchains, compiling libgem5 with tcmalloc leads to errors
|
|
('tcmalloc Attempt to free invalid pointer xxx') when linking libgem5 into a
|
|
SystemC application.
|
|
* When SystemC is build with pthread support enabled, the binding of gem5 to
|
|
SystemC breaks. When gem5 is linked to a SystemC application, gem5's usage
|
|
of thread local storage results in a segfault.
|