Hello TLM
2024-09-08 00:56:41
前言
目标
了解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;
}
参考资料
最新文章
- ubuntu 彻底卸载软件
- java多态实现原理
- oracle 常用视图和表
- springmvc(2)--参数绑定
- 让div变得大方美观 bootstrap
- iOS 10 升级后无法真机测试 Could not find Developer Disk Image
- windows消息常量值
- PHP基础示例:用PHP+Mysql编写简易新闻管理系统
- <;runtime>; 的 <;assemblyBinding>; 元素
- css样式实现字体删除线效果
- maven 添加自己的包
- 未能加载文件或程序集“DAL”或其他的某一个依赖项,系统找不到指定的文件
- POJ--1679--The Unique MST【推断MST是否唯一】
- AJAX封装(IE)
- 手机号读取城市数据库2018年3月excel版
- python自动化开发-[第一天]-练习题
- Zookeeper学习笔记4
- POJ1738 An old Stone Game
- CH5702 Count The Repetitions
- lambda 表达式拼接