TLM 2.0 Draft2

  • 2008/02/03(日) 19:13:26

1月25日に開催されたEDSFair2008の特設ステージで、エッチ・ディー・ラボ テクニカルグループから、TLM設計についてわかりやすく解説していただいたので、さっそくTLM2.0Draft2のExampleを動かしてみることにしました。
まず、サイトよりTLM-2.0draft2.tgzをダウンロードし、これをSystemCディレクトリに解凍します。

/home /takuo /EDA /SystemC /systemc-2.2.0
/scv-1.0p2-sysc2.2
/TLM-2007-11-29
/Arc

次に、ユーザディレクトリにある.bashrc を編集します。
ユーザディレクトリに入って

$vi .bashrc

.bashrc が開いたらこの一番下に次の各行を追加します。

export   SYSTEMC_HOME=/home/takuo/EDA/SystemC/systemc-2.2.0
export   TLM_HOME=/home/takuo/EDA/SystemC/TLM-2007-11-29
export   TARGET_ARCH=linux

変更が終わったらこれを有効にします。

$. .bashrc

ユーザディレクトリより、Exampleのディレクトリへ移動します。

$cd EDA/SystemC/TLM2.0-2007-11-29/examples/tlm/lt_min_system/build-unix

移動したら

$make clean
$make
$make run

で実行されます。


内容については、lt_min_systemディレクトリのdocsディレクトリにあるlt_min_system_example.pptで、スライドショーがみれます。

また、TLM2-Example Tutorialsが公開されています。

SystemC Makefile

  • 2007/10/24(水) 13:04:32

Makefileの勉強も兼て、Makefileをシンプルにしてみました。
Inverterの動作確認に使ったMakefileは、systemc-2.0.1のexampleフォルダにあったものです。
Makefile.defsはインクルードしていません。
テストに使うモジュールは、SystemC Use's Guideの非同期リセット付きDフリップフロップを参考にして作った同期リセット付きDフリップフロップです。

まずExampleの下のSystemCディレクトリににdffrディレクトリを作成します。。

/home /takuo /EDA /SystemC /systemc-2.2.0
/Example /SystemC /dffr Makefile
dffr.h
dffr.cpp
test.cpp

以下に示す、Makefile,dffr.h,dffr.cpp,test.cppをdffrディレクトリの下に配置します。

Makefile
TARGET_ARCH = linux
CC = g++
SYSTEMC = /home/takuo/EDA/systemc/systemc-2.2.0
INCDIR = -I. -I$(SYSTEMC)/include
LIBDIR = -L. -L$(SYSTEMC)/lib-$(TARGET_ARCH)
LIBS = -lsystemc -lm

MODULE = dffr
SRCS = test.cpp dffr.cpp

EXE = $(MODULE).x

all: $(EXE)

exe: $(EXE)
./$(EXE)

$(EXE): $(SRCS)
$(CC) $(INCDIR) $(LIBDIR) -o $@ $(SRCS) $(LIBS)

clean :
rm -f *~ *.vcd $(EXE)
'07'10'27 修正

dffr.h
SC_MODULE(dffr)
{
sc_in clock;
sc_in reset;
sc_in din;
sc_out dout;

void do_ffr();

SC_CTOR(dffr)
{
SC_METHOD(do_ffr);
sensitive_pos(clock);
}
};


dffr.cpp
#include "systemc.h"
#include "dffr.h"

void dffr::do_ffr()
{
if (clock.event()) {
if (reset) {
dout = false;
} else
dout = din;
}
}


test.cpp
#include
#include
#include "systemc.h"
#include "dffr.h"
int sc_main(int argc, char *argv[])
{
int i;
sc_clock clock("clock", 15, SC_NS, 0.5, 0, SC_NS, false);
sc_signal reset;
sc_signal din;
sc_signal dout;

dffr *dffr1;
dffr1 = new dffr("dffr1");
(*dffr1)(clock, reset, din, dout);

sc_trace_file *trace_f;

trace_f = sc_create_vcd_trace_file("dffr");
((vcd_trace_file *)trace_f) -> sc_set_vcd_time_unit(-9);
sc_trace(trace_f,clock, "clock");
sc_trace(trace_f,reset, "reset");
sc_trace(trace_f,din, "din");
sc_trace(trace_f,dout, "dout");
sc_initialize();
din = false;
reset = false;
sc_start(10,SC_NS);
reset = true;
sc_start(30,SC_NS);
reset = false;
for(i=0; i<20; i++)
{
sc_start(20, SC_NS);
din = ! din;
}
sc_close_vcd_trace_file(trace_f);
return 0;
}


