KOMPILATOR JĘZYKA VHDL DO PROJEKTOWANIA UKŁADÓW LOGICZNYCH. Edytor: prof. dr hab. inż. Włodzimierz Bielecki



Podobne dokumenty
Laboratorium 10 Temat: Zaawansowane jednostki testowe. Operacje na plikach. Funkcje.

VHLD Very High Speed Integrated Circuit (VHSIC) Hardware Description Language (VHDL)

Metody Kompilacji Wykład 1 Wstęp

Modelowanie złożonych układów cyfrowych (1)

Języki programowania zasady ich tworzenia

Krótkie wprowadzenie do ModelSim i Quartus2

Elementy języka VHDL. obiekty typy danych atrybuty pakiety i biblioteki instrukcje współbieżne instrukcje sekwencyjne. PUE-w3 1

Projektowanie w VHDL

Wstęp do programowania

Języki opisu sprzętu VHDL Mariusz Rawski

Analiza leksykalna 1. Teoria kompilacji. Dr inż. Janusz Majewski Katedra Informatyki

Politechnika Białostocka Wydział Elektryczny Katedra Automatyki i Elektroniki. ĆWICZENIE Nr 4 (3h) Przerzutniki, zatrzaski i rejestry w VHDL

Altera Quartus II. Opis niektórych komponentów dostarczanych razem ze środowiskiem. Opracował: mgr inż. Leszek Ciopiński

Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Bloki anonimowe w PL/SQL

Układy reprogramowalne i SoC Język VHDL (część 4)

Projektowanie hierarchiczne Mariusz Rawski

1 Podstawy c++ w pigułce.

Opis: Instrukcja warunkowa Składnia: IF [NOT] warunek [AND [NOT] warunek] [OR [NOT] warunek].

Uwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre)

Instrukcja do ćwiczenia P4 Analiza semantyczna i generowanie kodu Język: Ada

Pojedyncze wartości zadeklarowanego typu Ustawiane przed rozpoczęciem symulacji bez moŝliwości

Przykładowe pytania z części PSPICE. 1. Podaj zasady tworzenia pliku symulacyjnego. 2. Czy składnia PSPICE jest czuła na wielkość liter? 3.

Programowalne układy logiczne

WOJSKOWA AKADEMIA TECHNICZNA im. Jarosława Dąbrowskiego LABORATORIUM UKŁADÓW PROGRAMOWALNYCH I SPECJALIZOWANYCH

Projektowanie Urządzeń Cyfrowych

Informatyka I. Typy danych. Operacje arytmetyczne. Konwersje typów. Zmienne. Wczytywanie danych z klawiatury. dr hab. inż. Andrzej Czerepicki

1. ISE WebPack i VHDL Xilinx ISE Design Suite 10.1 VHDL Tworzenie projektu Project Navigator Xilinx ISE Design Suite 10.1 File

Podstawy programowania skrót z wykładów:

Analiza leksykalna 1. Języki formalne i automaty. Dr inż. Janusz Majewski Katedra Informatyki

Sposoby projektowania systemów w cyfrowych

Algorytm. a programowanie -

Układy VLSI Bramki 1.0

Specyfika projektowania Mariusz Rawski

Programowanie w języku C++ Grażyna Koba

L E X. Generator analizatorów leksykalnych

Algorytmika i Programowanie VBA 1 - podstawy

Język programowania PASCAL

1. Pierwszy program. Kompilator ignoruje komentarze; zadaniem komentarza jest bowiem wyjaśnienie programu człowiekowi.

KONSTRUKCJA KOMPILATORÓW

Systemy Czasu Rzeczywistego FPGA

Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Opracował Jan T. Biernat

XQTav - reprezentacja diagramów przepływu prac w formacie SCUFL przy pomocy XQuery

3. Podaj elementy składowe jakie powinna uwzględniać definicja informatyki.

Język programowania DELPHI / Andrzej Marciniak. Poznań, Spis treści

1 Wstęp. 2 Proste przykłady. 3 Podstawowe elementy leksykalne i typy danych. 6 Opis strukturalny. 7 Moduł testowy (testbench)

1 Podstawy c++ w pigułce.

Elżbieta Kula - wprowadzenie do Turbo Pascala i algorytmiki

Literatura. adów w cyfrowych. Projektowanie układ. Technika cyfrowa. Technika cyfrowa. Bramki logiczne i przerzutniki.

Programowanie. programowania. Klasa 3 Lekcja 9 PASCAL & C++

Zadanie analizy leksykalnej

Ada-95. Dariusz Wawrzyniak

Jeśli chcesz łatwo i szybko opanować podstawy C++, sięgnij po tę książkę.

Politechnika Białostocka Wydział Elektryczny Katedra Automatyki i Elektroniki. ĆWICZENIE Nr 8 (3h) Implementacja pamięci ROM w FPGA

Układy reprogramowalne i SoC Testbenches. Symulacja sterowana zdarzeniami.

Gramatyki atrybutywne

Metody Kompilacji Wykład 3

Politechnika Białostocka Wydział Elektryczny Katedra Automatyki i Elektroniki

INFORMATYKA, TECHNOLOGIA INFORMACYJNA ORAZ INFORMATYKA W LOGISTYCE

Programowanie komputerów

Aby w pełni przetestować układ o trzech wejściach IN_0, IN_1 i IN_2 chcemy wygenerować wszystkie możliwe kombinacje sygnałów wejściowych.

Projektowanie automatów z użyciem VHDL

Język HDL - VERILOG. (Syntetyzowalna warstwa języka) Hardware Description Language Krzysztof Jasiński PRUS PRUS

Politechnika Białostocka Wydział Elektryczny Katedra Automatyki i Elektroniki

INFORMATYKA W SZKOLE. Podyplomowe Studia Pedagogiczne. Dr inż. Grażyna KRUPIŃSKA. D-10 pokój 227

Języki formalne i techniki translacji

Programowanie. Pascal - język programowania wysokiego poziomu. Klasa 2 Lekcja 9 PASCAL

LABORATORIUM ELEKTRONIKA Projektowanie koderów, transkoderów i dekoderów w języku VHDL

