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

相关推荐
mingren_13141 天前
c++和qml交互
c++·qt·交互
cn_mengbei1 天前
鸿蒙PC上Qt原生应用开发:从零搭建开发环境到部署实战,附HarmonyOS SDK配置与避坑指南(C++实现)
c++·qt·harmonyos
脏脏a1 天前
手撕 vector:从 0 到 1 模拟实现 STL 容器
开发语言·c++·vector
郝学胜-神的一滴1 天前
Linux 读写锁深度解析:原理、应用与性能优化
linux·服务器·c++·程序人生·性能优化
闻缺陷则喜何志丹1 天前
【图论 DFS 换根法】3772. 子图的最大得分|2235
c++·算法·深度优先·力扣·图论·换根法
开开心心就好1 天前
音频格式互转工具,支持Mp3ApeWavFlac互转
java·网络·c++·windows·qt·电脑·excel
byxdaz1 天前
C++内存序
c++
优雅的潮叭1 天前
c++ 学习笔记之 malloc
c++·笔记·学习
苦藤新鸡1 天前
8.最长的无重复字符的子串
c++·力扣
꧁Q༒ོγ꧂1 天前
C++ 入门完全指南(四)--函数与模块化编程
开发语言·c++