預備打勞工之SystemC學習
- TLM2.0基本概念
-
- 松散定時模組化
- 近似定時模型
- 近似定時模組化和松散定時模組化的使用
- 發起者、目标、套接字和橋
- DMI和調試傳送結構
- 合并接口和套接字
- 名字空間和頭檔案
- 通用淨核類
-
- 定義
- 構造、指派和析構函數
- 通用淨核對象的屬性
- 大端和小端
- 阻塞傳送接口
-
- 核心接口概述
- 阻塞傳送接口定義
- 阻塞調用執行個體
- 時間解耦阻塞調用示例
- 量子時間阻塞示例
- 非阻塞傳送接口
-
- 相位
- 基礎協定類型
- 非阻塞傳送接口定義
- 非阻塞傳送接口使用示例
- 直接存儲器接口
- 調試傳送接口
- 合并的傳送接口
- 發起者和目标套接字
-
- 發起者和目标套接字
- 簡單套接字
- 全局量子時間和量子看守者
TLM2.0基本概念
在前面說了很多特有的行為模組化文法。在十幾種,這些文法能夠幫助你高效地模組化實際系統,但不要受限于新文法。
片上系統模組化時SystemC的核心功能之一。TLM2.0庫的設計目标是使得不同提供商的模型互相相容。在基于總線的片上系統中,最近的通信模式由以一個主裝置發起一次總線通路,被通路者做出相應的相應。
發起事務的子產品被稱為發起者,而接受 鈣食物并做出相應的木塊被稱為目标。發起者和目标之間通過套簽字連接配接。發起者和目标木塊必須遵守一定的接口标準才能互聯互通,這個接口在TLM2.0預定義了惡一個通過淨核類和相應的基礎協定,以進一步保障不同提供商提供的模型互聯互通。TLM2.0還定義了實用工具、分析接口和端口。
核心接口包括阻塞和非阻塞傳送接口、直接存儲器接口和調試傳送接口。
如圖所示,建構SystemC核心庫的基礎上。為了最大化可互操作性,特别是模組化存儲器映射類型的互聯模型,TLM2.0核心接口、發起者和目标套字、通用金河和基礎協定通常一起使用。當然,TLM2.0核心接口、發起者和目标嵌套字、通用淨核和基礎協定都可以單獨使用。

