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_types
。tlm::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;
}