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

相关推荐
君鼎19 分钟前
C++设计模式——单例模式
c++·单例模式·设计模式
刚入门的大一新生2 小时前
C++初阶-string类的模拟实现与改进
开发语言·c++
小冯的编程学习之路2 小时前
【软件测试】:推荐一些接口与自动化测试学习练习网站(API测试与自动化学习全攻略)
c++·selenium·测试工具·jmeter·自动化·测试用例·postman
C++ 老炮儿的技术栈4 小时前
什么是函数重载?为什么 C 不支持函数重载,而 C++能支持函数重载?
c语言·开发语言·c++·qt·算法
猪八戒1.04 小时前
C++ 回调函数和Lambda表达式
c++
源远流长jerry4 小时前
匿名函数lambda、STL与正则表达式
c++
tan180°5 小时前
Linux进程信号处理(26)
linux·c++·vscode·后端·信号处理
一只鱼^_5 小时前
牛客练习赛138(首篇万字题解???)
数据结构·c++·算法·贪心算法·动态规划·广度优先·图搜索算法
李匠20246 小时前
C++GO语言微服务之Dockerfile && docker-compose②
c++·容器
2301_803554527 小时前
c++和c的不同
java·c语言·c++