實用工具、分析接口和端口并不是必須的,但是為了保持風格的連續性和模組化的一緻性,在模組化時應盡量使用。
下面是庫檔案目錄結構
松散定時模組化
松散定時模組化使用阻塞傳送接口。在模組化中,阻塞的意義是一個調用請求發出購,知道請求被處理完成該調用才傳回。。是以在這種模型中,每一個事務處理對應了兩個時間點,即事務處理的開始點和結束點。在TLM基礎協定中,這兩個時間點與請求相位的開始和相應相位的開始相對應。正常情況下,事務處理的結束時間點要晚于事務處理的開始時間點,但有時候可以相同。
松散定時模組化風格支援 “時間解耦”,是松散定時模型的一個顯著特征。具體的說,模型的一部分可以在目前仿真時間之前運作,直到一個需要與其他部分同步的一個同步點。時間解耦降低了程序允許的仿真精度,但是有效地提高了仿真速度。
“全局量子時間”是一個程序提前與目前仿真時間運作的時間上限。它反映了仿真精度和仿真速度之間的權衡。
松散定時模型的兩個核心特征為:
- 阻塞調用
- 基于全局量子時間的時間解耦
近似定時模型
近似定時模組化通過非阻塞傳送接口支援,主要用于體系結構探索和性能分析。在一個非阻塞傳送中存在多個定時點,不同傳送相位可以分别用時間标注。在近似定時模組化中,一個事務被劃分為多個相位,由不同的時間點即興分割。在基礎協定彙總,基本的時間點包括請求的開始和結束、應答的開始和結束。特定的協定可以進一步包括更多的時間點,但可能導緻與通用淨核失去相容。
在近似定時模組化時,一般不使用時間解耦。這是因為考慮到定時精度的需求。在近似定時模組化時,每一個程序根據SystemC排程器的時間 進行執行。在近似定時模組化時,通過使用兩種延遲:目标延時和發起延時。發起延時也可以看做目标接收延時。
近似定時模組化和松散定時模組化的使用
不同模型适合的應用場景是不一樣的。
- 周期精确模型什麼都可以做,它仿真速度是很慢的
- 非定時模型仿真速度最快,包括的資訊較少,适合定義設計規範和做軟體開發
- 松散定時模型主要用于軟體開發和軟體性能評估,也可以做體系結構分析。
發起者、目标、套接字和橋
TLM2.0 支援在發起者和目标之間傳遞事務。發起者能夠發起事務,即建立一個新的事務對象,并通過TLM核接口定義的方法進行傳遞。目标是一個事務的目的地。發起者和目标之間可以直接相連,也可以通過互聯元件提供互聯。互聯元件是一個子產品,它可以通路事務,但不是事務的發起者或者目标。典型的互聯元件包括路由器、總線和仲裁器。
在TLM2.0中定義了發起者套接字和目标套接字,他們支援使用通用淨核來履歷前項、傳回、反向路徑。除了傳送接口,套接字還封裝了DMI和調試傳送接口。
DMI和調試傳送結構
直接存儲器接口(DMI)和調試傳送接口是不同于一般傳送接口的專門接口,可以直接通路和調試一個目标所擁有的的一片存儲區域。它們一般不通過互聯單元的算術接口而是進行存儲器直接通路。
DMI一般用于松散模型中,加速正常的存儲器事務處理器。調試傳送接口用于調試通路,無延遲也無負效應。DMI包括前向和後向接口,而調試接口隻有前向接口。
合并接口和套接字
在标準的發起者和目标套接字中,阻塞、非阻塞傳送接口、DMI和調試傳送接口被合并在一起。所有的四個類型的結構可以在一個給定的目标中并行使用。
名字空間和頭檔案
TLM2.0包括tlm和tlm_utils兩個名字空間。tlm名字空間包括了支援TLM模組化的四種傳送接口等核心類。
為了編譯通過,一個TLM2.0項目必須包括上述兩個目錄。它還必須包換systemc.h之前定義SC_INCLUDE_DYNAMIC_PROCESSES宏。
通用淨核類
進行事務處理級模組化,核心是描述事務以及事務的傳遞過程。可以定義很多中不同的C++類來表示事務。對于32位總線讀寫事務,一種的C++類為:
Class bus_payload
{
public:
unsigned int address;
unsigned int data_in;
unsigned int data_out;
bool[4] sel;
bool we;
bool cyc;
bool stb;
bool ack;
bool err;
bool rty;
};
一個總線讀寫事務為:
bus_payload bp;
對于不同的總線,總線讀寫事務類的定義不同。
定義
通用淨核用于提高存儲器映射類型總線模型的互聯互通性。通用淨核提供了建立存儲器映射類型總線模型所需要的基本屬性,對于建立多數抽象總線模型已經足夠。另一方面,它還提供了一個擴充機制以滿足某些總心啊标準的特定需求。
通用淨核針對存儲器映射類型總線模型而設計,包括了指令、位址、資料、時能、單字傳輸、突發傳輸等屬性。它支援阻塞和非阻塞傳送接口,也支援DMI和調試傳送接口。
在使用通用淨核作為食物對象傳遞前,發起者需初始化資料指針和位元組使能屬性指針。資料智針可以指向靜态、自動或者動态配置設定的存儲空間。
通用淨核支援兩種管理存儲區的方法:引用計數和發起者随機管理。兩個方法可以同時使用。
存儲區管理器是一個使用者定義的類,至少實作tlm_mm_interface的free方法。這樣一個類的設計目的是提高一個從一個存儲池配置設定通用淨核事務對象的方法。
隻有存在一個存儲管理器的時候,set_mm,acquire,get_ref_count和reset方法才能使用。預設條件下,通用淨核對象沒有存儲器管理器。set_mm方法啊用于設定一個通用淨核的村處理器管理器。
構造、指派和析構函數
預設構造函數将通用淨核的屬性設定為預設值。
tlm_generic_payload将通用淨核的屬性設定為預設值,并初始化存儲器管理器。通用淨核不支援拷貝構造函數和指派操作。
通用淨核對象的屬性
set_command設定指令屬性,即讀和寫。Get_comand傳回目前的指令屬性。Set_read和set_write分别将指令屬性設定為TLM_READ_COMMAND和TLM_WRITE_COMMADN。
大端和小端
大端和小端是常見的問題。被模組化的發起者和目标的大小端方向與主機的大小端方向是有關的。
阻塞傳送接口
核心接口概述
核心接口包括四種:
- 阻塞
- 非阻塞傳送接口
- DMI
- 調試傳送接口
其中阻塞和非阻塞傳送接口是發起者、目标和互聯元件之間進行事務處理的基本接口。阻塞、非阻塞傳送接口都支援定時标注和時間解耦。則色傳送接口沒有事務處理器相位參數,阻塞傳送接口與非阻塞傳送接口的事務處理器相位的任何對應都是名義上的。非阻塞傳送接口傳回一個值訓示傳回路徑是否已使用。
阻塞傳送接口定義
阻塞傳送接口主要支援松散時間模組化。發起者通過調用一個函數就可以完成一個非阻塞事務處理。
非阻塞事務處理接口如下:
namespace tlm{
template <typename TRANS = tlm_generic_paylpoad>
class tlm_blocking_transport_if:public virtual sc_core:: sc_interface{
public:
virtual void b_transport(TRANS &trans,sc_core::sc_time &t)=0;
};
}
b_transport()是非阻塞事務處理接口的唯一方法。Trans為一個事務,t是一個雙向時間參數。當發起者通過其通路目标是,t為事務處理器發起的時間。當目标傳回時,t為事務處理結束時間。TRANS參數預設值為tlm_generic_payload。使用者也可以根據需要修改具體類型。
調用規則如下:
- 可以直接或者間接調用wait;
- 隻能線上程類型的程序中調用,而不能在方法程序中調用。
- 發起者可以重用一個事務對象,從一個調用送到另一個調用,也可以跨傳送接口,包括DMI和調試傳送接口。
- 調用時送入的時間參數為事務發起時間,而傳回的時間為事務完成時間
- 時間标注産生允許定時點與仿真時間不同
- 事務對象一般不攜帶時間資訊
- 是否可以調用一欄具體規則協定
阻塞調用執行個體
阻塞調用的流程如圖所示,第一次立即傳回,第二次在50ns後傳回。
時間解耦阻塞調用示例
一個時間解耦的發起者可以提前與仿真時間允許,這時發起者和目标都需要一個本地名義時間。本地名義時間包括本地絕對名義時間和本地相對名義時間。b_transort裡調用挂了wait時,本地相對名義時間被複位為0.
量子時間阻塞示例
所有的時間結構的發起者增加本地相對時間知道量子時間被超出。
非阻塞傳送接口
相位
tlm_phase是非阻塞傳送接口模闆的預設相位類型。tlm_phase對象采用無符号整數表示相位。類tlm_phase的值有五個。
tlm_phase的預設值是UNINITIALIZED_PHASE。方法tlm_phase(unsigned in)、操作符=和操作符unsigned int可以用來設定和擷取tlm_phase對象的值。
操作符<<可以用來顯示目前相位的ASCII文本。宏DECLARE_EX-TENDED_PHASE建立一個單态類tlm_phase_arg,繼承與tlm_phase,它有一個公有方法get_phase傳回它所建立的靜态對象的引用。
大多數情況下,使用預定義的相位就可以完成模組化。
基礎協定類型
在TLM2.0中廣泛使用了基礎協定類型tlm_base_protocal_types,其定義如下
namespace tlm{
struct tlm_base_protocol_types{
typedef tlm_generic_payload tlm_payload_type;
typedef tlm_phase tlm_phase_type;
};
}
其中 tlm_generic_payload是通用淨核。
非阻塞傳送接口定義
非阻塞傳送接口用于支援模組化近似時間模型。近似時間模型模組化用于藐視發起者和目标之間的事務查理過程的多相位的細節。,每一個相位都有一個明确的定時點。
如果将時間點越是為兩個,非阻塞接口就可以用于模組化松散時間模型。非阻塞傳送接口同時使用前向路徑和反向路徑,是以非阻塞傳送該接口有兩個。
與阻塞傳送接口類似,非阻塞傳送接口需要傳送事務對象的應用和相對本地名義時間資訊。此外,非阻塞傳送接口還需要一個枚舉便令表示交易的狀态,并傳回同一個枚舉便令标志是否發生了事務處理相位的改變。
為了與基礎協定相容,在實際模組化中盡量使用tlm_phase和tlm_generic_payload以保持不同模型的相容性。
前向非阻塞接口類tlm_fw_nonblocking_transport_if的接口函數nb_transport_fw在前向路徑中調用,反向非阻塞接口類tlm_bw_nonblocking_transport_if的接口。視線中都不允許使用wait函數,是以他們也都可以線上程類程序和方法程序中使用。
nb_trasport_fw和nb_transport_bw中補鞥呢調用b_transport。對于基礎協定,simple_target_socket類實作了nb_transport_fw、nb_transport_bw與b_transport的自動轉換。
TRANS& trans參數的使用于阻塞接口一樣。
PHASE& phase參數引用一個相位對象,相位的變化表明時間的前進。
非阻塞傳送接口使用示例
發起者首先調用nb_transport_fw(trans,BEGIN_REQ,0)來發起請求。當使用反向鍊路時,可能目标并不能立刻計算出下一個相位切換時的事務對象的狀态,是以傳回TLM_ACCEPTED。發起者此時應該通過調用wait或者sync來進行同步,以使得目标中的程序可以得到執行。
當目标得到執行,它調用nb_transport_bw(trans,END_REG,0)來對nb_transport_Fw來做響應。而目标在執行時,發起者中的相應程序也無法得到執行,同樣發揮了TLM_ACCEPTED,此前目标應該通過調用wait或者sync來進行同步。
直接存儲器接口
直接存儲器接口(DMI)允許發起者使用指針直接通路而不是使用傳輸接口通路目标擁有的一片存儲區域。DMI回避了對阻塞和非阻塞傳送接口的多次調用,DMI能夠有效提高仿真速度。
DMI接口有兩個,一個用于從發起者到目标的前項路徑調用,另外一個用于目标到發起者的反向路徑調用。前向路徑調用傳回一個類型為tlm_dmi的引用對象,發起者可以通過該應用範圍給位于目标的存儲器區域。反向路徑被目标用于使通過前向路徑建立的引用無效。前向和反向路徑都可以穿越0、1或者多喝互聯單元,但是前向和反向路徑必須穿越互聯單元的集合必須相同。
DMI預設的事務對象的類型為tlm_generic_payload,也可以根據需要進行拓展。
DMI接口定義如下:
namespace tlm{
class tlm_dmi{
public tlm_dmi(){init();}
}
}
調試傳送接口
調試攢送接口為發起者提供一個與其他傳送接口具有相同的前向路徑的讀寫方法,但是對其他傳送接口的操作沒有任何影響,即調試傳送接口操作對于其他傳送接口來講是非入侵式的。調試傳送接口可以讓發起者在仿真過程中對存儲器内容進行以診斷為目的掃描。
namespace tlm{
template <typename TRANS=tlm_generic_payload>
class tlm_transport_dbg_if :public virtual sc_core::sc_interface{
public:
virtual unsigned int transport_dbg(TRANS& trans)=0;
};
}
合并的傳送接口
發起者和目标套接字
發起者和目标套接字
一個套接字講一個端口和一個導出端口相連接配接。一個發起者至少有一個前向路徑端口和一個反向路徑導出端口,而一個目标有一個反向路徑端口和一個前向路徑導出端口。
在TLM2.0中預定義了一些套接字
簡單套接字
簡單套接字就是使用簡單友善,它們從tlm_initiator_socket和tlm_target_socjer繼承而來,是以能夠直接與這些類型的套接字綁定。每一個簡單套接字都提供了注冊回調方法的方法。
全局量子時間和量子看守者
“時間解耦”允許SystemC程序可以提前于仿真時間運作,二允許提前的最大仿真時間稱為量子時間。全局量子時間由單态tlm_global_quantum來定義,而類tlm_quantumkeeper則提供了管理全局量子時間的方法。