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. Einige Simulationstools wie Modelsim unterstützen SystemC.
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.
Inhaltsverzeichnis |
Da SystemC eine Klassenbibliothek für C++ ist werden hier nur die für SystemC typischen Konstrukte angegeben.
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.
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
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.
Ein Addierer in SystemC:
#include "systemc.h" SC_MODULE(adder) // Moduldeklaration (eine Art Klasse) { sc_in<int> a, b; // Ein Eingang, Port genannt 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(); } } };