前言

目标

了解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/

Hello TLM的更多相关文章

  1. uvm设计分析——tlm

    tlm模块,用来在不同模块之间实现实时通信,主要基于两个定义在通信双方的port类来实现. 两个port之间,通过connect函数,来拿到双方的class指针,进而调用对方的function. 但是 ...

  2. verification TLM传输数据导致多线程访问同一个数据

    TLM传输数据导致多线程访问同一个数据 原因 TLM发送数据跟mailbox类似,都是发送的引用,这样发送端和接收端的引用都指向同一个数据,这样就会出现发送端修改数据会影响到接收端,比如发送的时候数据 ...

  3. ListView初探

    一.ListView介绍 在Android开发中ListView是比较常用的控件,常用于以列表的形式显示数据集及根据数据的长度自适应显示. ListView通常有两个主要功能点: (1)将数据集填充到 ...

  4. java web学习总结(二十八) -------------------JSP中的JavaBean

    一.什么是JavaBean JavaBean是一个遵循特定写法的Java类,它通常具有如下特点: 这个Java类必须具有一个无参的构造函数 属性必须私有化. 私有化的属性必须通过public类型的方法 ...

  5. 【POJ2104】K-th Number

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABToAAAJ2CAIAAADwi6oDAAAgAElEQVR4nOy9a5Pj1nnvi0/Q71Llj3

  6. 开源地图SharpMap源码解析-(1)简介

    1.简介 SharpMap最新版基于.NET Framework 4,采用C#开发的地图渲染引擎,非常易于使用.我这次研究的是比较稳定发布的V1.1版本.可以在GitHub下载该源码,地址:https ...

  7. OpenWebGlobe-开源三维GIS初体验(附源码和演示)

    1.OpenWebGlobe简介 OpenWebGlobe是一个高性能的三维引擎.可应用于可视化仿真,游戏,三维GIS,虚拟现实等领域.它使用纯javascript编写,可以运行在任何支持HTML5. ...

  8. java web学习总结(二) -------------------TOMCAT使用帮助(一)

    一.Tomcat服务器端口的配置 Tomcat的所有配置都放在conf文件夹之中,里面的server.xml文件是配置的核心文件. 如果想修改Tomcat服务器的启动端口,则可以在server.xml ...

  9. [Java入门笔记] Java语言基础(四):流程控制

    流程控制指的是在程序运行的过程中控制程序运行走向的方式.主要分为以下几种: 顺序结构 顺序结构,顾名思义,是指程序从上往下逐步顺序执行.中间没有任何的判断和跳转. 分支结构 Java提供两种分支结构: ...

随机推荐

  1. Android Activity启动黑/白屏原因与解决方式

    Android Activity启动黑/白屏原因与解决方式 我们新建一个HelloWorld项目,运行在手机上时,Activity打开之前会有一个动画,而这个动画里是全白或者全黑的(取决于你的主题是亮 ...

  2. 11content_processor

    1,content_processor 上下文处理器应该返回一个字典,字典中的key会被模板中当成变量来渲染 上下文处理器返回的字典,在所有页面中都是可以使用的 被这个装饰器修饰的钩子函数,必须要返回 ...

  3. Oracle guide_Spring2.5_CN_reference_pdf

    http://www.oracle.com/pls/db112/homepage spring_CN.rar (3.1 MB) 下载次数: 2

  4. Socket accept 简要分析

    accept 用于从指定套接字的连接队列中取出第一个连接,并返回一个新的套接字用于与客户端进行通信,示例代码如下 #include <sys/types.h> /* See NOTES * ...

  5. c++中的几种函数调用约定(转)

    C++中的函数调用约定(调用惯例)主要针对三个问题: 1.参数传递的方式(是否采用寄存器传递参数.采用哪个寄存器传递参数.参数压桟的顺序等): 参数的传递方式,最常见的是通过栈传递.函数的调用方将参数 ...

  6. idea开发工具下,进行多个线程切换调试

  7. solr 笔记

    1.sorl其实是对存储的内容,根据相应的域和域的类型先分词,停顿,过滤(大小写转换)等等;然后建立多级索引.对搜索条件也是根据相应的域和域的类型进行分词,停顿,同义词,过滤(大小写转换)等等;然后建 ...

  8. 查看ceph集群被哪些客户端连接

    前言 我们在使用集群的时候,一般来说比较关注的是后台的集群的状态,但是在做一些更人性化的管理功能的时候,就需要考虑到更多的细节 本篇就是其中的一个点,查询ceph被哪些客户端连接了 实践 从接口上来说 ...

  9. mysql多表查询之子语句查询

    1.子语句查询 1.1子语句查询出来的结果集作为临时表名使用 select * from (select * from person) as aaa; -- as这个起别名关键字是可以省略的 1.2查 ...

  10. js-根据日期获取本年所有周日

    /** * 方法 描述 Date() 返回当日的日期和时间. getDate() 从 Date 对象返回一个月中的某一天 (1 ~ 31). getDay() 从 Date 对象返回一周中的某一天 ( ...