Projektowanie Scalonych Systemów Wbudowanych VERILOG

Podstawy programowania. Wykład 6 Wskaźniki. Krzysztof Banaś Podstawy programowania 1

Układy reprogramowalne i SoC Język VHDL (część 2)

Projekt prostego procesora

Tranzystor JFET i MOSFET zas. działania

Sterowniki Programowalne (SP)

1 Przygotował: mgr inż. Maciej Lasota

Programowanie w języku Python. Grażyna Koba

LibreOffice Calc VBA

Skrypty i funkcje Zapisywane są w m-plikach Wywoływane są przez nazwę m-pliku, w którym są zapisane (bez rozszerzenia) M-pliki mogą zawierać

Wstęp do programowania. Różne różności

Typy, klasy typów, składnie w funkcji

Kiedy i czy konieczne?

Algorytmika i pseudoprogramowanie

AHDL - Język opisu projektu. Podstawowe struktury języka. Komentarz rozpoczyna znak i kończy znak %. SUBDESIGN

Politechnika Białostocka Wydział Elektryczny Katedra Automatyki i Elektroniki

Visual Basic for Applications. Wstęp

Projektowanie układów na schemacie

Definicje. Algorytm to:

ECDL Podstawy programowania Sylabus - wersja 1.0

Systemy Czasu Rzeczywistego FPGA

Generatory analizatorów

Wstęp do programowania. Wykład 1

Java EE produkcja oprogramowania

Technologie cyfrowe. Artur Kalinowski. Zakład Cząstek i Oddziaływań Fundamentalnych Pasteura 5, pokój 4.15

Efektywna analiza składniowa GBK

Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie.

DIAGRAMY SYNTAKTYCZNE JĘZYKA TURBO PASCAL 6.0

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Programowanie obiektowe

Laboratorium Projektowania Systemów VLSI-ASIC Katedra Elektroniki Akademia Górniczo-Hutnicza

Transkrypt:

KOMPILATOR JĘZYKA VHDL DO PROJEKTOWANIA UKŁADÓW LOGICZNYCH Edytor: prof. dr hab. inż. Włodzimierz Bielecki

ii Spis treści ISBN 83-87362-50-6 Pracownia Poligraficzna WYDZIAŁU INFORMATYKI POLITECHNIKI SZCZECIŃSKIEJ ul. Żołnierska 49, 71-210 Szczecin, tel. (091) 449 56 02 Wydanie I. Nakład 150+24. Ark. druk. 15,0 grudzień 2002 r. Copyright by Wydział Informatyki Politechniki Szczecińskiej Szczecin 2002

Przedmowa Książka ta jest przeznaczona zarówno dla projektantów, jak i dla studentów, doktorantów i naukowców zainteresowanych wiadomościami dotyczącymi metod projektowania kompilatorów języka VHDL. Opisuje ona organizację kompilatora języka VHDL do projektowania układów logicznych, który powstał w Katedrze Technik Programowania Wydziału Informatyki Politechniki Szczecińskiej. Kompilator generuje równania boolowskie ze źródeł napisanych w języku VHDL. Przedstawienie układów logicznych w postaci matematycznej za pomocą równań boolowskich generowanych przez kompilator ze źródeł VHDL umożliwia zastosowanie wszystkich znanych technik minimalizacji, weryfikacji, walidacji, symulacji i syntezy układów logicznych. Brak jest w tej chwili kompilatorów, które wprost generują równania boolowskie ze źródeł VHDL. Brak jest również publikacji opisujących techniki tworzenia kompilatorów języka VHDL do syntezy układów logicznych. Pod tym względem książka ta jest jedną z pierwszych publikacji opisujących techniki tworzenia takich kompilatorów. Większość materiału, zawartego w tej książce, stanowi nowe podejście do omawianego problemu. Nie wszystkie metody zaprezentowane w książce są optymalne ale jest to jeden z pierwszych kroków w pokonaniu wyzwania utworzenia teorii takich kompilatorów i udostępnienie dla wszystkich osób i ośrodków zainteresowanych tą teorią i narzędziami. Opisywany kompilator jest bardzo skomplikowanym programem. Jego złożoność jest porównywalna ze złożonością kompilatora języka C++. Tworzenie kompilatora wymagało czasochłonnych prac badawczych oraz implementacyjnych. Dla kilkuset rożnych problemów związanych z organizacją i implementacją kompilatora znaleźliśmy rozwiązania

ii i zaimplementowaliśmy je. Jednak nie jest możliwe od razu w ograniczonym czasie znaleźć wszystkie rozwiązania w sposób optymalny i zaimplementować wszystko bez usterek. Prace nad technikami tworzenia takich kompilatorów oraz testowaniem istniejącego kompilatora trwają dalej w naszym zespole. Książka zawiera również artykuły, które opisują organizację narzędzi do przetwarzania równań boolowskich, mianowicie tworzenia grafów zależności dla równań boolowskich oraz emulator systemu wieloprocesorowego do symulacji równań boolowskich. Narzędzia te umożliwiają symulacje równań boolowskich za pomocą komputerów równoległych. Celem tej książki jest udostępnienie uzyskanych wyników dotyczących organizacji kompilatora dla wszystkich zainteresowanych. Chciałbym serdecznie podziękować wielu osobom, które pomagały nam na wszystkich etapach tworzenia kompilatora. Bez ich pomocy nie moglibyśmy nawet rozpocząć tej pracy. Przede wszystkim jestem wdzięczny prezydentowi firmy ALDEC(USA) Stanley owi Haydukowi, który zainicjalizował prace nad kompilatorem i czuwał nad nimi. Chcielibyśmy wyrazić swoją wdzięczność Dziekanowi Wydziału Informatyki Politechniki Szczecińskiej, profesorowi Jerzemu Sołdkowi, który od początku prac nad kompilatorem popierając nasze działania i stwarzając znakomite warunki do pracy naukowo-badawczej na Wydziale Informatyki Politechniki Szczecińskiej. Dziękuję za owocną współpracę wszystkim kolegom z ośrodków firmy ALDEC w Polsce (Warszawie, Zielonej Górze, Gdańsku), którzy doprowadzili do powstania działającej wersji kompilatora. Dziękuję głównemu menedżerowi projektu I. Wojtkowskiemu za bezcenną pomoc podczas prac nad kompilatorem. Chciałbym wyrazić swoje głębokie uznanie oraz wyrazy wdzięczności wszystkim wykonawcom projektu, mianowicie Piotrowi Błaszyńskiemu, Robertowi Drążkowskiemu, Pawłowi Jaworskiemu, Marcinowi Lierszowi, Mirosławowi Mościckiemu, Maciejowi Poliwodzie, Marcinowi Radziewiczowi, Sławomirowi Wernikowskiemu i Tomaszowi Wiercińskiemu, którzy poświęcili swój cenny czas i włożyli wiele wysiłku w prace prowadzące do powstania kompilatora. Będę wdzięczny wszystkim za uwagi do tej książki, które proszę wysyłać pod adres bielecki@man.szczecin.pl. Kierownik Katedry Technik Programowania Wydziału Informatyki PS prof. dr hab. inż. Włodzimierz Bielecki Szczecin Marzec, 2002

