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

相关推荐
v维焓20 分钟前
C++(思维导图更新)
开发语言·c++·算法
CYRUS_STUDIO1 小时前
Frida Hook Native:jobjectArray 参数解析
android·c++·逆向
榆榆欸1 小时前
4.Socket类、InetAddr类、Epoll类实现模块化
linux·c++·tcp/ip
..过云雨1 小时前
11. 【C++】模板进阶(函数模板特化、类模板全特化和偏特化、模板的分离编译)
开发语言·c++
BC橡木2 小时前
C++ IO流
c++
m0_555762902 小时前
struct 中在c++ 和c中用法区别
java·c语言·c++
月亮有痕迹诶2 小时前
【C++】智能指针
开发语言·c++·c++11
王禄DUT2 小时前
化学方程式配平 第33次CCF-CSP计算机软件能力认证
开发语言·c++·算法
wuqingshun3141592 小时前
蓝桥杯 XYZ
数据结构·c++·算法·职场和发展·蓝桥杯
DreamByte3 小时前
C++菜鸟教程 - 从入门到精通 第五节
开发语言·c++·算法