FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

Gem5のチュートリアル "Learning Gem5"をやってみる(5. Gem5のコンフィグレーションスクリプトの構成)

www.gem5.org

se.py と fs.py の使用方法

ここでは、se.py と fs.py の使用方法と共通オプションについて議論する。フルシステムシミュレーションに関するより詳細な実行方法は、フルシステムシミュレーションの章を参照すること。ここでは、2つのファイルに関する共通のオプションについて紹介する。

この章で議論する殆どの共通オプションについては、 Options.py で登録されている。このためには addCommonOptions が使用されている。このセクションではすべてのオプションの詳細については紹介しない。全てのオプションについて見るためには、—help を使用するか、スクリプトソースコードを参照すること。

何もオプションを渡さずに実行すると、以下のようになる:

./build/RISCV/gem5.opt configs/example/se.py --cmd=./tests/test-progs/hello/src/hello.bare.riscv 
gem5 Simulator System.  https://www.gem5.org
gem5 is copyrighted software; use the --copyright option for details.

gem5 version 22.1.0.0
gem5 compiled Jun 13 2023 10:10:10
gem5 started Jun 25 2023 22:55:16
gem5 executing on kimura-tower, pid 3097806
command line: ./build/RISCV/gem5.opt configs/example/se.py --cmd=./tests/test-progs/hello/src/hello.bare.riscv

warn: The `get_runtime_isa` function is deprecated. Please migrate away from using this function.
warn: The `get_runtime_isa` function is deprecated. Please migrate away from using this function.
Global frequency set at 1000000000000 ticks per second
warn: No dot file generated. Please install pydot to generate the dot file and pdf.
build/RISCV/mem/dram_interface.cc:690: warn: DRAM device capacity (8192 Mbytes) does not match the address range assigned (512 Mbytes)
build/RISCV/arch/riscv/linux/se_workload.cc:60: warn: Unknown operating system; assuming Linux.
0: system.remote_gdb: listening for remote gdb on port 7000
**** REAL SIMULATION ****
build/RISCV/sim/simulate.cc:192: info: Entering event queue @ 0.  Starting simulation...
Hello world!
Exiting @ tick 1371000 because exiting with last active thread context

これ自体は、全く面白いシミュレーションではない!デフォルトではgem5は atomic CPU モデルを使用し、すべてのアクセスが atomic memory access となる、したがって実際のタイミングデータは計測されない!これを確認するためには、 m5out/config.ini を参照すればよい:

[system.cpu]
type=BaseAtomicSimpleCPU
children=decoder interrupts isa mmu power_state tracer workload
branchPred=Null
checker=Null
clk_domain=system.cpu_clk_domain
cpu_id=0
decoder=system.cpu.decoder
do_checkpoint_insts=true
do_statistics_insts=true
eventq_index=0
function_trace=false
function_trace_start=0

タイミングモードで実行するためには、CPUタイプを設定する必要がある。このとき、同時にL1キャッシュを指定する。

./build/RISCV/gem5.opt configs/example/se.py \
    --cmd=./tests/test-progs/hello/src/hello.bare.riscv \
    --cpu-type=TimingSimpleCPU \
    --l1d_size=64kB --l1i_size=16kB
gem5 Simulator System.  https://www.gem5.org
gem5 is copyrighted software; use the --copyright option for details.

gem5 version 22.1.0.0
gem5 compiled Jun 13 2023 10:10:10
gem5 started Jun 25 2023 23:00:06
gem5 executing on kimura-tower, pid 3098008
command line: ./build/RISCV/gem5.opt configs/example/se.py --cmd=./tests/test-progs/hello/src/hello.bare.riscv --cpu-type=TimingSimpleCPU --l1d_size=64kB --l1i_size=16kB

