May 31
sistemi hardware sono solitamente modellati con linguaggi di descrizione hardware, come Verilog. Tali lingue sono intesi per aiutare i progettisti scrivere codice che è molto vicino all'hardware generato in modo che la catena strumento per la progettazione di chip può utilizzare il codice per generare l'hardware finale. Lo svantaggio di questo approccio è la flessibilità di programmazione limitata in queste lingue. SystemC è un insieme di librerie di classi costruite su C ++ linguaggio di programmazione, e la sua intenzione è di modellare sistemi hardware e al tempo stesso, utilizzare tutte le caratteristiche del linguaggio di C ++.
1 Scaricare il pacchetto SystemC. SystemC può essere liberamente scaricato da Internet. Prima di scaricare, verrà richiesto di registrarsi con la comunità SystemC. Una volta che il processo di registrazione è completo, il pacchetto può essere scaricato dopo l'accesso al sito web con il nome utente e la password specificati.
2 Scompattare il pacchetto compresso. Il pacchetto compresso avrà un'estensione di file chiamato "tgz". Si supponga che il nome del pacchetto è "<filename> .tgz". Il pacchetto può essere scompattato con i seguenti comandi:
gunzip <filename> .tgz
tar --xvf <filename> .tar
3 Passare alla directory decompressa utilizzando il comando "cd <nome file>". In questa directory, un file chiamato "install" può essere trovato. Questo file fornisce le linee guida passo-passo per l'installazione del pacchetto. Seguire i passaggi ed installare SystemC. Una volta installato SystemC, sistemi hardware possono essere modellati in lingua. Il pacchetto ha disegni di esempio nella directory "esempi".
4 Utilizzare il seguente codice come esempio per modellare sistemi hardware. L'esempio è quello di un disegno di un sistema con due processi. Il primo processo riempie un buffer da un profondo ogni volta che è vuota. Il secondo processo libera e visualizza il valore del buffer. I due processi operano a differenti frequenze di clock. Il codice è spiegato qui di seguito:
Includere i file header necessari.
includere "systemc.h" includere <deque> includere <math.h>
Class "mybuf" è dotato di due orologi di ingresso, clk1 e CLK2. Due metodi cioè, inserire e rimuovere sono definiti, in cui "insert" viene richiamato al fronte positivo di clk1, e "rimuovere" viene richiamato al fronte positivo di "CLK2".
Classe mybuf: sc_module pubblico {
public:
sc_in_clk clk1;
sc_in_clk CLK2;
std :: deque & lt; int> valori;
SC_HAS_PROCESS (mybuf);
mybuf (nome sc_module_name): sc_module (nome) {
inizializzare();
SC_METHOD (inserto);
sensibile & lt; & lt; clk1.pos ();
SC_METHOD (rimuovere);
sensibile & lt; & lt; clk2.pos ();
}
void insert ();
remove void ();
initialize void ();
};
Le seguenti linee di codice implementare i metodi di inserimento e rimozione, insieme a un metodo di inizializzazione.
invalidare mybuf :: inizializzazione () {
values.clear();
}
invalidare mybuf :: remove () {
if (values.size() > 0) {
std :: cout & lt; & lt; sc_time_stamp () & lt; & lt; "" & Lt; & lt; values.front () & lt; & lt; endl;
values.pop_front ();
}
}
revocatorie mybuf :: insert () {
if (values.size() == 0) {
int r = rand ()% 100;
values.push_back (r);
}
}
Il seguente segmento di codice implementa un banco di prova per l'esempio. Il clk1 orologi e CLK2 sono guidati da questo banco di prova.
Classe mybuf_tb: sc_module pubblico {
public:
sc_out & lt; bool> clk1;
sc_out & lt; bool> CLK2;
SC_HAS_PROCESS (mybuf_tb);
mybuf_tb (nome sc_module_name): sc_module (nome) {
SC_THREAD (CLOCK1);
SC_THREAD (Clock2);
}
CLOCK1 vuoto ();
clock2 vuoto ();
};
mybuf_tb vuoto :: CLOCK1 () {
while (true) {
clk1 = 0;
attendere (10, SC_NS);
clk1 = 1;
attendere (10, SC_NS);
}
}
mybuf_tb vuoto :: clock2 () {
while (true) {
clk2 = 0;
aspettare (20, SC_NS);
clk2 = 1;
aspettare (20, SC_NS);
}
}
Il seguente segmento di codice un'istanza del modulo di progettazione e il suo banco di prova. Poi si lega gli orologi in modo che il banco di prova fornisce i valori di clock per il modulo di disegno.
int sc_main (int argc, char * argv []) {
sc_signal <bool> clk1;
sc_signal & lt; bool> CLK2;
mybuf newbuf ( "mybuffer");
newbuf.clk1 (clk1);
newbuf.clk2 (CLK2);
mybuf_tb newbuf_tb ( "mybuffer_tb");
newbuf_tb.clk1 (clk1);
newbuf_tb.clk2 (CLK2);
sc_start ();
ritornare 1;
}