iii Spis treści ORGANIZACJA KOMPILATORA JĘZYKA VHDL DO PROJEKTOWANIA UKŁADÓW LOGICZNYCH...1 ANALIZA LEKSYKALNA I SYNTAKTYCZNA JĘZYKA VHDL UŻYWANEGO DO GENERACJI RÓWNAŃ BOOLOWSKICH...13 ANALIZATOR SEMANTYCZNY KOMPILATORA JĘZYKA VHDL DO GENERACJI RÓWNAŃ BOOLOWSKICH...27 ZASADY NAZEWNICTWA I MODYFIKACJI NAZW W ANALIZATORZE SEMANTYCZNYM JĘZYKA VHDL...37 ALGORYTM I ZASADY DOTYCZĄCE IMPLEMENTACJI KONSTRUKCJI BLOKU W KOMPILATORZE JĘZYKA VHDL...47 FUNKCJE REZOLUCJI ZASADA DZIAŁANIA I SPOSÓB IMPLEMENTACJI W KOMPILATORZE JĘZYKA VHDL...55 INSTRUKCJE WSPÓŁBIEŻNEGO PRZYPASANIA SYGNAŁÓW DO SYNTEZY CYFROWYCH UKŁADÓW LOGICZNYCH...61 ALGORYTM GENEROWANIA RÓWNAŃ BOOLOWSKICH DLA INSTRUKCJI PRZYPISANIA ZAWIERAJĄCEJ ODWOŁANIA DO TABLIC JĘZYKA VHDL...67

iv ALGORYTMY GENERACJI RÓWNAŃ BOOLOWSKICH OPERACJI MNOŻENIA CAŁKOWITYCH LICZB BINARNYCH...75 ALGORYTM GENERACJI RÓWNAŃ BOOLOWSKICH OPERACJI DZIELENIA DLA SYNTEZY UKŁADÓW LOGICZNYCH...85 PRZEKŁAD INSTRUKCJI IF ORAZ CASE JĘZYKA VHDL DO POSTACI RÓWNAŃ BOOLOWSKICH...95 GENERACJA RÓWNAŃ BOOLOWSKICH DLA INSTRUKCJI FOR JĘZYKA VHDL...109 GENEROWANIE RÓWNAŃ BOOLOWSKICH DLA FUNKCJI I PROCEDUR JĘZYKA VHDL...123 MECHANIZM MAPOWANIA...133 IMPLEMENTACJA BIBLIOTEK STANDARDOWYCH...139 TŁUMACZENIE INSTRUKCJI GENERATE...145 GENEROWANIE RÓWNAŃ BOOLOWSKICH DLA PRZERZUTNIKÓW W KOMPILATORZE JĘZYKA VHDL DO SYMULACJI I SYNTEZY UKŁADÓW LOGICZNYCH...151 GENERACJA MASZYNY STANÓW DLA PROCESU Z WIELOMA INSTRUKCJAMI OCZEKIWANIA WAIT...185 POSTPROCESOR KOMPILATORA JĘZYKA VHDL...197 WERSJE IMPLEMENTACYJNE POSTPROCESORA KOMPILATORA JĘZYKA VHDL...207 A CREATION OF BOOLEAN EQUATION GRAPH FOR AUTOMATIC PARALLELIZING...217 MULTIPROCESSOR SYSTEM EMULATOR FOR DIGITAL DEVICES MODELING...223

Organizacja kompilatora języka VHDL do projektowania układów logicznych Włodzimierz Bielecki Katedra Technik Programowania, Wydział Informatyki, Politechnika Szczecińska ul. Żołnierska 49, 71-210 Szczecin Abstrakt: Artykuł zawiera opis organizacji i możliwości kompilatora języka VHDL do generowania równań boolowskich, które opisują logikę kombinacyjną i sekwencyjną układów logicznych. Kompilator używa ograniczonej gramatyki języka VHDL, umożliwiającej syntezę układów logicznych. W skrócie opisano podstawowe części kompilatora: analizatorów leksykalnego, syntaktycznego, semantycznego, generatora równań boolowskich oraz postprocesora. Przytoczono przykład generacji równań boolowskich za pomocą kompilatora. Przedstawiono wyniki testowania i stan kompilatora. Słowa kluczowe: Język VHDL, synteza układów logicznych, równania boolowskie 1. WSTĘP Opracowanie teorii tworzenia kompilatorów generujących równania boolowskie z programu źródłowego w języku VHDL (Very High Speed Integrated Circuit (V) Hardware Description Language(HDL)) jest aktualnym wyzwaniem. VHDL jest jednym z nielicznych języków HDL, który jest rozpoznawany jako standard IEEE [1,2] oraz Ministerstwa Obrony Stanów Zjednoczonych. VHDL można stosować do symulacji i syntezy układów logicznych. Jeżeli chodzi o syntezę, to na składnię (zbiór produkcji wykorzystywanych do tworzenia zdań programu źródłowego) są nakładane ograniczenia, to znaczy, że nie ze wszystkich możliwości i konstrukcji VHDL można korzystać w źródłach przeznaczonych do syntezy układów logicznych. W tej

