- SystemC
-
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 OpenSource-Referenzimplentierung der OSCI (Open SystemC Initiative) auf Version 2.2 aktualisiert um vollständig mit dem IEEE 1666 LRM konform zu sein.
Inhaltsverzeichnis
Syntax
Da SystemC eine Klassenbibliothek für C++ ist werden hier nur die für SystemC typischen Konstrukte angegeben.
Module
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
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
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
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
Weblinks
- Website der Entwicklungsgruppe von SystemC (englisch)
- SystemC-Standard IEEE 1666-2005 (englisch)
- Fraunhofer IIS/EAS SystemC-AMS Homepage (englisch)
- European SystemC Users Group (englisch)
- SCLive, eine Linux-LiveCD mit kompletter SystemC-Simulationsumgebung (englisch)
- Doulos Guide to SystemC (englisch)
- Einsatz von SystemC im Hardware-/Software-Codesign, Diplomarbeit (PDF; 532 kB)
- Veripool SystemC utilites and Verilog to SystemC compiler (englisch)
- 2 Diplomarbeiten zum Thema Simulatorkopplung unter Nutzung von SystemC
Kategorien:- Programmierbare Logik
- Programmiersprache C++
- Hardwarebeschreibungssprache
Wikimedia Foundation.