SystemC TLM中的接口
在SystemC TLM中,接口是一個C++的抽象類。抽象類中的所有方法都是用“=0”標識表示的純虛函數。C++不允許創建抽象類的對象,因為抽象類對象是沒有意義的。 在SystemC中,sc_interface是所有接口的基類,任何一個接口必須直接或間接繼承sc_interface。
此外,接口不包含任何數據成員。下面是一個接口實例,首先定義一個存儲器讀接口mem_read_if,然后定義一個存儲器寫接口mem_write_if,接著定義一個存儲器的復位接口reset_if,最后利用這3個接口定義隨機存取存儲器的接口ram_if:
# ifndef _MEM_IF_H
# define _MEM_IF_H
# include “systemc.h”
enum transfer_status {TRANSFER_OK=0, TRANSFER_ERROR}; template < class T >
class mem_read_if : public sc_interface
{
public:
virtual transfer_status read (unsigned int address, T& data)=0;
// 定義存儲器讀的方法
};
template < class T >
class mem_write_if : public sc_interface
{
public:
virtual transfer_status write (unsigned int address, T& data)=0;
// 定義存儲器寫的方法
};
class reset_if : public sc_interface
{
public:
virtual bool reset ( )=0; // 定義存儲器復位的方法
};
template < class T >
class ram_if : public mem_write_if < T >, mem_read_if < T >, reset_if
{
public:
virtual unsigned int start_address ( ) const=0; //定義獲取存儲器首地址的方法
virtual unsigned int end_address ( ) const=0; //定義獲取存儲器終止地址的方法
};
#endif
從上面的存儲器接口的定義可以看出,接口是可以分層的,復雜的接口可以由多個簡單的接口繼承而得到。
SystemC TLM中的通道
從接口的定義可以看出,在SystemC中的接口僅僅定義了一組通信方法,并不包含這些方法的具體實現。為了實現這些方法,使建模的模塊具有實用的功能,SystemC中針對事務級建模引入了通道的概念。
通道是接口方法的具體實現,通過繼承一個或多個接口實現模型的具體功能。針對上述存儲器接口ram_if,其通道的定義如下:
#ifndef _RAM_H
#define _RAM_H
#include "systemc.h"
#include "mem_if.h"
template < class T >
class ram : public sc_module, ram < T >
{
public:
ram (sc_module_name name, unsigned int start_address, unsigned int end_address)
: sc_module (name)
, m_start_address (start_address)
, m_end_address (end_address){
sc_assert (end_address >=start_address);
mem=new T[end_address -start_address];
} //構造函數
~ ram ( ) {
if (mem) {delete mem; mem=0}
} //析構函數
transfer_status read (unsigned address, T& data)
{
if (address < m_start_address || address > m_end_address) {
data=0;
return TRANSFER_ERROR;
}
data=mem [address -start_address];
return TRANSFER_OK;
}
transfer_status write (unsigned address, T& data)
{
if (address < m_start_address || address > m_end_address) {
return TRANSFER_ERROR; }
mem [address -m_start_address]=data;
return TRANSFER_OK;
}
bool reset( ) {...}
inline unsigned int start_address ( ) const {...}
inline unsigned int end_address ( ) const {...}
private:
T* mem;
unsigned int m_start_address, m_end_address
};
#endif
SystemC TLM中的端口
在SystemC中,端口與特定的通道接口相連。進程通過特定的端口調用通道的接口提供的方法。對于(1)中提出的基本端口類型sc_in、sc_out以及sc_inout,可以調用的接口方法僅有write ( )和read ( ),但對于事務級建模,這些端口已經不能夠滿足需求。比如,當端口與總線接口或存儲器接口相連時,需要同時提供地址和數據,事務級模型需要執行與數據讀寫無關的一些操作如復位操作等。
在SystemC中,一個端口可以同時連接到一個或多個實現了同一接口的通道之上。端口的定義如下:
sc_port < Interface Type, ChannelNumber=1 >
Interface Type是端口所要連接的通道的接口類型。ChannelNumber代表端口所要連接的最大通道數,默認值是1。對于上面定義的的接口ram_if,下面的端口定義都是合法的:
sc_port < ram_if > ram_port1; //連接到一個RAM上
sc_port < ram_if, N > ram_portN; //連接到N個RAM上
根據上述存儲器接口ram_if及相應通道的定義,可以定義一個模塊Component通過端口對其進行訪問,如下:
SC_MODULE (Component) {
sc_in_clk clk;
sc_port < ram_if < int > > ram_port; // 實例化端口
void action ( );
int data;
unsigned int address;
SC_CTOR ( ) {
SC_METHOD (action, clk.pos( ));
}
};
void Component :: action ( ){
wait ( );
int i=0;
while (i++< 100) {
address=0;
if (transfer_status status=ram_port - > write (address, data)) {
// 通過端口ram_port調用存儲器寫方法
cout < < "Write RAM successfully" < < endl;
}
else cout < < "Write RAM fail" < < endl;
if (transfer_status status=ram_port - > read (address, data)) {
// 通過端口ram_port調用存儲器讀方法
cout < < "Read RAM successfully" < < endl;
}
else cout < < "Read RAM fail" <
-
接口
+關注
關注
33文章
8694瀏覽量
151926 -
ESL
+關注
關注
1文章
74瀏覽量
21417 -
systemc
+關注
關注
2文章
25瀏覽量
14583 -
TLM
+關注
關注
1文章
32瀏覽量
24780
發布評論請先 登錄
相關推薦
全面的SystemC TLM驅動式IP設計與驗證解決方案
![全面的<b class='flag-5'>SystemC</b> <b class='flag-5'>TLM</b>驅動式IP設計與驗證解決方案](https://file.elecfans.com/web1/M00/C5/B3/o4YBAF9SBqqARW7uAAD5o0vmN9E722.png)
如何在ModelSim下用SystemC的做驗證?
Verilog中 generate if 語句如何用systemc實現?
Verilog 中generate if語句如何用systemc實現?
在systemC設計中如何實現上拉和下拉?
ARM System C循環模型用戶指南
海信TLM3229G、TLM3729G彩電電路圖
![海信<b class='flag-5'>TLM</b>3229G、<b class='flag-5'>TLM</b>3729G彩電電路圖](https://file.elecfans.com/web2/M00/48/9F/pYYBAGKhtBKAXmBVAAAZwG-YS5Q801.jpg)
Systemc From The Ground Up
![<b class='flag-5'>Systemc</b> From The Ground Up](https://file.elecfans.com/web2/M00/48/AD/pYYBAGKhtBaAZfaMAABB-oHQizE494.jpg)
利用基于SystemC/TLM的方法學進行IP開發和FPGA
![利用基于<b class='flag-5'>SystemC</b>/<b class='flag-5'>TLM</b>的方法學進行IP開發和FPGA](https://file1.elecfans.com//web2/M00/A5/6F/wKgZomUMOGuACH6XAAFZR_5thIE565.jpg)
TLM驅動式新方案探討
![<b class='flag-5'>TLM</b>驅動式新方案探討](https://file1.elecfans.com//web2/M00/A5/F9/wKgZomUMOxOAI8VbAAAQyDVn8RY253.jpg)
SystemC中的模塊與進程
SystemC中的數據類型概念
![<b class='flag-5'>SystemC</b><b class='flag-5'>中</b>的數據類型概念](https://file1.elecfans.com/web2/M00/AD/E3/wKgZomVDUMCAESmeAACLV_CLDJM584.jpg)
評論