Come per modellare sistemi hardware in SystemC

May 31

Come per modellare sistemi hardware in SystemC


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 ++.

istruzione

utilizzando SystemC

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 &lt;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;

}

Consigli e avvertenze

  • Notare che SystemC non può essere utilizzato solo per modellare sistemi hardware, può essere utilizzato per modellare qualsiasi sistema basato su eventi.
  • La descrizione della parte di installazione in questo articolo si presuppone un sistema basato su Linux. Il processo di installazione per Windows sarà leggermente diversa.