2 chwili jeszcze nie ma standardu dotyczącego wersji VHDL, stosowanej do syntezy. Różni producenci sami określają ograniczenia nakładane na gramatykę VHDL, spełnienie których umożliwia poprawną syntezę. Istniejące kompilatory wspierające język VHDL produkują netlisty lub inne reprezentacje układów logicznych. Brak jest kompilatorów, które wprost generują równania boolowskie. Reprezentacja układów logicznych w postaci równań boolowskich umożliwia: 1) minimalizację równań; 2) symulację układów logicznych reprezentowanych równaniami za pomocą komputerów zwykłych i równoległych; 3) weryfikację projektowanych układów; 4) odwzorowanie na układy FPGA. Ponieważ większość istniejących kompilatorów języka VHDL są to narzędzia komercyjne, brak jest publikacji opisujących metody i algorytmy tworzenia takich kompilatorów. Istnieje duże zapotrzebowanie na badania związane z organizacją takich kompilatorów i utworzenie teorii takich kompilatorów dostępnej dla środowiska naukowego i przemysłu softwarowego. Od kilku lat w Katedrze Technik Programowania Wydziału Informatyki PS są wykonywane badania w kierunku tworzenia kompilatora kompatybilnego ze specyfikacją dobrze znanego kompilatora firmy Synopsys Compiler II / FPGA Express[3] do syntezy układów logicznych. Ograniczeniem tworzonego kompilatora jest to, że wspiera on tylko następujące pakiety standardowe: std_logic_1164, std_logic_arith, std_logic_signed i std_logic_unsigned. Główne zadanie kompilatora polega na generowaniu równań boolowskich ze źródeł napisanych w języku VHDL spełniających wymagania specyfikacji. Kompilator zawiera analizatory: leksykalny, syntaktyczny i semantyczny, generator kodu, postprocesor oraz program główny łączący razem wszystkie programy kompilatora. Praca nad kompilatorem wymagała dużego wysiłku związanego z opracowaniem zasad, metod, algorytmów kompilacji, w tym algorytmów formalnych generacji równań boolowskich dla wszystkich konstrukcji VHDL: sekwencyjnych i współbieżnych. Do testowania poprawności wygenerowanych równań stworzono symulator równań boolowskich, który na wejściu otrzymuje równania boolowskie oraz wartości sygnałów wejściowych i wykonuje symulację oblicza wartości wszystkich identyfikatorów występujących po lewej stronie równań. Równania mogą być nieuporządkowane wygenerowane w dowolnej kolejności. Symulator sam wyszukuje prawidłową kolejność obliczania równań. Wyniki symulacji można porównać z wynikami, które daje symulator ACTIVE VHDL. Zgodność obu wyników wskazuje na to, że wygenerowane przez kompilator równania są prawidłowe. Kolejne rozdziały opisują szczegóły organizacji kompilatora.

3 2. ANALIZATORY LEKSYKALNY, SYNTAKTYCZNY I SEMANTYCZNY Wejściem analizatora leksykalnego jest źródło w języku VHDL, wyjściem jest plik zawierający leksemy (słowa kluczowe, operatory, identyfikatory, stałe itd.) wraz z liczbami przechowującymi numery wierszy źródła tych leksemów. Analizator leksykalny czyta zdania programu źródłowego w języku VHDL, rozpoznaje wszystkie konstrukcje VHDL i tworzy wewnętrzną postać programu jako ciąg leksemów. Analizator syntaktyczny bada poprawność zdań programu pod względem składni bada czy zdania programu należą do zdań generowanych przez gramatykę VHDL, z uwzględnieniem ograniczeń możliwości syntezy układów logicznych. Nie zmienia on postaci wewnętrznej programu, informuje tylko o poprawności/niepoprawności źródła. Analizatory leksykalny i syntaktyczny zostały zaimplementowane jako dwa niezależne programy. Najpierw analizator leksykalny generuje plik z leksemami, dalej analizator składniowy sprawdza poprawność zdań zawartych w tym pliku. Analizatory leksykalny i składniowy zostały zaimplementowane za pomocą standardowych narzędzi systemu operacyjnego UNIX: lex i jacc odpowiednio; odpowiednikami tych narzędzi w systemie operacyjnym WINDOWS są flex i bison. Analizator semantyczny bada poprawność semantyczną zdań programu źródłowego i dodaje dodatkową informację (wartości semantyczne) do poszczególnych leksemów typy danych, nazwy identyfikatorów, wymiary tablic itd. Wartości te są przechowywane za pomocą drzewa katalogów w plikach. Zadaniem analizatora jest również wyszukiwanie wartości semantycznych na żądanie generatora kodu. Wejściem do analizatora semantycznego jest plik z leksemami tworzącymi zdania programu źródłowego. Analizator zakłada, że zdania te już zostały sprawdzone przez analizator syntaktyczny. Analizator semantyczny został zaimplementowany jako niezależny program w języku C++. 3. GENERATOR RÓWNAŃ BOOLOWSKICH Generator równań boolowskich czyta leksemy produkowane przez analizator leksykalny, rozpoznaje instrukcje języka VHDL i wywołuje odpowiednie funkcje generujące równania boolowskie. Każda taka funkcja rozpoznaje leksemy zawarte w zdaniu reprezentującym instrukcję: słowa

