FPGA開発日記

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

Gem5のチュートリアル "Learning Gem5"をやってみる(8. SimObject作成チュートリアルをやってみる2)

gem5を構成するSimObjectを追加するためのチュートリアルをやってみる。

www.gem5.org

Step.3 SimObject と C++ ファイルの登録

C++ ファイルをコンパイルし、Python ファイルを解析するためには、ビルドシステムにこれらのファイルについて知らせる必要がある。gem5はビルドシステムとしてSConsを使用するので、SimObjectのコードがあるディレクトリにSConscriptファイルを作成するだけです。そのディレクトリにすでにSConscriptファイルがある場合は、そのファイルに以下の宣言を追加するだけでよい。

このファイルは単に通常のPythonファイルなので、このファイルに好きなPythonコードを書くことができる。gem5はこれを利用してSimObjects用のコードを自動的に作成し、SLICCやISA言語のようなドメイン固有言語をコンパイルする。

SConscriptファイルには、インポート後に自動的に定義される関数がいくつかある。新しいSimObjectをコンパイルするためには、src/learning_gem5/part2ディレクトリに "SConscript "という名前で新しいファイルを作成する必要がある。このファイルでSimObjectと.ccファイルを宣言する。以下は必要なコードである。

# src/learning_gem5/part2/SConscript

Import('*')

SimObject('HelloObject.py', sim_objects=['HelloObject'])
Source('hello_object.cc')

Step 4. gem5の(再)ビルド

新しいファイルをコンパイルしてリンクするには、gem5を再コンパイルする必要がある。以下の例では x86 ISA を使っていると仮定しているが、このオブジェクトには ISA を必要とするものはないので、gem5 のどの ISA でも動作する。

$ scons build/RISCV/gem5.opt

Step 5: 新しいSimObjectを使用するための設定スクリプトを作成する

SimObjectを実装し、gem5にコンパイルしたので、オブジェクトをインスタンス化するためにconfigs/learning_gem5/part2Python設定ファイルrun_hello.pyを作成または修正する必要がある。このオブジェクトはとてもシンプルなので、システムオブジェクトは必要ない!CPUもキャッシュも何も必要ない。すべてのgem5インスタンスはRootオブジェクトを必要とする。

非常にシンプルなコンフィギュレーションスクリプトを作成する手順を説明すると、まず、m5とコンパイルしたすべてのオブジェクトをインポートする。

# configs/learning_gem5/part2/run_hello.py

import m5
from m5.objects import * 

次に、すべてのgem5インスタンスに必要なRootオブジェクトをインスタンス化する。

# configs/learning_gem5/part2/run_hello.py

root = Root(full_system = False)

これで、作成したHelloObjectをインスタンス化できる。あとはPythonの「コンストラクタ」を呼び出すだけだ。後ほど、Pythonのコンストラクタでパラメータを指定する方法について説明する。オブジェクトのインスタンスを作成することに加えて、そのオブジェクトがルートオブジェクトの子であることを確認する必要がある。C++では、ルートオブジェクトの子であるSimObjectのみがインスタンス化される。

# configs/learning_gem5/part2/run_hello.py

root.hello = HelloObject()

最後に、m5モジュールのinstantiateを呼び出して、シミュレーションを実行する!

# configs/learning_gem5/part2/run_hello.py

m5.instantiate()
print("Beginning simulation!") 
exit_event = m5.simulate() 
print('Exiting @ tick {} because {}' 
        .format(m5.curTick(), exit_event.getCause()))

src/ディレクトリのファイルを変更した後は、gem5をリビルドすることを忘れないこと。設定ファイルを実行するコマンドラインは、以下の出力の'command line:'の後にある。出力は以下のようになるはずだ:

Note: goodbye_objectのコードがsrc/learning_gem5/part2ディレクトリにある場合、run_hello.pyはエラーを起こす。これらのファイルを削除するか、gem5ディレクトリの外に移動すると、run_hello.pyは以下のように出力する。

     gem5 Simulator System.  http://gem5.org
    gem5 is copyrighted software; use the --copyright option for details.

    gem5 compiled May  4 2016 11:37:41
    gem5 started May  4 2016 11:44:28
    gem5 executing on mustardseed.cs.wisc.edu, pid 22480
    command line: build/X86/gem5.opt configs/learning_gem5/part2/run_hello.py
                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ <-- これが実行コマンド

    Global frequency set at 1000000000000 ticks per second
    Hello World! From a SimObject!
    Beginning simulation!
    info: Entering event queue @ 0.  Starting simulation...
    Exiting @ tick 18446744073709551615 because simulate() limit reached

自分もやってみた。

$ ./build/RISCV/gem5.opt configs/learning_gem5/part2/run_hello.py 
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 28 2023 22:34:46
gem5 started Jun 28 2023 22:40:25
gem5 executing on kimura-tower, pid 39801
command line: ./build/RISCV/gem5.opt configs/learning_gem5/part2/run_hello.py

Global frequency set at 1000000000000 ticks per second
warn: No dot file generated. Please install pydot to generate the dot file and pdf.
Hello World! From a SimObject!
Beginning simulation!
build/RISCV/sim/simulate.cc:192: info: Entering event queue @ 0.  Starting simulation...
Exiting @ tick 18446744073709551615 because simulate() limit reached

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com