Symulacja MB w środowisku Active-HDL
Transkrypt
Symulacja MB w środowisku Active-HDL
Symulacja systemu z procesorem MicroBlaze w środowisku ActiveHDL wersja 6.06.2007 Zespół Rekonfigurowalnych Systemów Obliczeniowych AGH Kraków http://www.fpga.agh.edu.pl/ Poniższe ćwiczenie jest kontynuacją ćwiczenia firmy Xilinx „EDK MicroBlaze Tutorial”. Aby przystąpić do wykonania tego ćwiczenia należy w pierwszej kolejności dokonać realizacji systemu z procesorem MicroBlaze wg. powyższego ćwiczenia. Celem ćwiczenia jest na zapoznaniu się ze sposobem i możliwością symulacji systemu zaprojektowanego przy wykorzystaniu pakietu EDK przy pomocy dostępnego do symulacji środowiska ActiveHDL firmy ALDEC Symulacja strukturalna systemu MicroBlaze Powyższa symulacja polega na sprawdzeniu działania systemu MB po syntezie systemu do sieci połączeń elementów bibliotecznych technologii FPGA firmy Xilinx. Jest to tak zwana ang. structural simulation. Oznacza to, że: • symulacja nie uwzględnienia opóźnień czasowych połączeń pomiędzy elementami logicznymi powstałymi wskutek implementacji czyli rozmieszczenia elementów w strukturze FPGA i połączenia tych elementów przy pomocy dostępnych zasobów połączeniowych • symulacja nie umożliwia śledzenia kodu źródłowego systemu czego konsekwencja jest brak możliwości zlokalizowania ewentualnych błędów funkcjonalnych w opracowywanym kodzie. Ten sposób symulacji jest właściwy jedynie w celu weryfikacji pracy układu jeżeli zastosowane w systemie moduły IPCore były już wcześniej przetestowane i sprawdzone przy pomocy symulacji funkcjonalnej (to znaczy symulacji kodu źródłowego modułów). Nie jest zalecany do weryfikacji poprawności funkcjonalnej nowo tworzonych modułów IPCore. W naszym przypadku symulujemy pracę gotowych, sprawdzonych modułów dostarczonych przez Xilinx ten sposób symulacji jest więc dopuszczalny. Brak możliwości dokonania symulacji funkcjonalnej (ang. behavioral simulation) systemu wynika z braku dostępu do źródeł stosowanych IPCore. Przygotowanie systemu z ćwiczenia „EDK MicroBlaze Tutorial” do symulacji. 1. Usunąć (wstawić komentarz) z wykonywanego przez nasz system z Microblaze programu funkcje komunikacji z portem RS232 (funkcja xil_prinft) oraz funkcję opóźnień czasowych (funkcja sleep()). Należy tego dokonać w programie Platform Studio w zakładce „Applications” w kodzie programu. Chodzi o to, aby przeprowadzana symulacja nie była zbyt czasochłonna Uwaga. Należy sobie zdawać sprawę, że przesymulowanie kilku sekund pracy sytemu MB wymaga kilkunastu minut pracy symulatora. 2. W menu Project->Project Options wybrać strukturalny typ przeprowadzanej symulacji. Nie zaznaczamy żadnych bibliotek. Zaznaczamy: OK 3. Wygenerować model systemu przeznaczony do symulacji poprzez funkcję z menu Simulation -> Generate Simulation HDL files. W wyniku działania generatora w katalogu ./simulation/structural powstaje symulacyjny model systemu. Przed przystąpieniem do dalszej części ćwiczenia należy sprawdzić, czy wspomniany katalog rzeczywiście został utworzony. Praca z programem AHDL 4. Uruchomić program Active-HDL. Założyć nowy projekt. Ze względów porządkowych dobrze jest utworzyć ten projekt w katalogu znajdującym się w katalogu projektowym EDK. Ułatwi to dalsza pracę z systemem. 5. Z katalogu <Moj projekt>/simulation/structural dodać do tworzonego projektu wszystkie pliki z rozszerzeniem .vhd. Warto przy tym zwrócić uwagę na check box: „Make Local Copy”. Jeżeli podczas dołączania do projektu nowych plików odznaczymy ten box, to później jeżeli dokonamy zmian w EDK Platform Studio i na nowo wygenerujemy model symulacyjny będą one automatycznie uwzględniane w naszym otwartym projekcie AHDL 6. Kompilujemy próbnie pliki przy pomocy funkcji menu Design->Compile All Uwaga. W przypadku pojawienia się pytania „Up to date?” zaznaczamy Nie. Przygotowanie pliku testbench do symulacji systemu Dalsza praca z systemem wymaga użycia pliku testowego testbench. Mimo że AHDL umożliwia symulację bezpośrednio testowanego systemu poprzez ustawienie jego pliku nadrzędnego jako Top Level, a następnie uruchomienie symulacji to metoda ta nie sprawdzi się przy testowaniu projektu z EDK 1. Do symulacji systemu posłużymy się plikiem testbench utworzonym automatycznie przez środowisko Active-HDL. W skompilowanej bibliotece odnaleźć moduł system(structure) kliknąć go prawym przyciskiem myszy i ustawić moduł jako nadrzędny (Set as TopLevel). Następnie wygenerować plik testbench dla tego dla tego modułu: kliknąć go prawym przyciskiem myszy i wybrać Generate TestBench Zaznaczamy: Dalej Zaznaczamy: Dalej Zaznaczamy: Dalej Zaznaczmy: Zakończ W wyniku wykonanych operacji w drzewie projektu AHDL utworzony zostanie katalog „TestBench” z 3 plikami: „system_TB.vhd”, „system_TB_tim_cfg.vhd” i „system_TB_runtest.do”. 2. Aby symulacja przyniosła efekt należy zainicjować pamięć programu symulowanego systemu binariami otrzymanymi w wyniku kompilacji kodu programu. Bianria te znajdują cię w pliku system_ini.vhd. Należy zapoznać się ze strukturą tego pliku a następnie w pliku żródłowym naszego testbench’a tj. pliku system_TB.vhd zmienić typ konfiguracji systemu. Zamiast : configuration TESTBENCH_FOR_system of system_tb is for TB_ARCHITECTURE for UUT : system use entity work.system(imp); end for; end for; end TESTBENCH_FOR_system; powinno byc: configuration TESTBENCH_FOR_system of system_tb is for TB_ARCHITECTURE for UUT : system use configuration work.system_conf; end for; end for; end TESTBENCH_FOR_system; W ten sposób dyrektywy generic typu: INIT_xx w module lmb_bram_wrapper opisującym pamięć programu BRAM zostaną z wartości domyślnych zmienione na wartości z konfiguracji system_conf. Dyrektywa generic INIT_XX tradycyjnie służy do inicjowania zawartości pamięci block ram w narzędziach Xilinx. Jest ona rozpoznawana również przez kompilator i umożliwia inicjowanie pamięci podczas konfiguracji sytemu w FPGA. Zawartość pamięci znajduje się wtedy w pliku .bit. 3. Wpisać do TestBench wymuszenia sygnałów CLK_PROC i RESET_PROC: CLK_PROC: process(CLK) begin CLK<=not CLK after 10ns end RESET_PROC: process: RST<=’1’ wait for 20ns RST<=’0’ wait; end process; 4. Uruchomić plik “system_TB_runtest.do” w celu skompilowania TestBench. Klikamy prawym klawiszem myszy i wybieramy polecenie „Execute”. Uwaga. W przypadku pojawienia się pytania „Up to date?” zaznaczamy Nie. 5. Dodać do listy obserwowanych sygnałów magistralę instrukcji LMB (adres i dane). Należy w tym celu: • przejść do zakładki „Structure” w oknie projektu AHDL. • odszukać skompilowany moduł procesora MicroBlaze • wyświetlić listę portów procesora MicroBlaze i odszukać wspomniane magistrale. Nazwy użyte dla poszukiwanych sygnałów można znaleźć w dokumencie http://galaxy.uci.agh.edu.pl/~jamro/opb/org/mb_ref_guide.pdf na stronie 33 w tablicy 2-2 (nazwy wspomnianych magistral to: INSTR i INSTR_ADDR) 6. Jeżeli wszystko zostało wykonane poprawnie to na magistrali instrukcji pojawiać się będą inkrementowane adresy i dane odczytywane z pamięci, a po pewnym czasie można zaobserwować zmiany na liniach „leds”. Częste błędy to: • niewłaściwa polaryzacja sygnału „sys_rst” • brak zmiany konfiguracji dla pamięci BRAM w pliku testbench Debugowanie programu 1. W programie Platform Studio ustawić opcje kompilacji (w zakładce Aplications, w rozwiniętym drzewie projektu dwa razy kliknąć na Compiler Options ) tak aby generowane były pliki wynikowe dołączonymi z symbolami oraz dla lepszej spójności kodu skompilowanego ze źródłowym wyłączyć optymalizację (Optimization Level: No optimization) Zaznaczamy: OK 2. Skompilować powtórnie program poprzez menu Software->Build All User Applications 3. Uruchomić okno debuggera w programie Platform Studio: Debug->Launch Software Debugger. 4. W oknie debugera zmienić tryb SOURCE na MIXED i prześledzić wykonanie pętli w języku asemblera mikroprocesora. 5. Poprzez menu Platform Studio uruchomić EDK Shell: Project->Launch EDK Shell. Nawigować do katalogu <<Mó_ projekt>/<nazwa_projektu_softwarowego> i odszukać plik executable.elf. Uruchomić program deassembulujący: mb-objdump –d executable.elf > objdump. Otworzyć plik „objdump” w oknie Platform Studio lub ActiveHDL (w edytorze Notepad plik będzie wyglądał bardzo źle ponieważ jest to plik tekstowy typu UNIX). Porównać adresy w pamięci programu wyświetlone w objdump z wyświetlanymi w oknie symulatora Active-HDL na magistrali adresowej i danych. Prześledzić kod asemblera który odpowiada poszczególnym operacjom opisanym w języku C. Przeanalizować linię: j = (j+1)%16; (opis komend instrukcji maszynowych procesora MicroBlaze znajduje się w dokumentacji procesora).