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提供两种分支结构: ...
随机推荐
- java实现科研信息管理系统
一.前言 本学期学习了JAVA语言,在学期的结束,写一个有操作界面,与数据库关联的管理系统,用来巩固自己本学习所学的知识.用到的知识:JAVA基础,JAVA界面设计(GUI),Oracle数据库(需要 ...
- 日志切分神器--logrotate
Blog:博客园 个人 概述 还在自己写定时切分日志的脚本?试试系统自带的logrotate工具吧! logrotate是一个日志文件管理工具.用于分割日志文件,删除旧的日志文件,并创建新的日志文件, ...
- linux 信号 ctrl + d z c fg bg 作用
ctrl+c:前台进程终止 后台进程的终止: 方法一:通过jobs命令查看job号(假设为num),然后执行kill %num $ kill %1 方法二:通过ps命令查看job的进程号(PID, ...
- sql实现通过父级id查询所有的子集
通过sql实现传入父级id查询出所有的子集 最近刚好有个业务需要这样实现个功能,就是在点击查询列表详情的时候只会传入父级id,而详情得渲染出所有子集,那么做法有很多,可以直接通过代码递归查询去实现, ...
- 信息论-Turbo码学习
1.Turbo码: 信道编码的初期:分组码实现编码,缺点有二:只有当码字全部接收才可以开始译码,需要精确的帧同步时延大,增益损失多 解决方案:卷积码:充分利用前一时刻和后一时刻的码组,延时小,缺点:计 ...
- 03、JDBC范例
范例:JDBC查询 package com.hsp; import java.sql.Connection; import java.sql.DriverManager; import java.sq ...
- 画echart图时,安卓手机正常,苹果手机上tooltip 在坐标轴下一层
问题: 解决: 在tooltip 中添加如下代码: tooltip:{ position:function(point, params , dom, rect, size){ dom.style.tr ...
- bugku-PHP_encrypt_1(ISCCCTF)
前言 懒得写详细wp了.... 我佛了 这个题纠结好久......... 前言 需要解密的密文: fR4aHWwuFCYYVydFRxMqHhhCKBseH1dbFygrRxIWJ1UYFhotFjA ...
- sqlilab less11-less18
less-11 uname和passwd直接带入查询,万能密码 sqlmap自动搜索表单,或者抓包后用-r参数 less-12 post数据用小括号进行包裹,构造万能密码") or 1=1 ...
- FL Studio通道预设之采样预览
FL Studio采样预览栏在采样设置窗口的最底端,它能很好地显示 出载入采样的波形也可以将波形显示改为频谱显示.它里面显示出的是经过预处理效果栏处理后的波形或频谱图.我们在波形显示器下面还可以看到波 ...