Hårdvara system brukar modelleras med hårdvarubeskrivande språk såsom Verilog . Sådana språk är avsedda att hjälpa konstruktörer att skriva kod som är mycket nära till den genererade hårdvaran så att verktyget kedjan för chip design kan använda koden för att generera den slutliga maskinvaran . Nackdelen med detta tillvägagångssätt är den begränsade programmering flexibilitet på dessa språk . SystemC är en uppsättning klassbibliotek som bygger på C + + -programmering språk , och dess avsikt är att modellsystem hårdvara och samtidigt , använda alla språkliga funktioner i C + + . Saker du behöver
C + + kompilator som g+ + Review Operativsystem
Visa fler instruktioner
Använda SystemC
1
Ladda SystemC paketet . SystemC kan fritt laddas ner från Internet . Innan du laddar ner , kommer du att uppmanas att registrera sig med SystemC samhället . När registreringen är klar , kan paketet hämtas efter att logga in på hemsidan med det angivna användarnamnet och lösenordet . Den komprimerade paketet
2
Packa . Det komprimerade paketet kommer att ha en filändelse som heter " tgz " . Antag att namnet på paketet är " . Tgz " . Paketet kan packas upp med följande kommandon :
gunzip TGZ tjära - xvf tjära
3 < . . p > Byt till den uppackade katalogen genom att använda " cd " kommandot . I denna katalog kan en fil som heter " INSTALL " hittas . Den här filen innehåller steg - för-steg- anvisningar för installation av paketet . Följ stegen och installerar SystemC . När SystemC är installerat , kan hårdvara system modelleras i språket . Paketet har prov mönster i " exemplen " katalogen .
4 Använd följande kod som exempel på system modell hårdvara . Exemplet är det av en utformning av ett system med två processer . Den första processen fyller en en - djup buffert närhelst den är tom. Den andra processen rensar det och visar värdet av bufferten. De två processerna verkar på olika klockfrekvenser . Koden förklaras nedan : .
Innefattar nödvändiga header -filer # include " systemc.h "
# include
# omfatta
Class " mybuf " är har två ingångar klockor, cLK1 och clk2 . Två metoder nämligen , sätta in och ta definieras , där " insert " åberopas vid positiv flank på clk1 , och " ta bort " åberopas vid den positiva kanten av " clk2 "
klass mybuf : . Offentliga sc_module {
allmänheten :
sc_in_clk clk1 ,
sc_in_clk clk2 ,
std :: deque värden ,
SC_HAS_PROCESS ( mybuf ) ;
mybuf ( sc_module_name namn ) : sc_module ( namn ) {
initialize ( ) ;
SC_METHOD ( insats ) ,
känslig < < clk1.pos ();
SC_METHOD (ta bort ),
känslig << clk2.pos ();
}
void infoga ( ) ;
void remove ( ) ;
void initialize ( ) ;
};
följande kodrader genomföra insättning och uttag metoder , tillsammans med en initieringsmetoden
void mybuf :: initialize ( ) {
values.clear ( ) ;
}
void mybuf . : : ta bort ( ) {
om ( values.size ( ) > 0 ) {
std :: cout << sc_time_stamp ( ) << " " << values.front ( ) << endl;
values.pop_front ( ) ;
}
}
void mybuf :: insert ( ) {
om ( values.size ( ) == 0 ) {
int r = rand ( ) % 100 ;
values.push_back ( R ) ;
}
}
följande kod segmentet genomför ett test - bänk för exempel . Klockorna CLK1 och clk2 drivs från detta test - bänk
klass mybuf_tb : offentlig sc_module {
allmänheten : .
Sc_out clk1 ;
sc_out clk2 ,
SC_HAS_PROCESS ( mybuf_tb ) ;
mybuf_tb ( sc_module_name namn ) : sc_module ( namn ) {
SC_THREAD ( clock1 ) ;
SC_THREAD ( clock2 ) ;
}
void clock1 ();
void clock2 ();
};
void mybuf_tb :: clock1 ( ) {
while ( true ) {
clk1 = 0 ;
vänta ( 10 , SC_NS ) ;
clk1 = 1 ;
vänta ( 10 , SC_NS ) ;
}
}
void mybuf_tb :: clock2 ( ) {
while ( true ) {
clk2 = 0 ;
vänta ( 20 , SC_NS ) ;
clk2 = 1 ;
vänta ( 20 , SC_NS ) ;
}
}
följande kod segmentet instansieras designen modulen och dess test - bänk . Då det binder klockorna så att testet - bänken ger klockan värdena till designmodulen .
Int sc_main (int argc , char * argv []) {
sc_signal clk1 ;
sc_signal clk2 ;
mybuf newbuf ( " mybuffer ");
newbuf.clk1 ( clk1 ) ;
newbuf . clk2 ( clk2 ) ;
mybuf_tb 1 ;
}