4 kluczowe, sygnały, zmienne, operatory itd. Dalej generator wywołuje funkcję analizatora semantycznego, która wyszukuje i zwraca wartości semantyczne poszczególnych leksemów. Na podstawie tych wartości i operacji instrukcji, funkcja ta produkuje równania boolowskie. Poniżej przytoczono wykaz niektórych z tych funkcji do generowania równań: a) wyrażeń arytmetycznych i logicznych; b) następujących instrukcji sekwencyjnych(zawartych wewnątrz procesu): assignment statements and targets; variable assignment statements; signal assignment statements; if statements; case statements; loop statements; next statements; exit statements; subprograms; return statement; wait statements; null statements; c) następujących instrukcji współbieżnych: process statements; block statements; concurrent procedure calls; concurrent signal assignments; component instantiation statements; direct instantiation; generate statements; Dla większości wyrażeń i instrukcji języka VHDL po raz pierwszy zostały opracowane metody i algorytmy umożliwiające generowanie równań, ponieważ brak było publikacji rozpatrujących takie zagadnienie. To była najtrudniejsza i najbardziej czasochłonna część pracy nad kompilatorem. Najbardziej skomplikowana cześć generatora kodu to zbiór funkcji do generowania równań z instrukcji procesu oraz instrukcji generate. Spośród instrukcji procesu najtrudniejsze do implementacji są konstrukcje zawierające instrukcje wait oraz instrukcje for. Instrukcja wait wymaga wygenerowania równań maszyny stanów. Równania te reprezentują licznik z wejściami T, R, D i CLK oraz dekoder, którego każde wyjście prezentuje jakiś stan oraz logikę kombinacyjną, która zarządza przejściami w maszynie stanów za pomocą wejść T, R, D. Przed wygenerowaniem równań generator kodu powinien znaleźć stan dla każdej instrukcji przypisania znajdującej się wewnątrz procesu. Dalej generator kodu produkuje przerzutniki dla każdej instrukcji przypisania. Równanie dla wejścia zegara C przerzutnika ma postać:

C = (CLK) AND (State i), gdzie CLK jest to sygnał zegara występujący w instrukcji wait; State i jest to stan instrukcji przypisania; AND jest to operacja logiczna AND. Instrukcja for jest implementowana za pomocą dwóch kroków. Najpierw pętla for zostaje przekształcona w kod liniowy. Dalej dla każdej instrukcji tego kodu są generowane równania. Implementacja instrukcji while jest związana z koniecznością generowania równań przerzutników dla wszystkich instrukcji przypisania, do których zapis danych jest sterowany za pomocą wygenerowanej maszyny stanów (równań tej maszyny) oraz równań logiki, która zarządza przejściami maszyny stanów. Generator kodu generuje równania dla następujących możliwości i mechanizmów języka VHDL: generiki; hierarchia projektu; wykorzystanie pakietów i bibliotek; wykorzystanie funkcji rezolucji; przeciążenie subprogramów i operatorów; reguły widoczności obiektów języka VHDL. Wszystkie funkcje i procedury pakietów standardowych (std_logic_1164, std_logic_arith, std_logic_signed, std_logic_unsigned) są zaimplementowane jako wbudowane w kompilator czyli są wewnętrznymi funkcjami kompilatora. Celem takiej implementacji było zredukowanie do minimum czasu generowania równań dla tych funkcji i procedur ponieważ projekty rzeczywisty bardzo często z nich korzystają. Generator kodu jest najbardziej złożoną częścią kompilatora. Jego źródła w języku C++ to ponad 2/3 wszystkich źródeł kompilatora. 5 4. POSTPROCESOR Postprocesor jest niezależną częścią kompilatora. Główne zadania postprocesora są następujące: i) korygowanie równań boolowskich dla logiki sekwencyjnej; ii) korygowanie równań dla logiki synchronicznieasynchronicznej; iii) połączenie równań o takich samych lewych stronach reprezentowanych nazwami sygnałów typu resolved; iv) minimalizacja równań boolowskich; v) eliminacja zmiennych roboczych w uzasadnionych przypadkach; vi) wyszukiwanie dwóch lub więcej par sygnałów o takiej samej nazwie po lewej stronie równań i nie zadeklarowanych jako resolved; sygnalizacja błędów w takich przypadkach. Wejściem dla postprocesora są równania boolowskie oraz pliki specjalne generowane przez analizator semantyczny lub generator kodu. Postprocesor

6 produkuje końcową postać równań. Każda nazwa sygnału lub zmiennej, która reprezentuje wyjście przerzutnika lub zatrzasku powinna mieć parametr «t», na przykład var(t,...). Wszystkie nazwy sygnałów i zmiennych sekwencyjnych są generowane przez generator kodu i przechowywane w specjalnym pliku. Zadaniem postprocesora jest odczyt wszystkich nazw sygnałów i zmiennych sekwencyjnych z tego pliku i korygowanie wszystkich równań boolowskich, które je zawierają przez dodanie symbolu «t» jako parametru tych nazw. Istnieje potrzeba korygowania równań boolowskich opisujących wejścia synchroniczne przerzutników, na przykład wejście D, przez dodanie parametru «t-1» do odpowiednich nazw wtedy, kiedy są one połączone z wyjściami innych przerzutników. Generator kodu generuje specjalne pragmy (dyrektywy) przed równaniami przerzutników z wejściami synchronicznymi. Postprocesor rozpoznaje takie pragmy i dodaje parametr «t-1» do nazw w równaniach boolowskich. Ponieważ wyjścia przerzutników mogą być połączone z wejściami synchronicznymi innych przerzutników za pomocą logiki kombinacyjnej, istnieje potrzeba znalezienia i skorygowania równań boolowskich opisujących taką logikę kombinacyjną. Zadanie to wykonuje postprocesor. Wszystkie sygnały typu resolved[1] są rozpoznawane przez analizator semantyczny i zapisywane do specjalnego pliku. Zadaniem postprocesora jest odczyt wszystkich takich sygnałów, wyszukiwanie sygnałów o takich nazwach po lewych stronach równań. Wszystkie równania z identycznymi lewymi stronami są łączone wtedy w jedno równanie zgodnie z semantyką zadeklarowanej funkcji rezolucji. Dozwolone funkcje rezolucji to funkcje «OR», «AND», i «THREE STATE» [1]. Postprocesor dokonuje minimalizacji równań boolowskich. Konwertuje on pewne człony równań na prostszą postać. Niektóre przykłady minimalizacji dokonywane przez kompilator są następujące: 0 &... = 0; 0... =... ; 1 &... =...; 1...= 1; a & a =a; a a =a;!!a = a; gdzie &,,! reprezentują operacje logiczne odpowiednio AND, OR i NOT. W uzasadnionych przypadkach należy wyeliminować zmienne robocze z równań w celu zmniejszenia rozmiaru kodu. Postprocesor korzysta z algorytmów heurystycznych, żeby podjąć decyzję, czy warto eliminować zmienne robocze. Wyeliminowanie zmiennych roboczych ma sens wtedy, kiedy zmniejsza to rozmiar równań. Nie zawsze wyeliminowanie zmiennych roboczych powoduje taki efekt. Wtedy postprocesor rezygnuje z eliminacji. Postprocesor wyszukuje równania o takich samych lewych stronach. Jeśli ma to miejsce i sygnaly/zmienne po lewej stronie nie są zadeklarowane jako resolved, to postprocesor sygnalizuje błąd w źródle VHDL.

