前言

目标

了解TLM程序的基本过程。TLM的英文全称是Transaction Level Modeling,中文翻译为事务级建模。它是在SystemC基础上的一个扩展库。

功能描述

模块A向模块B发送一个“Hello”字符串

任务拆解

  1. 创建模块A和B
  2. 连接模块A和B
  3. 模块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

任务拆解

  1. 添加TLM相关的头文件
  2. 模块A添加Initiator Socket
  3. 模块B添加Target Socket
  4. 连接模块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

任务拆解

  1. 模块A发送“Hello”
  2. 模块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;
}

参考资料

https://www.doulos.com/knowhow/systemc/tlm2/tutorial__1/

最新文章

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

热门文章

  1. Frontpage 三种回车键
  2. hadoop之yarn(优化篇)
  3. 打包项目成war包并部署到服务器上,项目运行一直显示加载中
  4. 谈谈synchronized
  5. UNP——第三章,套接字编程介绍
  6. CVE-2017-11882利用
  7. Maximum execution time of 30 seconds exceeded in
  8. webug第三关:你看到了什么?
  9. windbg 分析cpu异常
  10. Network_01