gem5学习(3):在gem5中创建简单的类Creating a very simple SimObject

目录

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

1、为SimObject创建一个新的python类

这个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++类进行交互,如调用该类的方法或访问其属性

2、使用C++部署SimObject

  • gem5 在 #ifndef 和 #endif 之间包装所有的头文件,名称为文件名和所在的目录【避免循环包含】

gem5学习(3):在gem5中创建简单的类Creating a very simple SimObject_第1张图片

  • 自己声明的类,它们的父类往往是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是一个参数对象的类型。

3、注册SimObject和C++文件

gem5使用scons作为构建系统,所以需要在我们创建的代码所在目录中创建一个SConscript文件,在这个文件里导入相关模块后,会自动定义一些函数。

如果想使新的SimObject能编译,就需要在SConscript文件中声明SimObject和.cc函数。

Import('*')

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

4、(Re)-build gem5

要编译和链接新文件,只需要重新编译gem5即可。

在gem5根目录中执行编译指令

scons build/X86/gem5.debug

【note】gem5支持增量构建,如果只有SimObject类相关的文件发生了更改,那么只有这些文件会被重新编译和链接。

5、创建新的SimObject的配置脚本config scripts

实现了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,用来实例化对象。

6、测试

build/X86/gem5.debug src/learning_gem5/part2/test_object.py

gem5学习(3):在gem5中创建简单的类Creating a very simple SimObject_第2张图片

其他:gem5.opt和gem5.debug的区别

  1. gem5.opt 是一个优化过的构建版本。它经过编译器的优化,旨在提供更高的模拟性能和执行速度。这个版本适合于正式的模拟运行和性能测试。通常情况下,大多数用户在生产环境中选择使用 gem5.opt
  2. gem5.debug 是一个调试版本的构建。它没有经过编译器的优化,并包含了额外的调试信息和断言,以帮助开发人员进行调试和故障排除。这个版本适合于开发和调试过程中使用,可以提供更详细和全面的调试信息,但可能会牺牲一些性能。

所以在前期调试阶段,可以直接生成gem5.debug。

如果后续比较熟悉且希望提高执行速度的话,再使用gem5.opt。

你可能感兴趣的:(gem5学习,学习)