9、tlm 事务交互通信

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.mzph.cn/bicheng/75193.shtml

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

相关文章

小白入门机器学习概述

文章目录 一、引言二、机器学习的基础概念1. 机器学习的定义2. 机器学习的类型&#xff08;1&#xff09;监督学习&#xff08;Supervised Learning&#xff09;&#xff08;2&#xff09;无监督学习&#xff08;Unsupervised Learning&#xff09;&#xff08;3&#xff09;半…

smartdns 在企业场景中的应用心得

smartdns 是一款优秀的本地dns服务器&#xff0c;默认开启的配置在小型环境下足够使用(50台终端)&#xff0c;在面对中大型网络环境时&#xff08;100台终端&#xff0c;且有多层网络结构&#xff09;&#xff0c;需要增加更多的配置来确保稳定运行。 一、删除注释&#xff0c;…

【12】Ajax的原理和解析

一、前言 二、什么是Ajax 三、Ajax的基本原理 3.1 发送请求 3.2 解析内容 3.3 渲染网页 3.4 总结 四、Ajax 分析 五、过滤请求-筛选所有Ajax请求 一、前言 当我们在用 requests 抓取页面的时候&#xff0c;得到的结果可能会和在浏览器中看到的不一样&a…

【 <二> 丹方改良:Spring 时代的 JavaWeb】之 Spring Boot 中的安全性:使用 Spring Security 实现认证与授权

<前文回顾> 点击此处查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12907601&sharereferPC&sharesourceFoyoDesigner&sharefromfrom_link <今日更新> 一、开篇整…

百元不入耳蓝牙耳机哪个品牌好用?2025百元不入耳耳机品牌推荐

在选择蓝牙耳机时&#xff0c;许多用户开始关注不入耳式设计&#xff0c;不仅能避免耳道不适&#xff0c;还能保持对环境音的感知&#xff0c;提升运动、通勤或日常使用的安全性。而在百元价位中&#xff0c;不入耳式耳机的品牌众多&#xff0c;产品质量参差不齐&#xff0c;如…

如何加强 SSH 安全:内网和专用网络环境下的防护策略

文章目录 如何加强 SSH 安全&#xff1a;内网和专用网络环境下的防护策略限制访问来源通过防火墙或安全组限制网络策略&#xff08;Network Policy&#xff09; 禁用密码登录&#xff0c;使用密钥认证启用 Fail2ban 或 SSH 防爆破限制 SSH 用户更改 SSH 端口使用跳板机&#xf…

