BME Hardver modellezés SystemC-vel és SDL grafikus könyvtárral Visual Stúdió alatt Visual Studio, SystemC, SDL Tóth Gergely Endre 2013.03.18.
1 Bevezetés Ebben a dokumentumban leírom, hogy hogyan lehet Visual Studio segítségével SystemC nyelven fejleszteni. Ezután ismertetem, hogy hogyan hozzunk létre SDL grafikus könyvtár+systemc projektet. Az egyes lépéseket Windows8 alatt, Visual Studio 2012-vel mutatom be, ezen a platformon teszteltem. Ugyanakkor működni kell Window7 és/vagy Visual Studio 2010 segítségével is. Ha csak SystemC-t akarunk, akkor csak a 2. fejezetet olvassuk el. Ha SDL-t is szeretnénk, akkor csak a 3. fejezet lényeges. Az SDL projekt létrehozásának lépései az [5] alapján készültek. A SystemC projekt beállításait a [6] forrás adta meg. Jelen dokumentum egyesíti a két forrást, és felfedi hogyan lehet egy olyan projektet létrehozni, amelyben mind az SDL, mind a SystemC elérhető Visual Studio alatt. Vannak ugyanis olyan beállítások, amelyek ütköznek a két fenti dokumentum alapján (Runtime library: MTd!). 2 SystemC projekt létrehozása 2.1 SystemC lib fordítása 1. Töltsük le a legújabb SystemC-t a hivatalos honlapról [1]. Esetemben a 2.3.0 verzió a legfrissebb. 2. A letöltött fájl tartalmát érdemes a Visual Studio Project mappájába egy SystemC könyvtárba tenni 3. Az így kicsomagolt mappák között keressük ki a SystemC\msvc80\SystemC\SystemC.sln fájlt, és nyissuk meg a Visual Studióval a. Ha feljön a Conversion Wizard, akkor értelemszerűen menjünk végig rajta 4. Visual Studio 2012 esetén elvégzendő (2010 esetén nem kell): a. A Header fájlok között keressük ki a sc_cmnhdr.h fájlt, és módosítsuk a következőképpen a lent látható pár sort (ez egy ismert bug, az új SystemC-k valószínűleg mentesek lesznek tőle. A hivatalos forrás erről a bug-ról [2]): Eredeti Módosított // MSVC6.0 for() scope bug #if _MSC_VER < 1300 // MSVC6.0 for() scope bug #define for if( false ); else # define for if( false ); else for for #endif #endif #endif b. Enélkül a lib nem fog fordulni! 5. BUILD -> Build Solution vagy F7-tel lefordíthatjuk a projectet (pár warning lehet a deprecated funkciók miatt, de a projektnek fordulnia kell). Érdemes debug és release módban is fordítani 6. A kimenete a Debug és Release mappában lévő egy-egy SystemC.lib 1
2.2 SystemC projekt létrehozása Hozzunk létre egy új projektet: A megjelenő új ablakon az Application Settings résznél klikklejük be az Empty Project-et, majd Finish! Ezután a menüsorból Project -> Properties. Utána Configuration Properties -> C/C++ -> General ablakban az Additional Include Directories-hez adjuk hozzá a SystemC src mappáját: a legördülő listából válasszuk ki az Edit-et, és keressük ki a megfelelő mappát ( \Visual Studio 2012\Projects\SystemC\src\), majd OK. 2
Állítsuk át még a következőket: 3
Adjuk hozzá a \Visual Studio 2012\Projects\SystemC\msvc80\SystemC\Debug elérést a lenti kép alapján: 4
Ha akarunk release módot is, akkor bal felső sarokban tegyük át release-re, és végezzük el újra a fentieket. Ezek után OK-zuk le a Property Pages ablakot, és adjunk a projekthez egy main.cpp-t a következővel: #include "systemc.h" SC_MODULE (hello_world) { SC_CTOR (hello_world) { /*Empty*/ void say_hello() { cout << "Hello World.\n"; ; int sc_main(int argc, char* argv[]) { hello_world hello("hello"); hello.say_hello(); return(0); A projektet lefordítva, és futtatva az eredmény: Így kaptunk tehát egy SystemC-s Console Application projektet, ami fejlesztéshez, debugoláshoz kiváló. Érdemes a fejlesztést itt kezdeni. 3 SystemC és SDL projekt létrehozása 3.1 SystemC lib fordítása Ld. előző fejezet (SystemC lib fordítása). 5
3.2 SDL libek fordítása Töltsük le a hivatalos honlapról [3] a legújabb SDL forrás fájlokat (ne a lefordítottakat, mert azok MD módban vannak fordítva, SystemC-hez MtD kell, ezért fordítanunk kell egyet magunknak!). A kicsomagolt mappák között keressük ki a VisualC-t és nyissuk meg az SDL.sln-t. A megjelenő párbeszéd ablakokat értelemszerűen okézzuk le, hogy a Visual Studio importálni tudja a projektet. Mind az SDL és SDLmain projekt tulajdonágát változtassuk meg: Ezután jobb klikk az SDL projekten és Build. Ugyanezt tegyük meg az SDLmain-nal! A következő fájlok kellenek ezek után: a VisualC\Debug mappából a SDL.lib, az SDLmain\Debug mappából az SDLmain.lib és az SDL\debug mappából az SDL.dll (ha akarunk release-t, akkor fordítsunk azt is, értelemszerűen az a release mappában lesznek). Ezeket a fájlokat érdemes kitenni egy SDL\lib mappába (x64/x86 dolgokra figyeljünk! Alapból minden x86, ami megfelelő első közelítésben). Szükségünk lesz még továbbá az include mappára (a lib és dll fájlok belépési pontjait tartalmazzák), ezt is érdemes a fenti SDL mappába bemásolni. Tehát van egy SDL mappánk egy lib és include könyvtárral, benne a megfelelő fájlokkal. 3.3 Projekt létrehozása Hozzunk létre egy új projektet: 6
Ezután a menüsorból Project -> Properties. Utána Configuration Properties -> C/C++ -> General ablakban állítsuk be a SystemC és SDL útvonalakat: Továbbá: 7
8
9
Ha akarunk release módot is, akkor bal felső sarokban tegyük át release-re, és végezzük el újra a fentieket. 10
Ha megvagyunk, adjunk a projekthez egy cpp fájlt a következő tartalommal: #include "SDL.h" int main(int argc, char** argv){ SDL_Init(SDL_INIT_EVERYTHING); SDL_Quit(); return 0; A projektnél ahova ez a cpp fájl került másoljuk mellé az SDL.dll-t (ott van az SDL mappánk lib könyvtárában, ha úgy jártunk el, ahogy előzőleg írtam). Ezután fordítsuk a fájlt, és futassuk le. Nem szabad semmilyen hibaüzenetnek, exception-nak keletkeznie. Ha igen, akkor az SDL beállításai közül kihagytunk valamit. Ha eddig OK, akkor a következőt másoljuk a main.cpp-be: #include "SDL.h" #include "systemc.h" SC_MODULE (counter) { sc_in_clk clock; sc_in<bool> reset; sc_in<bool> enable; sc_out<sc_uint<4> > out; sc_uint<4> count; void work() { while(true) { wait(); if (reset.read() == 1) { count = 0; out.write(count); else if (enable.read() == 1) { count = count + 1; out.write(count); SC_CTOR(counter) { SC_THREAD(work); sensitive << clock.pos(); ; count = 0; int main(int argc, char** argv){ SDL_Init(SDL_INIT_EVERYTHING); SDL_Quit(); sc_set_time_resolution(1, SC_US); counter cnt1("cnt1"); sc_clock clock("clk", sc_time(2,sc_us), 0.5, sc_time(0,sc_us), 1 ); sc_signal<bool> res; 11
sc_signal<bool> en; sc_signal<sc_uint<4> > out; cnt1.clock(clock); cnt1.reset(res); cnt1.enable(en); cnt1.out(out); sc_trace_file *wf = sc_create_vcd_trace_file("counter"); sc_trace(wf, clock, "clock"); sc_trace(wf, res, "reset"); sc_trace(wf, en, "enable"); sc_trace(wf, out, "out"); res.write(true); en.write(false); sc_start(2, SC_US); res.write(false); en.write(true); sc_start(20, SC_US); sc_close_vcd_trace_file(wf); return 0; Ez már SystemC és SDL. Fordítás, és futás után nem lehet semmilyen hibaüzenet vagy exception. A kimenet egy counter.vcd, aminek a jelalakja: Ez a projekt használható, elérjük benne a SystemC-t és az SDL-t. Egy valamire viszont felhívnám a figyelmet: a main függvénynek így kell kinéznie a SystemC szintaktika ellenére: int main(int argc, char** argv){ return 0; Ez az SDL miatt kötelező. Tesztjeim alapján a SystemC-nek nem okoz gondot. A projektről a FILE -> Export Template funkcióval készíthetünk egy sablon projektet, így nem kell a fentieket új projekt esetén elvégezni. 12
3.4 Eredmény Egy általam írt SystemC-s 6502-es processzor, SDL grafikus felület és Czirkos Zoltán által írt kukacos játék eredménye: Egy SystemC-t és SDL-t használó forrás elérhető Czirkos Zoltán honlapjáról [4], ebbe a projektbe illesztve az eredmény: 13
4 Irodalomjegyzék [1] SystemC hivatalos forrás: http://www.accellera.org/downloads/standards/systemc [2] SystemC bug Visual Studio 2012 alatt: http://www.accellera.org/discussion_forums/systemcforum/archive/msg?list_name=systemc-forum&monthdir=201209&msg=msg00032.html [3] SDL grafikus könyvtár: http://www.libsdl.org [4] Czirkos Zoltán: SystemC és SDL segítségével egy kukacos játék: http://www.eet.bme.hu/~czirkos/icterv/syscvideo-0.3.zip [5] TwinklebearDev: Setting up SDL in Visual Studio: twinklebeardev.blogspot.hu/2012/07/setting-up-sdl-in-visual-studio.html [6] Mihai Fonoage: SystemC with Microsoft Visual Studio 2005 and 2008: http://www.ict.kth.se/courses/il2452/sept2009/tutorial-systemc-with-microsoft-visual- Studio.pdf 14