7 5. PRZYKŁAD KOMPILACJI Dla następującego źródła VHDL library IEEE; use IEEE.std_logic_1164.all; entity test is port ( a,b: in STD_LOGIC_vector(0 to 1); s : in STD_LOGIC; z,d: out STD_LOGIC_vector(0 to 1) ); end test; architecture test3 of test is begin process (a, b,s) Begin if s ='1' then z<=a; d(0)<=a(0); else d(1)<=a(1); z<=b; end if; End process; end test3; kompilator generuje równania boolowskie jak niżej --process equations begin, line: 14 z(0)=(((s))&((a(0)))) ((!s)&((b(0)))); z(1)=(((s))&((a(1)))) ((!s)&((b(1)))); C_tmp0=(s); D_tmp0(0)=((s))&((a(0))); -- latch(c_high,d) S_tmp0(0)=D_tmp0(0)&C_tmp0; R_tmp0(0)=C_tmp0&!D_tmp0(0); d(t,0)=s_tmp0(0) (!R_tmp0(0)&d(t-1,0)); C_tmp1=!s; D_tmp1(1)=(!s)&((a(1))); -- latch(c_high,d) S_tmp1(1)=D_tmp1(1)&C_tmp1;

8 R_tmp1(1)=C_tmp1&!D_tmp1(1); d(t,1)=s_tmp1(1) (!R_tmp1(1)&d(t-1,1)); --state.out file begin --state.out file end --process equations end, line: 14 Dla portu z kompilator generuje logikę kombinacyjną, natomiast dla portu d - logikę sekwencyjną. Równania boolowskie dla każdego zatrzasku poprzedza komentarz w postaci -- latch(c_high,d). Parametr t wewnątrz każdego portu d określa sygnał sekwencyjny (wyjście zatrzasku). Tylko 3 operacje logiczne są możliwe w równaniach boolowskich: NOT (!), AND (&), OR ( ). Każde równanie boolowskie ma na końcu średnik. Są dozwolone komentarze. Dowolny tekst poprzedzony -- jest komentarzem. Nazwy sygnałów i zmiennych w równaniach boolowskich są zgodne z regułami tworzenia nazw w języku VHDL. Nazwy rozszerzone[1] są również dozwolone. Czyli każda nazwa dopuszczalna w źródłach języka VHDL jest również dopuszczalna w równaniach boolowskich. Trzy dodatkowe narzędzia zostały opracowane do konwertowania równań boolowskich na notację polską, formaty BLIF oraz SLIF. Są to najszerzej stosowane formaty do reprezentacji równań boolowskich. Użytkownik ma możliwość wygenerować równania w dowolnym z tych formatów. 6. IMPLEMENTACJA I TESTOWANIE KOMPILATORA Kompilator został zaimplementowany jako 6 niezależnych narzędzi. Poniższa tablica (tab. 1) reprezentuje wszystkie te narzędzia, ich rozmiary oraz zastosowane kompilatory do kompilacji źródeł poszczególnych narzędzi: Narzędzie Rozmiar źródła Narzędzie kompilacji Vhmake 16 KB Microsoft Visual C++ 6.0 Vhdllex 108 KB (+ flex/bison output) Vhdlpars 139 KB (+ flex/bison output) Anseman 346 KB Microsoft Visual C++ 6.0 Generator 1990 KB Microsoft Visual C++ 6.0 Postprocessor 163 KB Microsoft Visual C++ 6.0 Suma 2762 KB Tabela 1.

gdzie vhmake, vhdllex, vhdlpars, ansemam, generator, i postprocessor są to odpowiednio program główny, leksykalny, syntaktyczny i semantyczny analizatory, generator równań boolowskich oraz postprocesor. Kilka narzędzi zostało utworzonych do testowania i weryfikacji kompilatora: i) symulator równań boolowskich generowanych przez kompilator; ii) narzędzie do automatycznego testowania funkcjonalności kompilatora; umożliwia ono w sposób automatyczny odczytywanie i wykonywanie pojedynczych testów; w przypadku, kiedy kompilator nie radzi sobie z tymi testami, narzędzie wypisuje nazwę testów i rodzaj błędu (jaka cześć kompilatora powoduje ten błąd); iii) narzędzie do automatycznego porównywania wyników symulacji równań boolowskich (wyjście narzędzia i)) z wynikami symulacji źródła w języku VHDL (wyjście symulatora ACTIVE firmy ALDEC ). Kompilator został przetestowany za pomocą kilku tysięcy pojedynczych testów oraz około 10 projektach przemysłowych. Rozmiary generowanych plików z równaniami wahały się od 0.05 KB do 40 MB. Czas kompilacji zależy od źródeł w języku VHDL. Źródła które nie zawierają instrukcji for, powodującej wiele iteracji oraz nie zawierające wywołania dużej liczby funkcji z pakietów standardowych (standard IEEE packages) kompilują się dość szybko (od ułamka sekundy do kilku minut). Źródła zawierające pętle for z instrukcjami next i exit, kompilator konwertuje na kod liniowy, który zawiera instrukcje warunkowe if. Kod ten może być dość długi i może wymagać dużo czasu kompilacji od kilku minut do kilku godzin. Istnieje potrzeba optymalizacji funkcji odpowiedzialnych za przekład takich instrukcji. 9 7. MOŻLIWOŚCI ZASTOSOWANIA KOMPILATORA Tworzony kompilator może być wykorzystany do rozwiązywania następujących zagadnień. 1. Konwertowania generowanych równań na formaty BLIF, SLIF i wykorzystanie istniejących narzędzi (w tym i akademickich) obsługujących te formaty do minimalizacji, symulacji, weryfikacji i syntezy układów logicznych. 2. Weryfikacji układów logicznych za pomocą tworzenia BDD z generowanych przez kompilator równań. 3. Weryfikacji układów logicznych (kombinacyjnych i sekwencyjnych) za pomocą stworzonego symulatora równań boolowskich. 4. Weryfikacji układów logicznych poprzez symulację równań na komputerach równoległych w celu zmniejszenia czasu symulacji. W tej

