1 Abstract 2 Entwicklung von SystemC

Transcrição

1 Abstract 2 Entwicklung von SystemC
1 Abstract
SystemC ist eine Systembeschreibungssprache auf Basis von C++. In ihren Anfängen war
SystemC nur eine neue Hardwarebeschreibungssprache auf RTL Niveau sowie gleichzeitig
Simulator für diese Sprache. Durch die Forderung nach neuen produktiveren Sprachen
zum Design für elektronische Systeme entwickelte sich SystemC jedoch zu einer echten
system-design language. Während Sprachen auf Register-Transfer-Level die Funktionalität einer Schaltung durch Signalüsse und logische Operatoren zwischen diesen darstellen,
ist die Abstraktion von SystemC höher. Software- wie auch Hardwarekonzepte werden
beherrscht.
Moderne Systeme, vor allem SoC und embedded Applikationen, bestehen zu groÿen
Teil sowohl aus Hardware- wie auch Softwarekomponenten. SystemC ermöglicht die
gleichzeitige Modellierung der Komponenten in der Art wie sie im realen System
letztendlich miteinander agieren würden, und dies auf hohem Abstraktionsnivau. Obwohl die Modellierung analoger oder mechanischer Komponenten nicht speziziert ist,
spricht nichts dagegen dies mittels SystemC Konstrukten oder Co-Simulationtechniken
zu vollziehen.[2]
2 Entwicklung von SystemC
Die Entwicklung und Förderung von SystemC unterliegt der Open SystemC Initiative (OSCI), einer unabgängingen gemeinnützigen Organisation der die führenden EDA
Unternehmen sowie Universitäten angehören.[6]
Als Referenz dient das IEEE1666-2005 Open SystemC Language Reference Manual
welches frei zugänglich ist.
1
1
http://standards.ieee.org/getieee/1666/download/1666-2005.pdf
1
Abbildung 1: Vergleich von HDL
3 Unterschied zu anderen HDL
Bei SystemC handelt es sich streng genommen um eine Klassenbibliothek in C++. Sowohl Hardware als auch Software werden in einer einheitlichen Sprache, C++, modelliert.
Sie erweitert die Sprache C++ mittels Makros und Funktionen um die notwendigen Mittel, um typische Eigenschaften von Hardware modellieren zu können. Dazu zählen zum
Beispiel Synchronisation, Parallelität und Interprozesskommunikation. Dieses bringt SystemC den Nachteil eines syntaktischen Overheads ein, den Hardwarebeschreibungssprachen nicht haben. Dafür ist der Entwickler deutlich freier im Ausdruck.[7] Eine Übersicht
zur möglichen Modellierung und des Abstraktionsniveau zeigt Abbildung 1. Nach Übersetzung dieses Codes erhält man ein funktionales Modell, dass das Systemverhalten beinhaltet und genau simuliert und getestet werden kann. Damit ergibt sich die Möglichkeit,
das System auf Performanz sowie Verhalten und Zusammenspiel der Komponenten zu
untersuchen [5].
Zudem unterstützt SystemC das Transaction-level modeling (TLM).
2 Das zugrunde lie-
gende Konzept ist, nur in benötigter Detailtiefe zu modellieren um schon in möglichst
frühen Entwurfsphasen ausführbare Modelle zu erhalten. Nähere Informationen sind in
[2, 3, 8].
2
ein Standard wird gerade durch die OSCI ausgearbeitet
2
Abbildung 2: Aufbau von SystemC[5, S. 5]
4 Sprachkonstrukte
Den Aufbau von SystemC zeigt Abbildung 2. Selbige Quelle liefert zudem eine schlank
gehaltene Einführung.
Zu den Sprachkonstrukten zählen:
•
Module
(SC_MODULE)
Modules sind die einzelnen Blöcke einer Design Hierarchy. Ein SystemC Model
besteht typischerweise aus mehreren Blöcken die über Ports kommunizieren.
•
Ports
Ports ermöglichen die Kommunikation von Module Interna mit anderen Modulen.
•
Prozesse
Prozesse sind nebenläuge Konstrukte. Sie dienen hauptsächlich als Berechnungselemente.
•
Channels
Channels sind die Kommunikationselemente von SystemC. Sie sind sowohl als einfache Drähte wie auch komplexe Mechanismen denk- und modellierbar.
3
SystemC – Sprachelemente II
Module:

