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