目录
1、为SimObject创建一个新的python类
2、使用C++部署SimObject
3、注册SimObject和C++文件
4、(Re)-build gem5
5、创建新的SimObject的配置脚本config scripts
6、测试
其他:gem5.opt和gem5.debug的区别
官网教程:
gem5: Creating a very simple SimObject
这个python类主要是描述可以从python配置文件中控制的SimObject参数。
cxx_header
是包含作为类型(type)参数的类声明的文件,约定是使用 SimObject 的名称,并将其全小写和使用下划线,可以指定任何头文件。cxx_class
是一个属性,用于指定新创建的 SimObject 是在 gem5 命名空间中声明的。【大多数 gem5 代码库中的 SimObject 都是在 gem5 命名空间内声明的】#**HelloObject.py文件**
from m5.params import
from m5.SimObject import SimObject
class HelloObject(SimObject): //定义了一个名为HelloObject的类,并指定它是SimObject类的子类,表示可以继承SimObject类的属性和方法
type='HelloObject' //定义了一个名为type的类变量,并将其设置为字符串'HelloObject'
cxx_header="learning_gem5/part2/hello_object.hh" //定义了一个名为cxx_header的类变量,用来指定头文件路径
cxx_class="gem5::HelloObject" //定义了一个名为cxx_class的类变量,指定C++类的名称。可以将python代码与相应的C++类进行交互,如调用该类的方法或访问其属性
gem5 在 #ifndef
和 #endif
之间包装所有的头文件,名称为文件名和所在的目录【避免循环包含】
自己声明的类,它们的父类往往是SimObject的子类【一般不是SimObject本身】
SimObject类中指定了许多虚函数【非纯虚函数】,在简单情况下,除了构造函数,不需要实现任何函数。
所有 SimObjects 的构造函数都假设它需要一个参数对象,这个参数类型名称根据对象名称自动生成。例如HelloObject类,参数类型名称为HelloObjectParams。
**#.hh文件**
#ifndef __LEARNING_GEM5_HELLO_OBJECT_HH__
#define __LEARNING_GEM5_HELLO_OBJECT_HH__
#include "params/HelloObject.hh"
#include "sim/sim_object.hh"
namespace gem5
{
class HelloObject : public SimObject
{
public:
HelloObject(const HelloObjectParams &p);
};
} // namespace gem5
#endif // __LEARNING_GEM5_HELLO_OBJECT_HH__
【note】:
如果SimObject的构造函数遵循Foo(const FooParams &)格式,那么自动定义FooParams::create()
方法,作用是调用SimObject的构造函数并返回SimObject的一个实例。
Foo(const FooParams &)是一个构造函数的签名,其中Foo是类的名称,FooParams是一个参数对象的类型。
gem5使用scons作为构建系统,所以需要在我们创建的代码所在目录中创建一个SConscript文件,在这个文件里导入相关模块后,会自动定义一些函数。
如果想使新的SimObject能编译,就需要在SConscript文件中声明SimObject和.cc函数。
Import('*')
SimObject('HelloObject.py', sim_objects=['HelloObject'])
Source('hello_object.cc')
要编译和链接新文件,只需要重新编译gem5即可。
在gem5根目录中执行编译指令
scons build/X86/gem5.debug
【note】gem5支持增量构建,如果只有SimObject类相关的文件发生了更改,那么只有这些文件会被重新编译和链接。
实现了SimObject后,编译到gem5中,在.cc文件所在的文件夹中创建一个python文件run.py,用来实例化对象。
# 导入m5和需要的objects
import m5
from m5.objects import *
# 设置 Root 对象
root = Root(full_system=False)
# 添加并配置您的 SimObject
root.test=TestObject()
# 实例化一个 gem5 模拟对象
m5.instantiate()
# 启动模拟
print("Running the simulation...")
exit_event = m5.simulate()
# 模拟结束后的清理工作
print('Exiting @ tick {} because {}'.format(m5.curTick(),exit_event.getCause()))
其实在创建完成python文件后,有说需要重新编译gem5.debug,但是我在修改后并没有rebuild,也能直接输出。
实现了SimObject后,编译到gem5中,在.cc文件所在的文件夹中创建一个python文件run.py,用来实例化对象。
build/X86/gem5.debug src/learning_gem5/part2/test_object.py
gem5.opt
是一个优化过的构建版本。它经过编译器的优化,旨在提供更高的模拟性能和执行速度。这个版本适合于正式的模拟运行和性能测试。通常情况下,大多数用户在生产环境中选择使用 gem5.opt
。gem5.debug
是一个调试版本的构建。它没有经过编译器的优化,并包含了额外的调试信息和断言,以帮助开发人员进行调试和故障排除。这个版本适合于开发和调试过程中使用,可以提供更详细和全面的调试信息,但可能会牺牲一些性能。所以在前期调试阶段,可以直接生成gem5.debug。
如果后续比较熟悉且希望提高执行速度的话,再使用gem5.opt。