歡迎您光臨本站 登入註冊首頁

SystemC安裝及設計流程

admin @ 2014-03-26 , reply:0

概述

1.SystemCSetup   從www.systemc.org下載最新的SystemClibrary,這裡我們統一使用已經stable的2.1.v1版。在librar……

1. SystemC Setup
    從www.systemc.org下載最新的SystemC library,這裡我們統一使用已經stable的2.1.v1版。在library下載到本地以後,需要進行一次性的安裝流程。這個安裝流程是利用用戶所使用的編譯環境編譯用戶所需的基本SystemC library的過程。
    對於Linux和Windows的安裝流程是不一樣的,下面分別詳述。
1.1. For Linux
1、 解壓縮包
a) gunzip systemc-2.1.v1.tgz
b) tar –xvf systemc-2.1.v1.tar
2、 安裝library
a) 進入安裝目錄
cd systemc-2.1.v1
b) 創建臨時文件夾
mkdir temp
cd temp
c) 設置環境
setenv CXX g++
d) 配置包
../configure
e) 編譯包
gmake
f) 安裝包
gmake install
g) 刪除臨時文件夾
rm –rf temp
經過以上的步驟,SystemC就安裝完成了。

1.2. For Windows
    要在Windows環境下使用SystemC,需要標準的C++編譯器。在這裡,我們統一使用VC++6.0。以下的操作都本地已經安裝了VC++6.0。
1、 進入SystemC安裝目錄下的msvc60SystemC子目錄,如:
C:systemc-2.1.v1msvc60SystemC
2、 雙擊SystemC.dsw,VC++6.0會自動運行
3、 點擊 或按ctrl+F5,開始編譯SytemC.lib。編譯過程的最後會詢問exe文件的名字,選擇Cancel。
    經過以上的步驟,在systemc-2.1.v1msvc60SystemCDebug目錄下,會生成SytemC.lib這個文件。安裝完成。

2. SystemC Design Example
2.1. Module Design
    本文以AMBA協議中AHB上的Reset Controller的設計為例子,具體說明SystemC的設計流程。
2.1.1. Introduction to Reset Controller
    當外部複位指示POReset信號到來時,Reset controller產生系統的複位信號。其結構如下圖:
 
2.1.2. Signal Descriptions
 
2.1.3. Function and operations
    POReset是個非同步複位的指示信號。HRESETn對POReset打了三拍以消除亞穩態。以下是時序示意圖:
 
    在這裡,我們用一個狀態機來完成打三拍的操作,狀態機狀態轉換示意圖如下:
 
    下圖是Reset Controller的電路示意圖:
 
2.1.4. SystemC Source Code
/******************************************************
Filename : rst_ctrl.h
Auther : Richeal.Li
Date : 2006-09-08
******************************************************/
#include "systemc.h"
SC_MODULE(rst_ctrl){
sc_in <bool> HCLK ;
sc_in <bool> POReset ;
sc_out <bool> HRESETn ;
enum state_type{ ST_POR = 0x1, ST_INI1 = 0x2, ST_INI2 = 0x3, ST_RUN = 0x4};
sc_signal <state_type> rst_state;
void prc_rst_ctrl() ;
SC_CTOR(rst_ctrl){
SC_METHOD(prc_rst_ctrl) ;
sensitive_pos << HCLK ;
sensitive_neg << POReset;
}
};
/******************************************************
Filename : rst_ctrl.cpp
Auther : Richeal.Li
Date : 2006-09-08
******************************************************/
#include "rst_ctrl.h"
void rst_ctrl::prc_rst_ctrl(){
if(!POReset.read()){
rst_state = ST_POR;
HRESETn = 0 ;
}
else
switch(rst_state){
case ST_POR :
HRESETn = 0 ;
rst_state = ST_INI1 ;
break;
case ST_INI1:
HRESETn = 0 ;
rst_state = ST_INI2 ;
break;
case ST_INI2:
HRESETn = 0 ;
rst_state = ST_RUN ;
break;
case ST_RUN :
HRESETn = 1 ;
rst_state = ST_RUN ;
break;
default:
HRESETn = 1 ;
rst_state = ST_RUN ;
break;
}
}

2.2. Testbench Design
為了驗證設計的正確性,我們還需要編寫Testbench。因為設計非常簡單,這裡的Testbench只做以下兩件事情:
1、 產生激勵;
2、 保存波形
2.2.1. Generate POReset
/******************************************************
Filename : gen_poreset.h
Auther : Richeal.Li
Date : 2006-09-08
******************************************************/
#include "systemc.h"
SC_MODULE(gen_poreset){
sc_out <bool> POReset ;
void prc_gen_poreset() ;
SC_CTOR(gen_poreset){
SC_THREAD(prc_gen_poreset);
}
};
/******************************************************
Filename : gen_poreset.cpp
Auther : Richeal.Li
Date : 2006-09-08
******************************************************/
#include "gen_poreset.h"
void gen_poreset::prc_gen_poreset(){
//1st POReset
POReset.write(1);
wait(45, SC_NS) ;
POReset.write(0);
wait(60, SC_NS) ;
POReset.write(1);
wait(100, SC_NS);
//2nd POReset
POReset.write(1);
wait(45, SC_NS) ;
POReset.write(0);
wait(60, SC_NS) ;
POReset.write(1);
}
2.2.2. Generate Clock and Dump Wave
    以下給出了testbench的頂層代碼,要注意的是:時鐘的產生必須在main頂層,不能放在子模塊中產生。
/******************************************************
Filename : main.cpp
Auther : Richeal.Li
Date : 2006-09-08
Description : The testbench of rst_ctrl
******************************************************/
#include "rst_ctrl.h"
#include "gen_poreset.h"
int sc_main(int argc, char * argv[]){
sc_signal <bool> rst_n ;
sc_signal <bool> prst ;
sc_trace_file * tf; //建立文件指針
sc_clock clk("clk", 20, SC_NS); //產生時鐘
gen_poreset u_gen_poreset("gen_poreset");
u_gen_poreset.POReset(prst) ;
rst_ctrl u_rst_ctrl("u_rst_ctrl");
u_rst_ctrl.HCLK(clk) ;
u_rst_ctrl.POReset(prst) ;
u_rst_ctrl.HRESETn(rst_n) ;
tf = sc_create_vcd_trace_file("dump"); //dump波形,波形為VCD格式
sc_trace(tf, clk, "HCLK") ;
sc_trace(tf, prst, "POReset") ;
sc_trace(tf, rst_n, "HRESETn") ;
sc_start(500, SC_NS); //設置運行時間
sc_close_vcd_trace_file(tf);
cout << "Finished at time " << sc_time_stamp() << endl;
return 0;
}

[admin via 研發互助社區 ] SystemC安裝及設計流程已經有5587次圍觀

http://cocdig.com/docs/show-post-42982.html