Hello TLM
前言
目标
了解TLM程序的基本过程。TLM的英文全称是Transaction Level Modeling,中文翻译为事务级建模。它是在SystemC基础上的一个扩展库。
功能描述
模块A向模块B发送一个“Hello”字符串
任务拆解
- 创建模块A和B
- 连接模块A和B
- 模块A发送“Hello”到B
创建模块A和B
包含头文件systemc.h
#include "systemc.h"
模块A
class A : public sc_module {
public:
SC_HAS_PROCESS(A);
A(sc_module_name name) : sc_module(name) {
}
}
模块B
class B : public sc_module {
public:
SC_HAS_PROCESS(B);
B(sc_module_name name) : sc_module(name) {
}
}
连接模块A和B
任务拆解
- 添加TLM相关的头文件
- 模块A添加Initiator Socket
- 模块B添加Target Socket
- 连接模块A和B
添加TLM相关的头文件
#include "tlm.h"
#include "tlm_utils/simple_initiator_socket.h"
模块A添加Initiator Socket
public:
tlm_utils::simple_initiator_socket<A> socket;
模块B添加Target Socket
public:
tlm_utils::simple_target_socket<B> socket;
连接模块A和B
int
sc_main(int argc, char* argv[]) {
A a("A"); // 实例化模块A
B b("B"); // 实例化模块B a.socket(b.socket); // 连接模块A和B sc_start(10, SC_NS); // 仿真运行10纳秒 return 0;
}
模块A发送“Hello”到B
任务拆解
- 模块A发送“Hello”
- 模块B接收“Hello”
模块A发送“Hello”
在类A的构造方法中注册一个用来发送数据的方法hello
A(sc_module_name name) : sc_module(name) {
SC_THREAD(hello);
}
在类A中创建发送数据的方法hello
void hello() {
tlm::tlm_generic_payload *payload = new tlm::tlm_generic_payload();
assert(payload != nullptr);
const char *data{"Hello"};
payload->set_data_ptr((unsigned char *) data);
sc_time delay = SC_ZERO_TIME;
socket->b_transport(*payload, delay);
delete payload;
}
模块B接收“Hello”
在类B的构造方法中注册一个用来接收数据的方法hello
B(sc_module_name name) : sc_module(name) {
socket.register_b_transport(this, &B::hello);
}
在类B中创建接收数据的方法hello
void hello(tlm::tlm_generic_payload &payload, sc_core::sc_time &delay_time) {
const char *data = reinterpret_cast<const char *>(payload.get_data_ptr());
std::cout << data << std::endl;
}
附录
运行结果
SystemC 2.3.3-Accellera --- Sep 20 2019 16:02:02
Copyright (c) 1996-2018 by all Contributors,
ALL RIGHTS RESERVED
Hello Process finished with exit code 0
完整代码
#include "systemc.h"
#include "tlm.h"
#include "tlm_utils/simple_initiator_socket.h"
#include "tlm_utils/simple_target_socket.h" class A : public sc_module {
public:
SC_HAS_PROCESS(A); A(sc_module_name name) : sc_module(name) {
SC_THREAD(hello);
} public:
tlm_utils::simple_initiator_socket<A> socket; private:
void
hello() {
auto *payload = new tlm::tlm_generic_payload();
assert(payload != nullptr); const char *data{"Hello"};
payload->set_data_ptr((unsigned char *) data); sc_time delay = SC_ZERO_TIME; socket->b_transport(*payload, delay); delete payload;
}
}; class B : public sc_module {
public:
SC_HAS_PROCESS(B); B(sc_module_name name) : sc_module(name) {
socket.register_b_transport(this, &B::hello);
} public:
tlm_utils::simple_target_socket<B> socket; private:
void
hello(tlm::tlm_generic_payload &payload, sc_core::sc_time &delay_time) {
const char *data = reinterpret_cast<const char *>(payload.get_data_ptr());
std::cout << data << std::endl;
}
}; int
sc_main(int argc, char* argv[]) {
A a("A");
B b("B"); a.socket(b.socket); sc_start(10, SC_NS); return EXIT_SUCCESS;
}
参考资料
Hello TLM的更多相关文章
- uvm设计分析——tlm
tlm模块,用来在不同模块之间实现实时通信,主要基于两个定义在通信双方的port类来实现. 两个port之间,通过connect函数,来拿到双方的class指针,进而调用对方的function. 但是 ...
- verification TLM传输数据导致多线程访问同一个数据
TLM传输数据导致多线程访问同一个数据 原因 TLM发送数据跟mailbox类似,都是发送的引用,这样发送端和接收端的引用都指向同一个数据,这样就会出现发送端修改数据会影响到接收端,比如发送的时候数据 ...
- ListView初探
一.ListView介绍 在Android开发中ListView是比较常用的控件,常用于以列表的形式显示数据集及根据数据的长度自适应显示. ListView通常有两个主要功能点: (1)将数据集填充到 ...
- java web学习总结(二十八) -------------------JSP中的JavaBean
一.什么是JavaBean JavaBean是一个遵循特定写法的Java类,它通常具有如下特点: 这个Java类必须具有一个无参的构造函数 属性必须私有化. 私有化的属性必须通过public类型的方法 ...
- 【POJ2104】K-th Number
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABToAAAJ2CAIAAADwi6oDAAAgAElEQVR4nOy9a5Pj1nnvi0/Q71Llj3
- 开源地图SharpMap源码解析-(1)简介
1.简介 SharpMap最新版基于.NET Framework 4,采用C#开发的地图渲染引擎,非常易于使用.我这次研究的是比较稳定发布的V1.1版本.可以在GitHub下载该源码,地址:https ...
- OpenWebGlobe-开源三维GIS初体验(附源码和演示)
1.OpenWebGlobe简介 OpenWebGlobe是一个高性能的三维引擎.可应用于可视化仿真,游戏,三维GIS,虚拟现实等领域.它使用纯javascript编写,可以运行在任何支持HTML5. ...
- java web学习总结(二) -------------------TOMCAT使用帮助(一)
一.Tomcat服务器端口的配置 Tomcat的所有配置都放在conf文件夹之中,里面的server.xml文件是配置的核心文件. 如果想修改Tomcat服务器的启动端口,则可以在server.xml ...
- [Java入门笔记] Java语言基础(四):流程控制
流程控制指的是在程序运行的过程中控制程序运行走向的方式.主要分为以下几种: 顺序结构 顺序结构,顾名思义,是指程序从上往下逐步顺序执行.中间没有任何的判断和跳转. 分支结构 Java提供两种分支结构: ...
随机推荐
- 随笔1.流程控制--if
# 流程控制--if `-*- coding:utf-8 -*- #定义字符编码`## 1.判断条件if```python age = input("输入年龄:") #将交互式输入 ...
- 将unicode 转为字符串
public string chn(string source)// convert contents to GB2312 { return new Regex(@"\\u([0-9A-F] ...
- 烧录时发生:permission denied:'/dev/ttyUSB0'问题的解决
在执行make flash的过程中出现错误: 解决办法: sudo chmod -R 777 /dev/ttyUSB0 这种设置在下次使用的,又会出现这种问题,还要重新设置 永久性的设置可以使用下面这 ...
- 18FlaskRESTful
一,虚拟环境下安装(win) 在安装这个环节发现了很多问题,pycharm里装了之后发现根本引用不了,查明原因是因为第三方库pycharm无法识别. 解决办法:进入虚拟环境直接pip. 二,基本使用 ...
- rbd的image对象数与能写入文件数的关系
前言 收到一个问题如下: 一个300TB 的RBD,只有7800万的objects,如果存储小文件的话,感觉不够用 对于这个问题,我原来的理解是:对象默认设置的大小是4M一个,存储下去的数据,如果小于 ...
- SQL Server将查询出数据进行列转行操作
在日常的SQL Server数据查询时经常会遇到需要将数据列转换成行的操作,现将自己学习的列转行SQL语句举例如下: --首先查询语句 SELCT * FROM YXBAK..TBYJKSTEMP ...
- 【Kubernetes学习笔记】-服务访问之 IP & Port & Endpoint 辨析
目录 不同类型的IP Pod IP Cluster IP 不同类型的Port port nodePort TargetPort containerPort hostPort Endpoint Endp ...
- mybatis 解决属性名和字段名不一致
1. 数据库中表的设计 2. 实体类 3.mapper映射文件 4. 问题:密码没有获取到 原因:mybatis会根据查询的列名去进行设值 5. 解决列名和属性名不一致的方法 5.1 为列名指定别名, ...
- Linux标准输入、标准输出、错误输出
Linux中的输入文件.输出文件.错误输出 文件名称 文件描述符 标准输入 0 (默认是键盘) 标准输出 1 (默认是屏幕) 标准错误 2 (默认是屏幕) 输出重定向 Linux中&表示后台运 ...
- 学好Flex布局并不容易
1. Flex布局介绍 CSS的传统布局解决方案,基于盒状模型,依赖display属性.position属性.float属性,对于一些特殊的布局,例如垂直居中,往往要想很多hack的方法来解决. 20 ...