warn: The `get_runtime_isa` function is deprecated. Please migrate away from using this function.
warn: The `get_runtime_isa` function is deprecated. Please migrate away from using this function.
Global frequency set at 1000000000000 ticks per second
warn: No dot file generated. Please install pydot to generate the dot file and pdf.
build/RISCV/mem/dram_interface.cc:690: warn: DRAM device capacity (8192 Mbytes) does not match the address range assigned (512 Mbytes)
build/RISCV/arch/riscv/linux/se_workload.cc:60: warn: Unknown operating system; assuming Linux.
0: system.remote_gdb: listening for remote gdb on port 7000
**** REAL SIMULATION ****
build/RISCV/sim/simulate.cc:192: info: Entering event queue @ 0.  Starting simulation...
Hello world!
Exiting @ tick 171176000 because exiting with last active thread context

では、config.iniを使用してオプションが正しくシステムに伝わっているかを確認する。まずはconfig.ini”cache”で検索すると、キャッシュのオプションが存在しないことが分かる!

grep cache m5out/config.ini 
cache_line_size=64
dcache_port=system.membus.cpu_side_ports[2]
icache_port=system.membus.cpu_side_ports[1]
uncacheable=
cpu_side_ports=system.system_port system.cpu.icache_port system.cpu.dcache_port system.cpu.mmu.itb.walker.port system.cpu.mmu.dtb.walker.port

つまり、—caches オプションを追加する必要があるということだ。

./build/RISCV/gem5.opt configs/example/se.py \
    --cmd=./tests/test-progs/hello/src/hello.bare.riscv \
    --cpu-type=TimingSimpleCPU \
    --l1d_size=64kB --l1i_size=16kB --caches
[system.cpu.dcache]
type=Cache
children=power_state replacement_policy tags
addr_ranges=0:18446744073709551615
assoc=2
clk_domain=system.cpu_clk_domain
clusivity=mostly_incl
compressor=Null
data_latency=2
demand_mshr_reserve=1
eventq_index=0
is_read_only=false
max_miss_count=0
move_contractions=true
mshrs=4
power_model=
power_state=system.cpu.dcache.power_state
prefetch_on_access=false
prefetch_on_pf_hit=false
prefetcher=Null
replace_expansions=true
replacement_policy=system.cpu.dcache.replacement_policy
response_latency=2
sequential_access=false
size=65536
system=system
tag_latency=2
tags=system.cpu.dcache.tags
tgts_per_mshr=20
warmup_percentage=0
write_allocator=Null
write_buffers=8
writeback_clean=false
cpu_side=system.cpu.dcache_port
mem_side=system.membus.cpu_side_ports[2]

se.py と fs.py の共通オプション

  • -cpu-type=CPU_TYPE
    • 実行させるCPUのタイプ。このパラメータは常に設定すべき重要なものである。デフォルトはatomicであり、タイミングシミュレーションを行わない。
  • -sys-clock=SYS_CLOCK
    • システムが動作するクロック周波数を指定する。
  • -cpu-clock=CPU_CLOCK
    • CPUが動作するクロック周波数を指定する。これは上記のシステムクロックとは別個で設定できる。
  • -mem-type=MEM_TYPE
    • Type of memory to use. Options include different DDR memories, and the ruby memory controller.
    • 使用するメモリの種類を指定する。オプションでは異なるDDRメモリおよび異なるruby メモリコントローラを含んでいる。
  • -caches
    • クラシックなキャッシュを使用してシミュレーションを行う。
  • -l2cache
    • クラシックなキャッシュを使用する際、L2キャッシュを使用する。
  • -ruby
    • キャッシュシステムのシミュレーション時に、クラシックなキャッシュではなくRubyを使用する。
  • m TICKS, --abs-max-tick=TICKS
    • 実行するシミュレーションのクロック数を指定する。特定の時間のみシミュレーションしたいとき便利である。
  • I MAXINSTS, --maxinsts=MAXINSTS
    • シミュレーションする全体の命令数を指定する(デフォルト:無限)。特定の命令数のみ実行したいときに便利である。
  • c CMD, --cmd=CMD
    • syscallエミュレーションモードでのバイナリを指定する。
  • o OPTIONS, --options=OPTIONS
    • バイナリに渡すオプションを指定する。 全体の文字列に対して “ “で囲んで使用する。これはシミュレーションするコマンドに対してオプションを渡すために便利である。
  • -output=OUTPUT
    • stdoutをファイルにリダイレクトする。
  • -errout=ERROUT
    • stderrをファイルにリダイレクトする。

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com