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