dffrディレクトリに入って、


$make exe

実行まで行われるので、VCDファイルdffr.vcdができています。
GTKWaveで波形を見ます。

$gtkwave dffr.vcd

SystemC 動作確認

  • 2007/09/26(水) 15:43:56

簡単なインバータ回路の動作確認を行います。
まずユーザディレクトリにExampleディレクトリを作成し、その下にSystemC,さらにその下にInverterディレクトリを作成します。。

/home/takuo/EDA/SystemC/systemc-2.2.0
/Example/SystemC/InverterMakefile.linux
Makefile.defsInverter.h
Inverter.cpp
Main.cpp

以下に示す、Makefile.defsをSystemCディレクトリの下に、Makefile.inux、Inverter.h,Inverter.cpp,Main.cppをInverterディレクトリの下に配置します。

Makefile.defs
## Variable that points to SystemC installation path
#SYSTEMC = ../../..
SYSTEMC = /home/takuo/EDA/systemc/systemc-2.2.0

INCDIR = -I. -I.. -I$(SYSTEMC)/include
LIBDIR = -L. -L.. -L$(SYSTEMC)/lib-$(TARGET_ARCH)

LIBS = -lsystemc -lm $(EXTRA_LIBS)

EXE = $(MODULE).x

.SUFFIXES: .cc .cpp .o .x

$(EXE): $(OBJS) $(SYSTEMC)/lib-$(TARGET_ARCH)/libsystemc.a
    $(CC) $(CFLAGS) $(INCDIR) $(LIBDIR) -o $@ $(OBJS) $(LIBS) 2>gt;&1 | c++filt

.cpp.o:
    $(CC) $(CFLAGS) $(INCDIR) -c $<

.cc.o:
    $(CC) $(CFLAGS) $(INCDIR) -c $<

clean::
    rm -f $(OBJS) *~ $(EXE) core

ultraclean: clean
    rm -f Makefile.deps

Makefile.deps:
#     $(CC) $(CFLAGS) $(INCDIR) -M $(SRCS) >> Makefile.deps

#include Makefile.deps


Makefile.linux
TARGET_ARCH = linux
CC = g++
OPT = -O3
DEBUG = -g
OTHER = -Wno-deprecated
CFLAGS = $(OPT) $(OTHER)
# CFLAGS = $(DEBUG) $(OTHER)

MODULE = Inverter
SRCS = Main.cpp Inverter.cpp
OBJS = $(SRCS:.cpp=.o)

include ../Makefile.defs


Inverter.h
SC_MODULE(Inverter)
{
    sc_in<bool> InA;
    sc_out<bool> Dout;

    void Inv_Proc(void);

    SC_CTOR(Inverter)
    {
        SC_METHOD(Inv_Proc);
        sensitive << InA;
    }
};


Inverter.cpp
#include "systemc.h"
#include "Inverter.h"

void Inverter::Inv_Proc(void)
{
Dout = ! InA;
}


Main.cpp
#include <stdio.h>
#include <iostream>
#include "systemc.h"
#include "Inverter.h"

int sc_main(int argc, char *argv[])
{
    int i;
    sc_signal<bool> InA;
    sc_signal<bool> Dout;
    Inverter *INV;
    INV = new Inverter("INV");
    (*INV)(InA, Dout);
    sc_trace_file *trace_f;
    trace_f = sc_create_vcd_trace_file("inverter");
    ((vcd_trace_file *)trace_f) -> sc_set_vcd_time_unit(-9);
    sc_trace(trace_f, InA, "InA");
    sc_trace(trace_f, Dout, "Dout");

    sc_initialize();
    cout << "InA | Dout" << endl;
    cout << "---------" << endl;
    for(i=0;i<20;i++)
    {
        if(i%2)
            InA = true;
        else
            InA = false;

        sc_start(50,SC_NS);
        cout << InA << " | " << Dout << endl;
    }

    sc_close_vcd_trace_file(trace_f);
    return 0;
}


Inverterディレクトリに入って、


$make -f make.linux

実行ファイルInverter.xができるので、

$./Inverter.x

VCDファイルinverter.vcdができるので、GTKWaveで波形を見ます。

$gtkwave inverter.vcd

SystemCシミュレータインストール

  • 2007/07/09(月) 21:05:33

