前言

目标

了解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. java实现科研信息管理系统

    一.前言 本学期学习了JAVA语言,在学期的结束,写一个有操作界面,与数据库关联的管理系统,用来巩固自己本学习所学的知识.用到的知识:JAVA基础,JAVA界面设计(GUI),Oracle数据库(需要 ...

  2. 日志切分神器--logrotate

    Blog:博客园 个人 概述 还在自己写定时切分日志的脚本?试试系统自带的logrotate工具吧! logrotate是一个日志文件管理工具.用于分割日志文件,删除旧的日志文件,并创建新的日志文件, ...

  3. linux 信号 ctrl + d z c fg bg 作用

    ctrl+c:前台进程终止 后台进程的终止: 方法一:通过jobs命令查看job号(假设为num),然后执行kill %num   $ kill %1 方法二:通过ps命令查看job的进程号(PID, ...

  4. sql实现通过父级id查询所有的子集

    通过sql实现传入父级id查询出所有的子集 最近刚好有个业务需要这样实现个功能,就是在点击查询列表详情的时候只会传入父级id,而详情得渲染出所有子集,那么做法有很多,可以直接通过代码递归查询去实现, ...

  5. 信息论-Turbo码学习

    1.Turbo码: 信道编码的初期:分组码实现编码,缺点有二:只有当码字全部接收才可以开始译码,需要精确的帧同步时延大,增益损失多 解决方案:卷积码:充分利用前一时刻和后一时刻的码组,延时小,缺点:计 ...

  6. 03、JDBC范例

    范例:JDBC查询 package com.hsp; import java.sql.Connection; import java.sql.DriverManager; import java.sq ...

  7. 画echart图时,安卓手机正常,苹果手机上tooltip 在坐标轴下一层

    问题: 解决: 在tooltip 中添加如下代码: tooltip:{ position:function(point, params , dom, rect, size){ dom.style.tr ...

  8. bugku-PHP_encrypt_1(ISCCCTF)

    前言 懒得写详细wp了.... 我佛了 这个题纠结好久......... 前言 需要解密的密文: fR4aHWwuFCYYVydFRxMqHhhCKBseH1dbFygrRxIWJ1UYFhotFjA ...

  9. sqlilab less11-less18

    less-11 uname和passwd直接带入查询,万能密码 sqlmap自动搜索表单,或者抓包后用-r参数 less-12 post数据用小括号进行包裹,构造万能密码") or 1=1 ...

  10. FL Studio通道预设之采样预览

    FL Studio采样预览栏在采样设置窗口的最底端,它能很好地显示 出载入采样的波形也可以将波形显示改为频谱显示.它里面显示出的是经过预处理效果栏处理后的波形或频谱图.我们在波形显示器下面还可以看到波 ...