10 chwili został opracowany prototyp symulatora dla PC z wieloma procesorami Pentium. Dla dwóch procesorów Pentium uzyskane przyspieszenie wynosi od 1.7 do 1.97. 5. Weryfikacji kombinacyjnych układów logicznych za pomocą symulacji równań w systemach rozproszonych (sieciach komputerowych). Cały zestaw równań może być symulowany niezależnie na rożnych komputerach dla różnych wartości sygnałów wejściowych. Ponieważ nie jest tu wymagana wymiana danych i synchronizacji między komputerami przyspieszenie będzie bliskie do liczby komputerów (w przypadku środowiska homogenicznego). 6. Weryfikacji układów logicznych przez porównanie wyników symulacji za pomocą symulatorów źródeł VHDL i symulatora równań boolowskich. 7. Znalezienia opóźnień sygnałów wyjściowych za pomocą równań boolowskich. 8. Oszacowania złożoności projektowanych układów (ilość bramek) na podstawie wygenerowanych równań. 9. Konwersji równań do formatów, z którymi pracują istniejące narzędzia syntezy (odwzorowanie na FPGA) co umożliwi syntezę układów logicznych na podstawie wygenerowanych równań. Istnieje możliwość modyfikacji formatu generowanych równań i dopasowania do niego symulatorów równań w taki sposób aby wprowadzić w składnie generowanych równań instrukcje if, for oraz możliwość korzystania z funkcji i procedur. Taka modyfikacja umożliwi: znaczne zmniejszenie rozmiaru równań (w niektórych przypadkach - mapowanie, instrukcje if, for, wywołanie procedur i funkcji - nawet 1000 razy); znaczną redukcję czasu generowania równań (w zaznaczonych wyżej przypadkach do 100 razy); znaczne zmniejszenie wykorzystanej podczas kompilacji pamięci (10-100 razy); Moduły (części) kompilatora mogą być zastosowane dla szybkiego tworzenia następujących narzędzi. 1. Graficznej reprezentacji układów logicznych kodowanych w VHDL. Utworzenie takiego narzędzia wymaga wyboru jakiegoś edytora graficznego i uzupełnienie generatora równań możliwością generowania reprezentacji graficznej układów w formacie zgodnym z tym, z którym pracuje edytor. Czyli wymaga to uzupełnienia tylko jednej części kompilatora. 2. Konwerterów C2bool, C++2bool, Verilog2bool, C2VHDL, C++2VHDL. Istnieje możliwość konwertowania źródeł C, C++, Verilog wprost na leksemy reprezentujące instrukcje VHDL. Takie podejście umożliwi:

przekład z języka wyższego na język wyższy, co jest zadaniem znacznie prostszym niż przekład na równania boolowskie; zastosowanie w 100% (bez żadnych zmian) już istniejących analizatorów syntaktycznego, semantycznego, generatora równań i postprocesora VHDL2bool; wykorzystanie ograniczonego zbioru instrukcji i możliwości VHDL w celu przyspieszenia testowania i powstania przemysłowych wersji nowych kompilatorów; to może być tylko około 20%-30% procent możliwości VHDL ale takich, które umożliwia poprawny i efektywny przekład źródeł C, C++, VERILOG na równania boolowskie. zastosowanie już istniejących narzędzi weryfikacji kompilatora VHDL2bool (symulator równań). Takie podejście do tworzenia nowych kompilatorów wymaga głównie prac nad algorytmizacją przekładu źródeł C, C++, VERILOG na leksemy VHDL. Implementacja będzie znacznie mniej czasochłonna niż tworzenie kompilatora VHDL2bool. 3. Konwertera VHDL2VERILOG. Dla tworzenia takiego kompilatora można w 100% zastosować z VHDL2bool analizatory: leksykalny, syntaktyczny i semantyczny. Wystarczy tylko dodać do nich nowy generator kodu. 4. Konwertera VHDL2C_zwykly/rownolegly. Taki konwerter można zastosować do bardzo szybkiej symulacji syntezowalnych źródeł VHDL za pomocą przekładu na program w C ( nie symulator VHDL, lecz program). Kompilacja takiego programu i jego wykonywanie dla różnych zestawów wartości sygnałów wejściowych umożliwi znaczną redukcję czasu symulacji (10-1000 razy) w porównaniu ze zwykłymi symulatorami zdarzeniowymi źródeł VHDL. Program w języku C może być sekwencyjny lub równoległy. Ostatni umożliwi wykonywanie symulacji na komputerach wieloprocesorowych. Przyspieszenie symulacji dla logiki kombinacyjnej będzie rosło w sposób liniowy w zależności od liczby procesorów, ponieważ w tym przypadku nie jest wymagany podział równań miedzy procesory. Trzeba zwrócić uwagę na to, że nawet za pomocą sekwencyjnego programu C można uzyskać znacznie mniejszy czas symulacji, ponieważ nie jest tu tworzony symulator z jego dużymi nakładami czasowymi lecz tylko pojedynczy wykonywalny program dla każdego syntezowalnego źródła VHDL. Dla tworzenia takiego konwertora można zastosować z VHDL2bool analizatory leksykalny, syntaktyczny i semantyczny. 11