EDAディレクトリに作ったSystemCディレクトリに移動します。
移動したら、

$gunzip ../../Arc/systemc-2.2.0.tgz

$tar xvf ../../Arc/systemc-2.2.0.tar

systemc-2.2.0 ディレクトリが作成されるので、このディレクトリに移動します。
移動したらここにobjdir ディレクトリを作成しこれに移動します。

$../configure

$make

$make install

$make check

でSystemCシミュレータのインストール終了です。

objdir ディレクトリは、削除してもいいようですが、ディスクに余裕があるならとっておいたほうがいいようです。
後にアンインストールしたい場合は、このディレクトリ内で、

$make clean

$make uninstall

詳しくはREADMEファイルを参照。

次に、SCV(SystemC Verification Library)をインストールします。
SystemCディレクトリに移動して、

$gunzip ../../Arc/scv-1.0p2-sysc2.2.12jun06.tgz

$tar xvf ../../Arc/scv-1.0p2-sysc2.2.12jun06.tar

scv-1.0p2-sysc2.2 ディレクトリが作成されるので、このディレクトリに移動します。
gcc のバージョンが4.1.1なので、configure ファイルを修正します。
(INSTALLファイル参照)

5642行目
#include <strstream.h> → #include <sstream>

5654行目
ostrstream outString(buf,STRING_SIZE);
 → std::ostringstream outString;

修正が終わったら、objdir ディレクトリを作成しこれに移動します。

$../configure --with-systemc=/home/takuo/EDA/SystemC/systemc-2.2.0

--with-systemc=・・・では、SystemCディレクトリのパスを指定しますん。
gcc のバージョンが4.1.1なので、生成されたconfig.hファイルを修正します。(INSTALLファイル参照)

44行目をコメントアウト → //#define _USE_HASH_MAP

修正が終わったら

$make

$make install

objdir ディレクトリは、削除してもいいようですが、ディスクに余裕があるならとっておいたほうがいいようです。
後にアンインストールしたい場合は、このディレクトリ内で、

$make clean

$make uninstall

動作確認をしてみます。
objdir ディレクトリ内のexamples/general/hello/ へ移動します。

$make linux

Hello, world! が表示されます。

run.xをコマンドラインより実行するためには、/home/takuo/EDA/SystemC/systemc-2.2.0/lib-linuxのパスを環境変数LD_LIBRARY_PATHに指定します。
ユーザディレクトリの.bashrc を開いて、次の行を追加します。

export  LD_LIBRARY_PATH=/home/takuo/EDA/SystemC/systemc-2.2.0/lib-linux 

変更が終わったらこれを有効にします。

$. .bashrc

helloディレクトリへもどって

$./run.x

でHello, world! が表示されます。

SystemC関連のインストール

  • 2007/07/07(土) 13:34:11

EDAディレクトリの下にSystemCディレクトリを作りこのディレクトリにSystemCシミュレータとVerilog to SystemCトランスレータのVerilatorをインストールします。

/home /takuo /EDA /SystemC /systemc-2.2.0
        /scv-1.0p2-sysc2.2
        /verilator-3.652
        /Verilog-Perl-3.001
        /SystemPerl-1.280
       
    /Arc    

以下のアーカイブファイルを各サイトよりArcフォルダにダウンロードします。
SystemC関係はサイトにてユーザー登録が必要です。

SystemC シミュレータ
systemc-2.2.0.tgz
scv-1.0p2-sysc2.2.12jun06.tgz

Veriliog to SystemCトランスレータ
verilator-3.652.tgz
VerilogPerl-3.001.tar.gz
SystemPerl-1.280.tar.gz

インストールを始めるための下準備として、gcc,g++,bison,flex-oldをaptitudeコマンドを使ってインストールします。

$sudo aptitude install gcc

$sudo aptitude install g++

$sudo aptitude install bison

$sudo aptitude install flex-old

次に、ユーザディレクトリにある.bashrc を編集します。
ユーザディレクトリに入って

$vi .bashrc

.bashrc が開いたらこの一番下に次の各行を追加します。

export   CC=gcc
export   CXX=g++
export   SYSTEMC=/home/takuo/EDA/SystemC/systemc-2.2.0
export   TARGET_ARCH=linux
export   SYSTEMPERL=/home/takuo/EDA/SystemC/SystemPerl-1.280

export   VERILATOR_ROOT=/home/takuo/EDA/SystemC/verilator-3.652

変更が終わったらこれを有効にします。

$. .bashrc