SystemC

aus Wikipedia, der freien Enzyklopädie
Wechseln zu: Navigation, Suche

SystemC ist eine Modellierungs- und Simulationssprache insbesondere für die Entwicklung von komplexen elektronischen Systemen, die sowohl Hardware- als auch Softwarekomponenten enthalten.

Im Gegensatz zu reinen Hardwarebeschreibungssprachen (wie VHDL und Verilog-HDL) wird SystemC vorrangig zur Modellierung auf noch höheren Abstraktionsebenen eingesetzt, womit Simulationen um den Faktor 100 bis 1000 schneller werden können und selbst längere Programme, die auf der beschriebenen Hardware ablaufen, mitsimuliert werden können. Aber auch die Modellierung von synthetisierbaren Schaltungen auf dem sogenannten Register Transfer Level sind mit SystemC als Substitut für VHDL oder Verilog möglich. Weitere treibende Vorteile von SystemC sind daneben einerseits die freie Verfügbarkeit als Open Source und andererseits die Verwandtschaft zu der verbreiteten Programmiersprache C++.

SystemC ist keine eigenständige Sprache, sondern eine (Klassen-)Bibliothek für C++. Sie erweitert die Sprache mittels Makros und Funktionen um die notwendigen Mittel, um zusätzlich typische Eigenschaften von Hardware modellieren zu können wie 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.

SystemC eignet sich, wie z.B. auch die Modellierungssprache E, für die Modellierung von Protokollen und Peripherie, um anhand dieser die Fehlerfreiheit einer digitalen Schaltung zu überprüfen. SystemC ist jedoch nicht nur eine Modellierungssprache, sondern gleichzeitig ihr eigener Simulationskern. Dieser ist in der SystemC-Bibliothek enthalten (Bsp.: in jeder Referenzimplementierung der OSCI), sodass durch Kompilieren eines System-Quellcodes ein ausführbarer Simulator mit dem Verhalten des Quellcodes entsteht. Jedoch wird SystemC auch von kommerziellen Simulationstools wie Modelsim unterstützt.

Viele Universitäten arbeiten an effizienten Programmen zur Schaltungssynthese aus SystemC-Modellen heraus. Einige Unternehmen bieten Lösungen an, die aus bestimmten SystemC-Codes Netzlisten für ASICs oder FPGAs generieren können. 2005 wurde die Version 2.1 der SystemC-Referenzbeschreibung von der internationalen Ingenieursvereinigung IEEE als Standard ratifiziert (IEEE 1666-2005). Dieser Standard stellt das aktuelle LRM (Language Reference Manual) dar und ist bei der IEEE kostenlos als Download verfügbar (siehe Weblinks). Im Jahr 2007 wurde die Open-Source-Referenzimplentierung der OSCI (Open SystemC Initiative) auf Version 2.2 aktualisiert um vollständig mit dem IEEE 1666 LRM konform zu sein.

Syntax[Bearbeiten]

Da SystemC eine Klassenbibliothek für C++ ist werden hier nur die für SystemC typischen Konstrukte angegeben.

Module[Bearbeiten]

Module dienen dazu, um komplexere Systeme in überschaubare Teile zu gliedern. Sie bilden Bausteine, sind nach außen über Ports zugänglich und können wiederum Module enthalten. Die Syntax lautet

SC_MODULE (Modulname) {
// Modulinhalt
};

Eine Instanz des Moduls wird durch den Konstruktor

SC_CTOR (Modulname) {. . . }

realisiert.

Signale und Ports[Bearbeiten]

Ports bilden die Schnittstelle des Moduls nach außen. Es gibt drei Arten von Ports und als vierten Typ Signale:

sc_in<Porttyp> PortInName; // Eingang
sc_out<Porttyp> PortOutName; // Ausgang
sc_inout<Porttyp> PortInOutName; // Bidirektional
sc_signal<Signaltyp> SigName; // Signal

Prozesse[Bearbeiten]

Die Funktionalität der Module wird durch Prozesse gebildet. Es gibt drei Arten von Prozessen.

Methode-Prozesse werden aufgerufen, wenn sich ein Signal aus der Sensitivitätsliste ändert und übergeben nach ihrer Ausführung die Kontrolle wieder an den Simulator zurück. Durch

SC_METHOD (Funktionsname); 

wird eine bestimmte Funktion, die zuvor im Modul deklariert werden muss, installiert. Die Sensitivitätsliste wird durch

sensitive << Signal1 << Signal2 . . .

erzeugt.

Im Gegensatz zu Methode-Prozessen werden Thread-Prozesse nur einmal gestartet und durchlaufen immer wieder die gleiche Schleife, in der wait()-Kommandos zur vorübergehenden Unterbrechung dienen.

SC_THREAD (Funktionsname);

Clocked-Thread-Prozesse sind synchrone Thread-Prozesse, deren Aktionen erst zur nächsten Taktflanke sichtbar werden. Im Unterschied zu den Thread-Prozessen erfolgt keine Angabe der Sensitivitätsliste sondern das zweite Argument im Aufruf

SC_CTHREAD (Funktionsname, Taktflanke);

spezifiziert, welche Flanke des Taktsignals den Prozess triggert.

Beispiel[Bearbeiten]

Ein Addierer in SystemC:

#include "systemc.h"

SC_MODULE(adder) // Moduldeklaration (eine Art Klasse)
{
  sc_in<int> a, b;        // Zwei Eingangs-Ports (a und b)
  sc_out<int> sum;        // Ein Ausgangs-Port

  SC_CTOR(adder)
  {
     SC_THREAD(doit);
     sensitive <<a <<b;
  }
     void doit()
     {
       while(true)
       {
         sum.write(a.read() + b.read());
         wait();
       }
     }
};

Siehe auch[Bearbeiten]

Literatur[Bearbeiten]

  • Frank Kesel, Modellierung von digitalen Systemen mit SystemC. Von der RTL- zur Transaction-Level-Modellierung. 2012. ISBN 978-3-486-70581-2

Weblinks[Bearbeiten]