12 8. ZAKOŃCZENIE Postać matematyczna równań boolowskich generowanych przez kompilator ze źródeł VHDL umożliwia zastosowanie wszystkich znanych technik minimalizacji, weryfikacji, walidacji, symulacji i syntezy układów logicznych. Konwertowanie równań boolowskich generowanych przez kompilator na inne formaty takie jak notacja polska, BLIF, SLIF umożliwia zastosowanie wszystkich istniejących narzędzi i oprogramowania do pracy z tymi formatami. Istnieje potrzeba dalszych prac i badań nad kompilatorem w następujących kierunkach: i) redukcja czasu generowania równań dla pętli for; ii) zmniejszenie czasu wyszukiwania wartości semantycznych dla dużych źródeł. Pakiety standardowe inne niż std_logic_1164, std_logic_arith, std_logic_signed, i std_logic_unsigned powinny być zaimplementowane i dodane do kompilatora w celu rozszerzenia zakresu jego zastosowania. Praca nad testowaniem, weryfikacją i walidacją kompilatora powinna być przedłużona w celu wykrycia usterek w źródłach kompilatora aby doprowadzić kompilator do wersji przemysłowej. Wszystkie te pracy są w stanie wykonywania. LITERATURA [1] P.J. Ashenden, The Designer's Guide to VHDL, Morgan Kaufmann Publishing, San Francisco, 1996. [2] IEEE standard VHDL Language Reference Manual. IEEE std.1076-1993. The Institute of Electrical and Electronic Engineers, Inc., 1994 [3] FPGA Compiler II / FPGA Express VHDL Reference Manual, Version 1999.05

Analiza leksykalna i syntaktyczna języka VHDL używanego do generacji równań boolowskich Robert Drążkowski Katedra Technik Programowania, Wydział Informatyki, Politechnika Szczecińska ul. Żołnierska 49, 71-210 Szczecin Abstrakt: Słowa kluczowe: Niniejszy artykuł opisuje analizatory: leksykalny oraz syntaktyczny, będące częścią składową kompilatora języka VHDL, którego zadaniem będzie wygenerowanie równań boolowskich, będących podstawą syntezy układów cyfrowych. W artykule omówiono gramatykę tej wersji języka VHDL. Na podstawie tej gramatyki w programie źródłowym wyszukiwane są ciągi znaków, będące poprawnymi symbolami leksykalnymi języka VHDL (tzn. słowa kluczowe, identyfikatory zmiennych, itp.). Takie ciągi znaków zamieniane są następnie na odpowiadające im unikalne kody (liczby całkowite). Po tym przekształceniu plik źródłowy reprezentowany jest przez ciąg kodów, który sprawdzany jest pod względem poprawności syntaktycznej, czyli sprawdzane jest, czy następstwo kodów jest zgodne z regułami podanej gramatyki. Uzyskany ciąg znaków jest podstawą do tworzenia przekładu, czyli generowania równań boolowskich dla wybranych konstrukcji języka VHDL. składnia VHDL, kompilator VHDL, synteza układów cyfrowych 1. WSTĘP Język VHDL jest popularnym standardem opisu układów cyfrowych. Pozwala na definiowanie układów scalonych (np. procesorów) i modelowanie ich zachowania. Jego bardzo rozbudowane konstrukcje pozwalają w prosty sposób opisywać bardzo złożone funkcje układów cyfrowych. Jednak próby syntezy układów cyfrowych na podstawie źródeł w języku VHDL trafiają na duże przeszkody, ponieważ bardzo

14 wyrafinowane konstrukcje językowe wymagają bardzo złożonego opisu przy pomocy bramek logicznych. W celu umożliwienia syntezy układów logicznych należy wyodrębnić pewien podzbiór konstrukcji języka VHDL, wystarczający do opisu układów, które znajdują się w obszarze zainteresowań przemysłu elektronicznego, nie powodujący jednak nadmiernej rozbudowy logiki tych układów. Istotne jest także zachowanie zgodności z przyzwyczajeniami projektantów, posługujących się językiem VHDL. Na Wydziale Informatyki Politechniki Szczecińskiej realizowany jest kompilator języka VHDL generujący na podstawie źródła VHDL zbiór równań boolowskich (tzn. opierających się na algebrze Boole a w formie arytmetyki bitowej, z wykorzystaniem bitowych operacji negacji, koniunkcji i alternatywy). Rezultatem kompilacji nie jest więc program składający się z poleceń pewnego procesora, przeznaczony do uruchamiania na komputerze wyposażonym w taki procesor. Rezultatem kompilacji jest zbiór równań boolowskich definiujących działanie pewnego układu scalonego. W prezentowanym kompilatorze zostały nałożone pewne ograniczenia na język VHDL, umożliwiające syntezę układów logicznych, polegające na tym, że zostały wyróżnione trzy klasy konstrukcji językowych: konstrukcje wspierane zarówno przez standard VHDL jak i przez realizowany kompilator; konstrukcje ignorowane (ignored), czyli poprawne w rozumieniu standardu VHDL, w przypadku których kompilator nie zgłasza błędu a jedynie je ignoruje; konstrukcje niewspierane (unsupported), czyli poprawne w rozumieniu standardu VHDL, w przypadku których kompilator zgłasza błąd kompilacji. Przyczyny zaliczenia poszczególnych konstrukcji do każdej z klas nie są istotne z punktu widzenia kompilatora. Warto dodać, że w miarę rozwoju kompilatora jako produktu, wiele konstrukcji językowych zmieniało swoją przynależność do wymienionych klas. W referacie omówione są dwa analizatory wchodzące w skład kompilatora: analizator leksykalny, rozpoznający symbole leksykalne oraz analizator syntaktyczny, sprawdzający poprawność składniową, czyli zgodność kolejności występowania symboli leksykalnych w programie z gramatyką. Kolejnym ważnym elementem kompilatora jest analizator semantyczny: mając na wejściu kod programu poprawny pod względem składniowym, ustalane są typy (i inne właściwości semantyczne) wszystkich identyfikatorów, po czym sprawdzane jest, czy operacje wpisane w kod źródłowy mogą być wykonane na identyfikatorach o takich właściwościach. Analiza semantyczna wykrywać też powinna wszystkie te ograniczenia prezentowanej wersji języka VHDL, których nie udało się odnaleźć