SC_MODULE
Jedes SystemC-Modul ist von dieser Basisklasse abgeleitet und erbt dessen Methoden und
Daten.
Ports und Signale:

sc_in<Datentyp>
Eingabeport eines Moduls.

sc_out<Datentyp>
Ausgabeport eines Moduls.

sc_Signal<Datentyp>
Signale verbinden Ports und sorgen für den Datenaustausch zwischen Modulen. Man kann
ein Signal mit der Funktion read() lesen und mit write() schreiben. Der Operator „=“ wurde
so überladen, das auch eine direkte Zuweisung ohne read() oder write() möglich ist.
Konstruktoren:

SC_CTOR()
Standardkonstruktor für ein SystemC-Modul

SC_HAS_PROCESS
Notwendig, wenn man einen individuellen Konstruktor für ein Modul definieren möchte,
welches SC_METHOD oder SC_THREAD Prozesse enthält
Prozesse:

SC_METHOD
Prozess wird als Methode des Moduls definiert. Methoden werden durch Ereignisse, also
die Änderung eines Signals, aktiviert. Methoden können mehrfach ausgeführt werden.

sensitive
Damit lassen sich Sensivity Lists erstellen, die die Signale enthalten, auf deren Änderung
eine Methode reagieren soll.

dont_initialize()
Verhindert das automatische Aufrufen einer Methode beim Start der Simulation.

SC_THREAD
Ist ein Prozess eines Moduls als SC_THREAD definiert, wird er zu Beginn der Simulation
gestartet. Er läuft also nur einmal während jeder Simulation und wird daher oft mit einer
Endlosschleife implementiert. Threads können mit der Funktion wait() angehalten werden.
Simulation und Hauptprogramm

sc_main()
Hauptroutine eines SystemC-Programms.

sc_start()
Startet die Simulation.

