SystemC ist keine eigene Programmiersprache, sondern eine C++-Klassenbibliothek und Simulationsumgebung für die Modellierung von Hardware und eingebetteten Systemen. Sie ist als IEEE-Standard 1666 genormt (2005, 2011, 2023) und wird von der Accellera Systems Initiative gepflegt. Mit SystemC beschreiben Entwickler Prozessoren, Speicher, Busse und ganze System-on-Chip-Designs auf einer höheren Abstraktionsebene als mit klassischen Hardwarebeschreibungssprachen wie VHDL oder Verilog.
Grundlagen
Ein SystemC-Modell besteht aus Modulen (SC_MODULE), die über Ports und Signale miteinander verbunden werden. Der Einstiegspunkt ist die Funktion sc_main, die Simulation startet man mit sc_start():
#include "systemc.h"
SC_MODULE(Zaehler) {
sc_in<bool> clk;
sc_out<unsigned> wert;
sc_uint<8> reg;
void tick() { reg = reg + 1; wert.write(reg); }
SC_CTOR(Zaehler) {
SC_METHOD(tick);
sensitive << clk.pos();
}
};
int sc_main(int argc, char* argv[]) {
sc_clock clk("clk", 10, SC_NS);
sc_signal<unsigned> w;
Zaehler z("z");
z.clk(clk); z.wert(w);
sc_start(100, SC_NS);
return 0;
}
Wichtige Konstrukte
SC_METHOD– ereignisgesteuerter Prozess ohne eigenen Stack (schnell, aber zustandslos)SC_THREAD/SC_CTHREAD– Thread-Prozesse mit eigenem Stack; CTHREAD für taktsynchrone Abläufesc_signal,sc_in,sc_out,sc_inout– Verbindungselemente und Portssc_clock,sc_time– Takt- und Zeitmodellierungsc_uint,sc_bv– Bitvektoren und Ganzzahltypen fester Breite
Transaction Level Modeling (TLM)
Der TLM-2.0-Standard ergänzt SystemC um eine abstrakte Transaktionsmodellierung: Kommunikationspartner tauschen Transaktionen (Generic Payload) über Sockets aus, ohne Signale im Detail zu modellieren. Dadurch laufen Simulationen von virtuellen Prototypen um Größenordnungen schneller als RTL-Simulationen.
Verwandte Grundlagen: C/C++-Befehle, VHDL-Befehle, Chisel-Befehle (Hardware-Konstruktionssprache), SpinalHDL-Befehle.