SystemC
SystemC viene spesso pensato come un linguaggio di descrizione hardware, simile al VHDL o al Verilog, ma più precisamente è un linguaggio di descrizione dei sistemi, poiché mostra la sua potenza di funzionamento nei modelli a transizione di livelli e comportamentali.
Il SystemC è un insieme di librerie e macro scritte in C++ con cui è possibile simulare processi concorrenti, ovvero che avvengono nello stesso momento, ognuno descritto attraverso la sintassi C++. Nell'ambiente di lavoro del SystemC, gli oggetti descritti in questo modo possono comunicare in un ambiente simulato real-time attraverso segnali di tutti i tipi di dato offerti dal C++, insieme ad altri offerti dalle librerie SystemC, oltre a quelli definiti dall'utilizzatore.
Il linguaggio offre una semantica simile a quella di VHDL e Verilog, ma al costo di un aggravamento sintattico rispetto a questi. D'altro canto, permette un maggiore libertà espressiva, come programmazione orientata agli oggetti e classi template. Più in generale, SystemC è sia un linguaggio di descrizione sia un sistema di simulazione che permette di generare un eseguibile che si comporta come il modello descritto al momento dell'esecuzione. Le prestazioni del sistema di simulazione non sono paragonabili a quelli dei simulatori VHDL/Verilog commercializzati attualmente, pensati per la progettazione a livello RTL.
Storia
- 27 settembre 1999: annunciata Open SystemC Initiative
- 1 marzo 2000: rilasciato SystemC v0.91
- 28 marzo 2000: rilasciato SystemC v1.0
- 1 febbraio 2001: rilasciate specifiche del SystemC v2.0 ed il codice sorgente della v1.2 Beta
- 3 giugno 2003: rilasciato SystemC 2.0.1 LRM (language reference manual)
- 6 giugno 2005: rilasciato SystemC 2.1 LRM and TLM 1.0 (transaction-level modeling)
- 12 dicembre 2005: IEEE approva lo standard IEEE 1666-2005 per il SystemC
- 13 aprile 2007: rilasciato SystemC v2.2
ARM Ltd., CoWare, Synopsys e CynApps unirono le forze per sviluppare SystemC (successivamente CynApps divenne Forte Design Systems), pubblicando la prima bozza nel 1999. Il concorrente principale all'epoca era SpecC, un altro pacchetto open source basato sul C++, sviluppato da membri dell'Università di Irvine, California, e da alcune compagnie giapponesi.
A giugno del 2000 venne formato un gruppo di standardizzazione denominato Open SystemC Initiative con il compito di organizzare le attività e permettere ai concorrenti di Synopsys, Cadence e Mentor Graphics, di avere voce nello sviluppo.
A luglio 2004 Synopsys terminò il proprio coinvolgimento in SystemC.
Caratteristiche
Moduli
I moduli costituiscono i blocchi base di un progetto SystemC. Un modello di solito consiste in diversi moduli che comunicano attraverso le porte. I moduli possono essere pensati come i blocchi costruttivi del linguaggio.
Porte
Le porte permettono la comunicazione fra l'interno del modulo e l'esterno, di solito verso altri moduli.
Processi
I processi sono i componenti principali che realizzano l'elaborazione. Sono ad esecuzione concorrente.
Canali
I canali sono gli elementi che permettono la comunicazione nel SystemC. Possono essere semplici connessione o sistemi di comunicazione complessi, come code FIFO o bus
Canali elementari:
- signal
- buffer
- fifo
- mutex
- semaphore
Interfacce
Le porte usano le interfacce per comunicare con i canali.
Eventi
Permette la sincronizzazione fra i processi.
Tipi di dati
Il SystemC introduce vari tipi di dati che supportano la modellazione dell'hardware.
Tipi standard estesi:
- sc_int<> 64-bit intero con segno
- sc_uint<> 64-bit intero senza segno
- sc_bigint<> intero a precisione arbitraria con segno
- sc_biguint<> intero a precisione arbitraria senza segno
Tipi logici:
- sc_bit singolo bit a 2 valori
- sc_logic singolo bit a 4 valori
- sc_bv<> vettore di sc_bit
- sc_lv<> vettore di sc_logic
Tipi in virgola fissa:
- sc_fixed<> template in virgola fissa con segno
- sc_ufixed<> template in virgola fissa senza segno
- sc_fix tipo in virgola fissa con segno
- sc_ufix tipo in virgola fissa senza segno
Esempio
Esempio di codice per un sommatore:
#include "systemc.h"
SC_MODULE(adder) // dichiarazione di modulo (classe)
{
sc_in<int> a, b; // porte
sc_out<int> sum;
void do_add() // processo
{
sum = a + b;
}
SC_CTOR(adder) // costruttore
{
SC_METHOD(do_add); // register do_add to kernel
sensitive << a << b; // sensitivity list of do_add
}
};
Bibliografia
- T. Grötker, S. Liao, G. Martin, S. Swan, System Design with SystemC. Springer, 2002. ISBN 1402070721
- A SystemC based Linux Live CD with C++/SystemC tutorial
- J. Bhasker, A SystemC Primer, Second Edition, Star Galaxy Publishing, 2004. ISBN 0965039129
- D. C. Black, J. Donovan, SystemC: From the Ground Up, Springer 2005. ISBN 0387292403
- Frank Ghenassia (Editor), Transaction-Level Modeling with Systemc: Tlm Concepts and Applications for Embedded Systems, Springer 2006. ISBN 0387262326