当前位置: 首页 > news >正文

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;
}

相关文章:

  • 【11408学习记录】破译语言密码·征服数学迷宫——长难句拆解与方程不等式全析
  • RK3588使用笔记:系统算法依赖库安装
  • Linux信号——信号的产生(1)
  • 自然语言处理(18:(第五章3.)LSTM的实现)
  • 【算法1-5】贪心
  • 一文详解VS2022配置LibTorch环境:Windows平台LibTorch CUDA与cuDNN开发环境配置
  • marked库(高效将 Markdown 转换为 HTML 的利器)
  • 算法训练营第二十九天 | 动态规划(二)
  • TS 中 keyof 和 in 关键字详解
  • 使用Vscode的Remote-SSH通过ssh密钥免输入密码连接远程服务器
  • Java NIO之FileChannel 详解
  • unity客户端面试高频2(自用未完持续更新)
  • Androidstudio开发,实现商品分类
  • mysql 八股
  • android开启Sys V IPC,并使用共享内存编程
  • 流影---开源网络流量分析平台(二)(功能部署--流量探针)
  • C++ 中遍历 std::map
  • 网络基础概念
  • vue在template块里使用v-for循环对象、数组及嵌套结构数据
  • Redis-01.Redis课程内容介绍
  • 加强网站建设的措施/关键词统计工具有哪些
  • 做网站栏目是什么意思/百度推广时间段在哪里设置
  • 个人网站的基本风格是/网络营销的营销策略
  • wordpress改变上传目录权限/保定seo网站推广
  • 武汉网站建站/立即优化在哪里
  • 论坛类网站建站/国外常用的seo站长工具