9、tlm 事务交互通信

news2025/4/3 2:55:00

1、TLM(Transaction-Level Modeling) 是 SystemC 的高级建模方法,用于描述系统的通信行为,特别是在硬件设计和验证中。TLM 是 SystemC 的一部分,用于提高仿真的效率和抽象性。以下是 TLM 的核心知识以及关键概念。
2、 TLM通信模型
TLM 定义了一种通过事务(Transaction)交换信息的通信方式,事务通常是对数据块的抽象。TLM 主要支持以下两种通信模型:

TLM-1: 以功能建模为主,使用函数调用(如 write() 和 read())来传递数据。
TLM-2.0: 支持更高级别的通信,包含阻塞和非阻塞接口,广泛用于存储器建模和片上网络(NoC)的开发
3、事务(Transaction)
定义: TLM的基本单位,是对数据或控制信息的一种抽象表示。
表示方式: 通常用 tlm::tlm_generic_payload 来表示。

tlm_generic_payload的主要字段:
Command: 表示读或写操作;
Address: 目标地址;
Data Pointer: 指向数据的指针;
Data Length: 数据长度;
Byte Enable: 表示哪些字节是有效的;
Stream Width: 流数据的步长;
Response Status: 表示事务执行结果。

例如:
#include <tlm.h>

tlm::tlm_generic_payload payload;
payload.set_command(tlm::TLM_WRITE_COMMAND);
payload.set_address(0x1000);
payload.set_data_length(4);

4、 TLM通信接口
TLM定义了两种通信接口:

阻塞接口(Blocking Interface):
使用函数调用,完成后返回;
常用函数:b_transport()。

非阻塞接口(Non-blocking Interface):
分两个阶段完成通信(请求和响应)。
常用的函数:nb_transport_fw()和nb_transport_bw()。
tlm::tlm_generic_payload trans;
sc_time delay = SC_ZERO_TIME;

// 阻塞传输示例
initiator_socket->b_transport(trans, delay);


5、 TLM通信方向
**Forward Path(前向路径):**发起方向目标方发送请求。
**Backward Path(后向路径):**目标方向发起方发送响应。
6、 TLM延时模型
TLM支持对延时的建模:

时间精确建模:在事务中记录通信的延时。
零延时模型:忽略通信延时,只模拟功能行为。
延时通过sc_time传递。
sc_time delay = sc_time(10, SC_NS); // 延时10ns
initiator_socket->b_transport(trans, delay);

7、Socket
TLM-2.0 使用 Socket 来连接模块,常用的 Socket 有:

tlm::tlm_initiator_socket<>: 发起事务的模块(Initiator)。
tlm::tlm_target_socket<>: 接收事务的模块(Target)。
tlm::tlm_initiator_socket<> initiator_socket;
tlm::tlm_target_socket<> target_socket;

8、 事务流程
阻塞传输(b_transport)

发起方调用目标方的 b_transport() 函数。
适合简单、时间无关的模型。

非阻塞传输 (nb_transport)
分为前向和后向路径,适合更复杂的系统。
使用状态机进行阶段管理。
tlm::tlm_sync_enum nb_transport_fw(tlm::tlm_generic_payload& trans, 
                                   tlm::tlm_phase& phase, 
                                   sc_time& delay) {
    // 实现前向路径逻辑
}
9、 通信阶段(Phase)
TLM-2.0 使用 tlm::tlm_phase 枚举定义不同的事务阶段,例如:V

tlm::BEGIN_REQ: 请求开始。
tlm::END_REQ: 请求结束。
tlm::BEGIN_RESP: 响应开始。
tlm::END_RESP: 响应结束。

10、完整示例
Initiator 模块

#include <tlm.h>
#include <systemc>
#include <iostream>

struct Initiator : sc_core::sc_module {
    tlm::tlm_initiator_socket<> socket;  //tlm::tlm_initiator_socket<> 尖括号为空时,会使用默认的模板参数 tlm::tlm_base_protocol_typestlm::tlm_base_protocol_types 是一个预定义的结构体,它定义了标准的 TLM 协议类型,涵盖了通用事务有效负载 tlm::tlm_generic_payload 以及同步接口类型

    SC_CTOR(Initiator) {
        SC_THREAD(process);
    }

    void process() {
        tlm::tlm_generic_payload trans;
        sc_time delay = SC_ZERO_TIME;

        trans.set_command(tlm::TLM_WRITE_COMMAND);
        trans.set_address(0x1000);
        uint32_t data = 42;
        trans.set_data_ptr(reinterpret_cast<unsigned char*>(&data));
        trans.set_data_length(4);

        socket->b_transport(trans, delay);

        if (trans.get_response_status() == tlm::TLM_OK_RESPONSE) {
            std::cout << "Transaction successful" << std::endl;
        }
    }
};


