gem5 使用记录,对例子中helloobject的理解
gem5中有一个 hello的例子,不是hello world那个,在src/learning-gem5/part2里面,这是虽然是个简单的例子但包含的要素挺多挺全。
整个结构是src下面有一个hello_object和goodbye_object这两个源码,前者会调用后者,同时还有有相应的python文件,这些是一一对应的。每个C++都对应一个PY文件。
PY文件可以理解对C++这个类的描述,例子中把hello_object goodbye_object两个C++写到一个PY里去了,这样也行,同样的目录下还有scons这个文件,这是编译时通过他去找哪些需要编译,里面就是把写的前面的文件加进去其实。
另外在config里面就是仿真启动,相当于是主程序的入口。也是py文件。
下面是C++配套的PY文件代码
1 from m5.params import *
2 from m5.SimObject import SimObject
3
4 class HelloObject(SimObject):
5 type = 'HelloObject'
6 cxx_header = "learning_gem5/part2/hello_object.hh"
7 cxx_class = 'gem5::HelloObject'
8
9 time_to_wait = Param.Latency("Time before firing the event")
10 number_of_fires = Param.Int(1, "Number of times to fire the event before "
11 "goodbye")
12
13 goodbye_object = Param.GoodbyeObject("A goodbye object")
14
15 class GoodbyeObject(SimObject):
16 type = 'GoodbyeObject'
17 cxx_header = "learning_gem5/part2/goodbye_object.hh"
18 cxx_class = 'gem5::GoodbyeObject'
19
20 buffer_size = Param.MemorySize('1kB',
21 "Size of buffer to fill with goodbye")
22 write_bandwidth = Param.MemoryBandwidth('100MB/s', "Bandwidth to fill "
23 "the buffer")
来理解一下这些代码,gem5有很多现有的类我们会用到, gem5所有的类都要继承自simobject这是固定的,而每个simobject都有一个params 的参数,所以开始把params和simobject导入进来。
然后是声明hello的类,继承simobject,里面是类的说明,名字,路径之类的,然后是参数第9行开始,左边是C++中的参数名字右边是他的类型,这些类型是来自第一行导入的params这些文件中已经定义好的了,比如去把parama找到打开能找到对于Latency的定义。
13行是我们要调用的子类,大型设计会有很多小类,最后在顶层把它们整合起来,这里的HELLO相当于顶层,GOODBYE相当于子功能模块,我们要把他加到主模块里来。
后面是对GOODBYE这个类的描述都差不多。
然后再理解下C++文件,
1 HelloObject::HelloObject(const HelloObjectParams ¶ms) :
2 SimObject(params),
3 // This is a C++ lambda. When the event is triggered, it will call the
4 // processEvent() function. (this must be captured)
5 event([this]{ processEvent(); }, name() + ".event"),
6 goodbye(params.goodbye_object),
7 // Note: This is not needed as you can *always* reference this->name()
8 myName(params.name),
9 latency(params.time_to_wait),
10 timesLeft(params.number_of_fires)
11 {
12 DPRINTF(HelloExample, "Created the hello object\n");
13 panic_if(!goodbye, "HelloObject must have a non-null GoodbyeObject");
14 }
这个是HELLO的构造函数,他有一个params的参数需要传进来,来源于上面的文字有说过,然后传给simobject,5行是事件的加入,这个是GEM5的机制,因为我们要模拟数字电路的工作方式,这里相当于是把要做的事加到event里面,然后拿去在某个时间执行一次,再间隔时间再执行一次这样就相当于时钟一样, 后面是GOODBYE的传参,MYname后面直接用了name这个变量,但是没有声明或者传递啥的,研究了下,是因为前面有个name()这个函数是返回例化名字的,前面用了这个函数会返回一个name变量,所以后面可以直接用,如果前面也直接用name的话就会报错。再后面是参数传递,花括号里面是构造函数要做的事情。
1 void
2 HelloObject::startup()
3 {
5 // Before simulation starts, we need to schedule the event
6 schedule(event, latency);
7 }
8
9 void
10 HelloObject::processEvent()
11 {
13 timesLeft--;
14 DPRINTF(HelloExample, "Hello world! Processing the event! %d left\n",
15 timesLeft);
16
17 if (timesLeft <= 0) {
18 DPRINTF(HelloExample, "Done firing!\n");
19 goodbye->sayGoodbye(myName);
20 } else {
21 schedule(event, curTick() + latency);
22 }
23 }
上面第一个函数是startup可以看到没有其他哪里在调用它,这好像也是gem5本身的在开始仿真前会自动调用的一个函数,暂时不研究怎么调的了,里面的内容是一个安排事件的函数,这个函数也是gem5里面的实现时钟模拟的函数,之前event是把事件封起来,这里就是真正决定他好久执行了,第二个参数就是等这么久之后就执行event,而event里面又包了我们的普通函数process,这样整个类就运行起来了。
每二个函数就是普通的函数,他被封在了event里面,同时里面也有调用子类GOODBYE的功能,也有再次安排事件的调用。这样就可以实现时钟工作模式。
下面是config/learning/part2里面的。
1 # set up the root SimObject and start the simulation
2 root = Root(full_system = False)
3
4 # Create an instantiation of the simobject you created
5 root.hello = HelloObject(time_to_wait = '2us', number_of_fires = 5)
6 root.hello.goodbye_object = GoodbyeObject(buffer_size='100B')
7
8 # instantiate all of the objects we've created above
9 m5.instantiate()
10
11 print("Beginning simulation!")
12 exit_event = m5.simulate()
13 print('Exiting @ tick %i because %s' % (m5.curTick(), exit_event.getCause()))
这其实就是主程序的入口相当于,第2行是格式要求吧理解为,每个仿真都有个最顶层的类就是root,后面参数是表示是不是全系统模拟,我们这当然不是。第5行是在root下再例化一个之前我们写的类,并把我们想要的参数传进去。这样程序就真正的完整了,可以用了,第9行是初始化上面的东西,再后面就是开始跑起来了,都是较固定。不再细说。
gem5 使用记录,对例子中helloobject的理解的更多相关文章
- [Spark][Python]DataFrame中取出有限个记录的例子
[Spark][Python]DataFrame中取出有限个记录的例子: sqlContext = HiveContext(sc) peopleDF = sqlContext.read.json(&q ...
- 记录Python学习中的几个小问题
记录Python学习中的几个小问题,和C#\JAVA的习惯都不太一样. 1.Django模板中比较两个值是否相等 错误的做法 <option value="{{group.id}}&q ...
- 也用 Log4Net 之将自定义属性记录到文件中 (三)
也用 Log4Net 之将自定义属性记录到文件中 (三) 即解决了将自定义属性记录到数据库之后.一个新的想法冒了出来,自定义属性同样也能记录到文件中吗?答案是肯定的,因为Log4Net既然已经考虑 ...
- 记录下项目中常用到的JavaScript/JQuery代码二(大量实例)
记录下项目中常用到的JavaScript/JQuery代码一(大量实例) 1.input输入框监听变化 <input type="text" style="widt ...
- (4.7)怎么捕获和记录SQL Server中发生的死锁?
转自:https://blog.csdn.net/c_enhui/article/details/19498327 怎么捕获和记录SQL Server中发生的死锁? 关键词:死锁记录,死锁捕获 sql ...
- 微信小程序开发入门教程(二)---分析官方云开发例子中的一些功能
接上一篇文章:https://www.cnblogs.com/pu369/p/11326538.html 1.官方云开发的例子中,点击获取 openid,对应代码在E:\wxDEV\helloyun\ ...
- Log4Net 之将自定义属性记录到文件中 (三)
原文:Log4Net 之将自定义属性记录到文件中 (三) 即解决了将自定义属性记录到数据库之后.一个新的想法冒了出来,自定义属性同样也能记录到文件中吗?答案是肯定的,因为Log4Net既然已经考虑到了 ...
- 怎么启用apache的mod_log_sql模块将所有的访问信息直接记录在mysql中
怎么启用apache的mod_log_sql模块将所有的访问信息直接记录在mysql中
- 记录对依赖注入的小小理解和autofac的简单封装
首先,我不是一个开发者,只是业余学习者.其次我的文化水平很低,写这个主要是记录一下当前对于这块的理解,因为对于一个低水平 的业余学习者来说,忘记是很平常的事,因为接触.应用的少,现在理解,可能过段时间 ...
随机推荐
- shell 同时执行多任务下载视频
本文为博主原创,转载请注明出处: shell 脚本不支持多线程,但我们需要用shell 脚本同时跑多个任务时怎么让这些任务并发同时进行,可以采用在每个任务 后面 添加一个 & ,让其在后台运 ...
- 零基础学Java(1)初识Java程序
前言 就国内来说,Java毫无疑问是后端语言中的No.1没有之一,所以今天我们也来0基础学习Java!!! Java的好处(针对测试工程师) 面试加分->涨薪 大多数公司服务端用的都是Java, ...
- python测试开发django-197.django-celery-beat 定时任务
前言 django-celery-beat 可以支持定时任务,把定时任务写到数据库. 接着前面这篇写python测试开发django-196.python3.8+django2+celery5.2.7 ...
- while and do while
package study5ran2yl.study; public class deno14 { public static void main(String[] args) { //计算1+2+. ...
- SQLZOO练习三--SELECT within SELECT Tutorial
This tutorial looks at how we can use SELECT statements within SELECT statements to perform more com ...
- 全网最新的nacos 2.1.0集群多节点部署教程
原文链接:全网最新的nacos 2.1.0集群多节点部署教程-语雀 基本信息 进度整理中 版本 2.1.0 版本发布日期 2022-04-29 git revision number b5845313 ...
- Modbus转OPC
在这里给大家介绍一种低成本的将Modbus RTU协议的串口设备接入到OPC UA的服务器呢? OPC全称是OLE(Object Linking and Embedding) for Process ...
- mysql grant命令
增删改查的权限grant select on testdb.* to common_user@'%' grant insert on testdb.* to common_user@'%' grant ...
- 【PMP学习笔记】第4章 项目整合管理
[PMP学习笔记]第4章 项目整合管理 一.项目整合管理 什么是项目整合管理? 项目整合管理由项目经理负责.虽然其他知识领域可以由相关专家(如成本分析专家.进度规划专家.风险管理专家)管理,但是项目整 ...
- Frida使用文档(一)安装、启动、运行、关闭
本文所有教程及源码.软件仅为技术研究.不涉及计算机信息系统功能的删除.修改.增加.干扰,更不会影响计算机信息系统的正常运行.不得将代码用于非法用途,如侵立删!企鹅:1033383881 Frida使用 ...