sc_stop()
Stoppt die Simulation.
3a
Kombinatorik
Halbaddierer
An diesem Beispiel soll die grundlegende Struktur der SystemC Elemente dargestellt
werden. Dabei handelt es sich um einen Halbaddierer mit dem dargestellten Schema. Er
besteht aus einem Modul, welches die Eingangsports a und b sowie die Ausgangsports
sum und carry besitzt. Die Funktionalität ist modulintern durch ein XOR und ein AND
Gatter realisiert.
a
b
=1
sum
&
carry
Das Codebeispiel zu dem beschriebenen Halbaddierer:
Halfadder.h
Headerdatei
mit
der
Modulbeschreibung
#include
"systemc.h"
// I n k l u d i e r e n der SystemC B i b l i o t h e k
SC_MODULE
( halfadder ){
// D e k l a r a t i o n e i n e s SystemC Moduls durch SC_MODULE
s c _ i n <b o o l > a ,
b;
// I n p u t p o r t s
s c _ o u t<b o o l > sum ,
carry ;
// O u t p u t p o r t s
void
prc_halfadder ( ) ;
// D e k l a r a t i o n d e s P r o z e s s e s p r c _ h a l f a d d e r
SC_CTOR
( halfadder ){
// i d e n t i s c h e r Name wie SC_MODULE
// D e k l a r a t i o n e i n e s P r o z e s s e s f ü r d i e
4
// V e r h a l t e n s b e s c h r e i b u n g
SC_METHOD( p r c _ h a l f a d d e r ) ;
// u n u n t e r b r e c h b a r e r P r o z e s s
sensitive
<<
a << b ;
// S e n s i t i v i t ä t s l i s t e ( Änderung von a oder b
// f ü h r t z u r Ausführung d e s P r o z e s s e s )
}
};
Halfadder.cpp
// D a t e i mit der D e f i n i t i o n d e s P r o z e s s e s
#include
void
" halfadder .h"
halfadder : : prc_halfadder (){
sum =
a
^
b;
// Berechnung der Ausgabewerte
carry
=
a
& b;
// Zuweisung e r f o l g t nach einem $\ Delta$ −Delay
}
5
Mathematische Funktion
Ihre Aufgabe ist die Implementierung der im Blockschaltbild dargestellten mathematischen Funktion(result
= (a + c) ∗ (b − c))
in SystemC.
Als Hilfestellung zur Umsetzung der verschiedenen Instanzen ist folgendes Konzept vorgegeben:
// i n f u n c . h
SC_MODULE( modulname )
// add / sub / mult
{
sc_in<
s c _ i n t <16> >
in1 ;
sc_in<
s c _ i n t <16> >
in2 ;
s c _ o u t<
void
s c _ i n t <16> >
out ;
prozessname ( ) ;
SC_CTOR( modulname )
{
SC_THREAD( p r o z e s s n a m e ) ;
sensitive
}
<<
in1
<<
in2 ;
// SC_CTOR
{
while
(
true
)
{
out . w r i t e (
in1 . read ( )
wait ( ) ;
}
}
} ; // SC_MODULE
6
−/ ∗ i n 2 . read ( ) ) ;
+/
// i n f u n c . cpp
void
modulname : : p r o z e s s n a m e ( )
while
(
true
{
)
{
port . write ( port . read ( )
operator
port . read ( ) ) ;
// P o r t s c h r e i b e n /− l e s e n ü b e r p o r t . w r i t e ( ) / p o r t . read
wait ( ) ;
}
}
7
Endlicher Zustandautomat
Zur Steuerung eines Kassettenspielers wurde folgender Moore-Automat entworfen. Dabei
läuft die Kassette bis zum jeweiligen Ende des Bandes und kehrt danach in die andere
Richtung um. Bei Betätigung der Stopptaste hält das Gerät an und speichert die Abspielrichtung, sodass beim Fortsetzen die Richtung der zuletzt gewählten entspricht.
Abbildung 3: Abspielsteuerung Kassettenspieler
Die Signale haben folgende Bedeutung:
•
x0 - linkes Bandende
•
x1 - rechtes Bandende
•
x2 - Wiedergabe
•
y0 - Bandbetrieb in linker Richtung
•
y1 - Bandbetrieb in rechter Richtung
Ihre Aufgabe ist es, zu dem Automaten eine Realisierung in SystemC zu erstellen.
8
Lösung
Mathematische Funktion
Func.h Datei
#include
<s y s t e m c . h>
∗tracefile
sc_trace_file
;
SC_MODULE( add )
{
sc_in<
s c _ i n t <16> >
in1 ;
sc_in<
s c _ i n t <16> >
in2 ;
s c _ o u t<
void
s c _ i n t <16> >
out ;
prc_add ( ) ;
SC_CTOR( add )
{
SC_THREAD( prc_add ) ;
sensitive
}
};
<<
in1
<<
in2 ;
// SC_CTOR
// SC_MODULE
SC_MODULE( s u b )
{
sc_in<
s c _ i n t <16> >
in1 ;
sc_in<
s c _ i n t <16> >
in2 ;
s c _ o u t<
void
s c _ i n t <16> >
out ;
prc_sub ( ) ;
SC_CTOR( s u b )
{
SC_THREAD( p r c _ s u b ) ;
sensitive
}
};
<<
in1
<<
// SC_CTOR
// SC_MODULE
SC_MODULE( m u l t )
{
9
in2 ;
sc_in<
s c _ i n t <16> >
in1 ;
sc_in<
s c _ i n t <16> >
in2 ;
s c _ o u t<
void
s c _ i n t <16> >
out ;
prc_mult ( ) ;
SC_CTOR( m u l t )
{
SC_THREAD( p r c _ m u l t ) ;
sensitive
}
};
<<
in1
<<
in2 ;
// SC_CTOR
// SC_MODULE
SC_MODULE( t o p l e v e l )
{
sc_in<
s c _ i n t <16> >
a;
sc_in<
s c _ i n t <16> >
b;
sc_in<
s c _ i n t <16> >
c ;
s c _ o u t<
s c _ i n t <16> >
result ;
sc_signal<
s c _ i n t <16> >
tmp1 ;
sc_signal<
s c _ i n t <16> >
tmp2 ;
// sub components
add
adder ;
sub
subtracter ;
mult
void
multiplier ;
prc_toplvl ( ) ;
SC_CTOR( t o p l e v e l )
"Adder" ) ,
" Subtracter " ) ,
m u l t i p l i e r ( " Multiplier " )
:
adder (
subtracter (
{
SC_THREAD( p r c _ t o p l v l ) ;
sensitive
<<
a << b <<
adder . in1 ( a ) ;
adder . in2 ( c ) ;
a d d e r . o u t ( tmp1 ) ;
subtracter . in1 (b ) ;
10
c ;
subtracter . in2 ( c ) ;
s u b t r a c t e r . o u t ( tmp2 ) ;
m u l t i p l i e r . i n 1 ( tmp1 ) ;
m u l t i p l i e r . i n 2 ( tmp2 ) ;
m u l t i p l i e r . out ( r e s u l t ) ;
}
};
sc_trace ( t r a c e f i l e ,
tmp1 ,
sc_trace ( t r a c e f i l e ,
tmp2 ,
// SC_CTOR
// SC_MODULE
11
"TMP1" ) ;
"TMP2" ) ;
Func.cpp Datei
// f u n c . cpp
"func.h"
#include
void
add : : prc_add ( )
{
while
(
true
)
{
out . w r i t e (
in1 . read ( )
+
in2 . read ( )
);
in1 . read ( )
−
in2 . read ( )
);
in1 . read ( )
∗
in2 . read ( )
);
wait ( ) ;
// w h i l e
// prc_add
}
}
void
sub : : prc_sub ( )
{
while
(
true
)
{
out . w r i t e (
wait ( ) ;
// w h i l e
// prc_sub
}
}
void
mult : : prc_mult ( )
while
{
(
true
)
{
out . w r i t e (
wait ( ) ;
// w h i l e
// prc_mult
}
}
void
t op l ev e l : : prc_toplvl ()
while
(
true
{
)
{
wait ( ) ;
// w h i l e
// t o p l v l
}
}
12
FSM
Fsm.h Datei
#include
"systemc.h"
SC_MODULE
( fsm )
{
s c _ i n <b o o l > x2 ,
s c _ o u t<b o o l > y1 ,
enum
state_type
x1 ,
x0 ,
reset ;
y0 ;
{ z0 ,
z1 ,
s c _ s i g n a l <s t a t e _ t y p e >
void
void
clk ,
z2 ,
z3 } ;
state ;
states ();
output ( ) ;
SC_CTOR
( fsm )
{
SC_METHOD
( states );
sensitive_pos
SC_METHOD
<<
clk ;
( output ) ;
sensitive_pos
<<
// S e q u e n t i e l l e r T e i l
state ;
}
};
13
// K o m b i n a t o r i s c h e r T e i l
Fsm.cpp Datei
#include
void
"fsm.h"
fsm : : s t a t e s ( )
if
{
( reset )
// Synchroner Reset
state
else
=
z2 ;
// A n f a n g s z u s t a n d z2 oder z3
switch
( state )
case
{
z0 :
if
( ! x2 )
else if
else if
case
break
z1 :
if
case
=
z0 ;
( x 2 && x 0 )
state
=
state
=
z1 ;
( x 2 &&
state
=
z3 ;
! x1 )
z1 ;
( x 2 && x 1 )
state
=
z0 ;
else
state
=
z2 ;
break
state
=
z0 ;
state
=
z3 ;
state
=
z1 ;
break
z3 :
state
z2 ;
! x0 )
( ! x2 )
else if
z2 :
=
;
else if
case
state
( x 2 &&
if
if
;
( ! x2 )
;
( ! x2 )
else
break
}
}
14
;
void
fsm : : o u t p u t ( )
switch
{
( state )
case
case
case
case
{
z0 :
y0
=
1;
break
y1
=
0;
y0
=
0;
y1
=
break
1;
y0
=
0;
break
y1
=
0;
y0
=
0;
y1
=
0;
;
z1 :
;
z2 :
;
z3 :
break
;
}
}
15
Literatur
[1] David C. Black and Jack Donovan. SystemC: From The Ground Up. Kluwer Academic
Publishers, Boston, 2004.
[2] David C. Black and Jack Donovan. SystemC: From the Ground Up. Springer-Verlag
New York, Inc., Secaucus, NJ, USA, 2005.
[3] Frank Ghenassia. Transaction-Level Modeling with Systemc: Tlm Concepts and App-
lications for Embedded Systems. Springer-Verlag New York, Inc., Secaucus, NJ, USA,
2006.
[4] Thorsten Grötker, Stan Liao, Grant Martin, and Stuart Swan. System Design with
SystemC. Kluwer Academic Publishers, Dordrecht, 2002.
[5] Martin Hirsch. Das Entwurfssystem SystemC. Hauptseminar, Fachgebiet Rechnerarchitektur, TU Ilmenau, 2004.
[6] The Open SystemC Initiative. The Open SystemC Initiative Website.http://www.systemc.org/
[7] Wikipedia, the free encyclopedia. SystemC.
[8] Wikipedia, the free encyclopedia. Transaction level modeling.
[9] Heinz-Dietrich Wuttke and Karsten Henke. Schaltsysteme. Pearson Studium, München, 2003.
16