ngx_monotonic_time

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_monotonic_time函数-CSDN博客 定义在 src\core\ngx_times.c static ngx_msec_t ngx_monotonic_time(time_t sec, ngx_uint_t msec) { #if (NGX_HAVE_CLOCK_MONOTONIC)struct timespec ts;#if defined(CLOCK_MONOTONIC_FAST)clock_get…

【Trick】论文画图的icon来源

0&#xff1a;起因 群友在群里发了这种很好看的论文主图 其中不乏有很多icon&#xff0c;比如open-ai、机器人的 于是想知道应该如何找到&#xff0c;便有了后文 1&#xff1a;网址 阿里巴巴矢量图标库&#xff1a;iconfont-阿里巴巴矢量图标库 2&#xff1a;使用方法 可…

前端 技术栈

前端 技术栈 ChatGPT 说&#xff1a; 好咧&#xff0c;说到前端技术栈&#xff0c;这一块现在确实百花齐放&#xff0c;有点卷&#xff0c;但也超灵活。下面我来给你梳理一套2025年主流、实用、好上手的前端技术栈组合&#xff0c;按层级分类&#xff0c;一目了然&#xff1a;…

vue3 根据城市名称计算城市之间的距离

<template><div class"distance-calculator"><h1>城市距离计算器</h1><!-- 城市输入框 --><div class"input-group"><inputv-model"city1"placeholder"请输入第一个城市"keyup.enter"cal…

Java安全-FastJson反序列化分析

FastJson介绍 Fastjson 是阿里巴巴推出的一款高性能 JSON 序列化/反序列化库&#xff0c;由于其便捷性被广泛应用于 Java 项目中 FastJson使用 package org.example;import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject;public class FastjsonDemo {…

查看npm安装了哪些全局依赖

查看npm安装了哪些全局依赖 在macOS上&#xff0c;如果你想要查看通过npm全局安装的依赖包&#xff0c;你可以使用以下几种方法&#xff1a; 方法1&#xff1a;使用命令行 打开你的终端&#xff08;Terminal&#xff09;&#xff0c;然后输入以下命令&#xff1a; npm list -…

告别代码Bug,GDB调试工具详解

在软件开发的漫漫长路上&#xff0c;Bug 就像隐藏在黑暗中的 “小怪兽”&#xff0c;时不时跳出来给开发者们制造麻烦。曾经&#xff0c;欧洲航天局&#xff08;ESA&#xff09;首次发射阿丽亚娜 5 号火箭&#xff0c;这本是太空探索史上的重要时刻&#xff0c;却因一行代码导致…

LangChain4j(2):整合SpringBoot

1 新建Springboot项目 1.1 引入依赖 <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0…

移动端六大语言速记:第2部分 - 控制结构

移动端六大语言速记&#xff1a;第2部分 - 控制结构 本文继续对比Java、Kotlin、Flutter(Dart)、Python、ArkTS和Swift这六种移动端开发语言的控制结构&#xff0c;帮助开发者快速掌握各语言的语法差异。 2. 控制结构 2.1 条件语句 各语言条件语句的语法对比&#xff1a; …

Linux-线程概念与线程控制的常用操作

一.Linux线程概念 1-1.线程是什么 在Linux中&#xff0c;线程是基于Linux原有的进程实现的。本质是轻量级进程(LWP)。在⼀个程序⾥的⼀个执⾏路线就叫做线程&#xff08;thread&#xff09;。更准确的定义是&#xff1a;线程是“⼀个进程内部的控制序列”。 我们之前所学习的进…

dfs记忆化搜索刷题 + 总结

文章目录 记忆化搜索 vs 动态规划斐波那契数题解代码 不同路径题解代码 最长递增子序列题解代码 猜数字大小II题解代码 矩阵中的最长递增路径题解代码 总结 记忆化搜索 vs 动态规划 1. 记忆化搜索&#xff1a;有完全相同的问题/数据保存起来&#xff0c;带有备忘录的递归 2.记忆…

【HTML】验证与调试工具

个人主页&#xff1a;Guiat 归属专栏&#xff1a;HTML CSS JavaScript 文章目录 1. HTML 验证工具概述1.1 验证的重要性1.2 常见 HTML 错误类型 2. W3C 验证服务2.1 W3C Markup Validation Service2.2 使用 W3C 验证器2.3 验证结果解读 3. 浏览器开发者工具3.1 Chrome DevTools…

认识rand, srand, time函数,生成随机数

要完成猜数字游戏&#xff0c;首先要生成随机数&#xff0c;那么该怎么生成随机数&#xff1f;、 1.rand函数 rand函数是库函数&#xff0c;使用的时候要使用头文件stdlib.h c语言中&#xff0c;提供了rand函数来生成随机数&#xff0c;来看一下函数使用&#xff1a; 但是r…

BKA-CNN-GRU、CNN-GRU、GRU、CNN四模型多变量时序预测(Matlab)

BKA-CNN-GRU、CNN-GRU、GRU、CNN四模型多变量时序预测&#xff08;Matlab&#xff09; 目录 BKA-CNN-GRU、CNN-GRU、GRU、CNN四模型多变量时序预测&#xff08;Matlab&#xff09;预测效果基本介绍程序设计参考资料 预测效果 基本介绍 BKA-CNN-GRU、CNN-GRU、GRU、CNN四模型多…