Target 模块

#include <tlm.h>
#include <systemc>
#include <iostream>

struct Target : sc_core::sc_module {
    tlm::tlm_target_socket<> socket;

    SC_CTOR(Target) {
        socket.register_b_transport(this, &Target::b_transport);
    }

    void b_transport(tlm::tlm_generic_payload& trans, sc_time& delay) {
        std::cout << "Transaction received at address: " << trans.get_address() << std::endl;
        trans.set_response_status(tlm::TLM_OK_RESPONSE);
    }
};
顶层模块

#include <systemc>
#include "Initiator.h"
#include "Target.h"

int sc_main(int argc, char* argv[]) {
    Initiator initiator("Initiator");
    Target target("Target");

    initiator.socket.bind(target.socket);

    sc_start();
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2326196.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微软 GraphRAG 项目学习总结

微软2024年4月份发布了一篇《From Local to Global: A GraphRAG Approach to Query-Focused Summarization》&#xff08;GraphRAG&#xff1a;从局部到全局的查询式摘要方法&#xff09;论文&#xff0c;提出了一种名为GraphRAG的检索增强生成&#xff08;RAG&#xff09;方法…

C# dataGridView 自动生成几行几列及手动输入整型字符

C# dataGridView生成12号4列的表格 private void Form1_Load(object sender, EventArgs e) {// 清除默认列dataGridView1.Columns.Clear();// 添加4列&#xff08;首列为序号列&#xff09;dataGridView1.Columns.Add("ColIndex", "序号");dataGridView1.…

Day17 -实例:利用不同语言不同框架的特征 进行识别

前置&#xff1a;我们所需的web站点&#xff0c;都可以利用fofa去搜索&#xff0c;例如&#xff1a;app"flask"这样的语句去找对应的站点&#xff0c;找到后&#xff0c;我们模拟不知道是什么框架&#xff0c;再根据特征去判断它的框架。 ***利用工具可以再去结合大…

Pycharm(八):字符串切片

一、字符串分片介绍 对操作的对象截取其中一部分的操作&#xff0c;比如想要获取字符串“888666qq.com前面的qq号的时候就可以用切片。 字符串、列表、元组都支持切片操作。 语法&#xff1a;字符串变量名 [起始:结束:步长] 口诀&#xff1a;切片其实很简单&#xff0c;只顾头来…

Mysql从入门到精通day5————子查询精讲

本文主要讲述子查询的几种方法&#xff0c;读者注意体会它们的不同场合的适用情况及功能&#xff0c;本篇文章也融入了小编实践过程遇到的坑&#xff0c;希望读者不要再踩坑 一.带IN关键字的子查询 in关键字可以检测结果集中是否存在某个特定的值&#xff0c;检测成功则执行外…

虫洞数观系列二 | Python+MySQL高效封装:为pandas数据分析铺路

目录 系列文章 1. 引言 2. 常规写法mysql 3. 封装设计接口mysql 3.1dbname.py文件 3.1.1. 导入和基类定义 3.1.2. 具体表定义类 3.1.3. 表定义整合函数 3.1.4. 全局字典和测试代码 3.2mysql_dao文件 3.2.1. 模块导入与配置 3.2.2. 数据库连接池初始化 3.2.3. Comm…

MySQl之Binlog

前言 Binlog&#xff08;Binary Log&#xff09;是MySQL中至关重要的日志模块&#xff0c;它直接关系到数据恢复、主从复制等高阶架构设计。无论你是刚入门的新手还是有一定经验的开发者&#xff0c;掌握Binlog的原理和应用都是进阶的必经之路。 BinLog是什么&#xff1f; Bin…

开源项目解读(https://github.com/zjunlp/DeepKE)

1.DeepKE 是一个开源的知识图谱抽取与构建工具&#xff0c;支持cnSchema、低资源、长篇章、多模态的知识抽取工具&#xff0c;可以基于PyTorch实现命名实体识别、关系抽取和属性抽取功能。同时为初学者提供了文档&#xff0c;在线演示, 论文, 演示文稿和海报。 2.下载对应的de…

「MethodArgumentTypeMismatchException:前端传递 ‘undefined‘ 导致 Integer 类型转换失败」

遇到的问题&#xff1a; Failed to convert value of type java.lang.String to required type java.lang.Integer; nested exception is java.lang.NumberFormatException: For input string: "undefined" 原因分析&#xff1a; 大致意思就是我传递的参数到后端没…

LabVIEW故障诊断数据处理方法

在LabVIEW故障诊断系统中&#xff0c;数据处理直接决定诊断的准确性和效率。工业现场常面临噪声干扰、数据量大、实时性要求高等挑战&#xff0c;需针对性地选择处理方法。本文结合电机故障诊断、轴承损伤检测等典型案例&#xff0c;详解数据预处理、特征提取、模式识别三大核心…

基于 SpringBoot 的火车订票管理系统

收藏关注不迷路&#xff01;&#xff01; &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;还有大家在毕设选题&#xff08;免费咨询指导选题&#xff09;&#xff0c;项目以及论文编写等相关问题都可以给我留言咨询&#xff0c;希望帮助更多…

Python的概论

免责声明 如有异议请在评论区友好交流&#xff0c;或者私信 内容纯属个人见解&#xff0c;仅供学习参考 如若从事非法行业请勿食用 如有雷同纯属巧合 版权问题请直接联系本人进行删改 前言 提示&#xff1a;&#xff1a; 提示&#xff1a;以下是本篇文章正文内容&#xff0c…

构建大语言模型应用:句子转换器(Sentence Transformers)(第三部分)

本系列文章目录 简介数据准备句子转换器&#xff08;本文&#xff09;向量数据库搜索与检索大语言模型开源检索增强生成评估大语言模型服务高级检索增强生成 RAG 在之前的博客中&#xff0c;我们学习了为RAG&#xff08;检索增强生成&#xff0c;Retrieval Augmented Generati…

怎样提升大语言模型(LLM)回答准确率

怎样提升大语言模型(LLM)回答准确率 目录 怎样提升大语言模型(LLM)回答准确率激励与规范类知识关联类情感与语境类逆向思维类:为什么不,反面案例群体智慧类明确指令类示例引导类思维引导类约束限制类反馈交互类:对话激励与规范类 给予奖励暗示:在提示词中暗示模型如果回…

【进阶】vscode 中使用 cmake 编译调试 C++ 工程

基于 MSYS2 的 MinGW-w64 GCC 工具链与 CMake 构建系统&#xff0c;结合VSCode及其扩展插件&#xff08; ms-vscode.cmake-tools&#xff09;&#xff0c;可实现高效的全流程C开发调试。既可通过 VSCode 可视化界面&#xff08;命令面板、状态栏按钮&#xff09;便捷完成配置、…

流影---开源网络流量分析平台(三)(管理引擎部署)

目录 前沿 功能介绍 部署过程 前沿 在上一篇文章中&#xff0c;最后因为虚拟机的资源而没看到最后的效果&#xff0c;而是查看了日志&#xff0c;虽然效果是有了&#xff0c;但后来我等了很久&#xff0c;还是那个转圈的画面&#xff0c;所以我猜测可能是少了什么东西&#…

QT Quick(C++)跨平台应用程序项目实战教程 5 — 界面设计

目录 1.版面设计 2. 自定义按钮 2.1 自定义工具栏按钮 2.2 自定义图标按钮 3. 顶部工具栏 4. 主体 5. 底部工具栏 6. 主文件 7. 最终效果 上一章内容讲解了QML基本使用方法。本章内容继续延续“音乐播放器”项目主线&#xff0c;完成程序的界面设计任务。 1.版面设计…

【微服务架构】SpringCloud Alibaba(三):负载均衡 LoadBalance

文章目录 SpringCloud Alibaba1、核心组件2、优势3、应用场景 一、Loadbalance介绍二、Ribbon和Loadbalance 对比三、整合LoadBlance1、升级版本2、移除ribbon依赖&#xff0c;增加loadBalance依赖 四、自定定义负载均衡器五、重试机制六、源码分析1、猜测源码的实现2、初始化过…

06-02-自考数据结构(20331)- 查找技术-动态查找知识点

自考数据结构动态查找算法主要讲二叉树和平衡二叉树,但是感觉到了,就又续接了一部分,所以这篇备考的小伙伴着重看前两种就可以了。 知识拓扑 知识点介绍 二叉排序树(BST) 定义 二叉排序树(Binary Search Tree)又称二叉查找树,它或者是一棵空树,或者是具有下列性质的二…

Upload-labs 靶场搭建 及一句话木马的原理与运用

1、phpstudy及upload-labs下载 &#xff08;1&#xff09;下载phpstudy小皮面板 首先需要软件phpstudy 下载地址 phpStudy下载-phpStudy最新版下载V8.1.1.3 -阔思亮 &#xff08;2&#xff09;然后到github网址下载源码压缩包 网址 https://github.com/c0ny1/upload-labs 再…