P O L I T E C H N I K A S Z C Z E C I Ń S K A W Y D Z I A Ł I N F O R M A T Y K I mgr inż. Tomasz Wierciński Generowanie równań boolowskich dla syntezowalnych źródeł języka VHDL opisujących logikę sekwencyjną R o z p r a w a d o k t o r s k a P R O M O T O R : prof. dr hab. inż. Włodzimierz Bielecki SZCZECIN 2005
SSTRESZCZEN Sformatowano IETRESZCZENIE V HDL jest szeroko rozpowszechnionym i cieszącym się dużą popularnością w zastosowaniach przemysłowych językiem projektowania, symulacji oraz syntezy układów cyfrowych. Powstał w latach osiemdziesiątych jako część programu VHSIC (ang. Very High Speed Integrated Circuits) prowadzonego przez Departament Obrony Stanów Zjednoczonych, a w 1987 roku stał się standardem organizacji IEEE. Główną cechą języka VHDL jest umożliwienie projektantowi układów scalonych opisywania funkcji, struktury i parametrów realizowanego układu na wysokim poziomie abstrakcji, w sposób podobny do pisania programu w komputerowym języku programowania. Ze względu na szerokie zastosowanie, język VHDL posiada wiele konstrukcji, które nie pozwalają na bezpośrednią implementację sprzętową. W celu umożliwienia syntezy, konieczne jest wyodrębnienie pewnego podzbioru instrukcji języka, wystarczającego do opisu układów znajdujących się w sferze zainteresowań przemysłu elektronicznego. Ważną cechą języka VHDL jest możliwość określenia zachowań modelowanego układu w zależności od czasu. Służą do tego predefiniowane typy oraz instrukcje umożliwiające projektowanie układów sekwencyjnych sterowanych sygnałem zegarowym. W niniejszej pracy zawarto propozycję nowych metod kompilacji syntezowalnych źródeł VHDL opisujących układy sekwencyjne. Opracowane algorytmy dotyczą generowania zarówno pojedynczych elementów, w postaci
Streszczenie zatrzasków i przerzutników, jak i całych, złożonych struktur logicznych. Do sterowania synchronizacją układów wielostanowych wykorzystano model maszyny stanów, będący implementacją automatu skończonego Mealy ego. W pracy opisano budowę takiego modelu wraz z omówieniem wszystkich wejść i wyjść układu, a także przedstawiono reprezentujący go zbiór równań boolowskich. Zawarto w niej również szereg algorytmów analizy instrukcji procesu języka VHDL oraz generowania jednostki sterującej i jednostki wykonawczej maszyny stanów. Rozdział 4 pracy przedstawia i interpretuje wyniki eksperymentów identyfikujące potencjał skuteczności proponowanych algorytmów w środowisku istniejących kompilatorów VHDL. Omawia on również proces weryfikacji równań boolowskich, uzyskanych w wyniku kompilacji źródeł VHDL pochodzących z bazy testów opracowanych przez firmę Aldec oraz przez autora pracy. Rozdział przedstawia także narzędzia użyte do testowania, w skład których wchodzą zarówno kompilatory i symulatory przemysłowe, jak i akademickie, zbudowane specjalnie dla potrzeb projektu. W rozdziale 5 wskazane zostały kierunki dalszych badań, jakie mogą być prowadzone w ramach rozważanej dziedziny, jednym z których jest możliwość wykorzystania uzyskanych wyników przy implementacji kompilatorów innych języków opisu sprzętu, takich jak Verilog lub SystemC. Ponieważ duża część pojęć zaprezentowanych w pracy, mających swoje źródło w literaturze angielskojęzycznej, nie doczekała się jeszcze oficjalnego tłumaczenia na język polski, dlatego pragnę z góry przeprosić za wszelkie niedoskonałości mojej pracy związane z tym faktem. Słowa kluczowe: język VHDL, techniki kompilacji, synteza logiczna, projektowanie układów cyfrowych, równania boolowskie. Adres autora: T o m a s z W i e r c i ń s k i P o l i te c h n i k a S z c z e c i ń s k a Wydział Informatyki Katedra Technik Programowania ul. Żołnierska 49, 71-210 Szczecin e-mail: twiercinski@wi.ps.pl
Streszczenie
Pragnę szczególnie i serdecznie podziękować mojemu promotorowi Panu profesorowi Włodzimierzowi Bieleckiemu za pomoc udzieloną w trakcie realizacji pracy naukowej i cenne uwagi merytoryczne. Pracę dedykuję mojej Mamie Tomasz Wierciński
S P I S T R E Ś C I Sformatowano SPIS RYSUNKÓW... vi SPIS TABEL... ix SPIS SYMBOLI I SKRÓTÓW... x 1. WSTĘP... 1 1.1. STAN PROBLEMU...2 1.2. CEL I TEZA PRACY...9 1.3. STRUKTURA PRACY... 14 1.4. UKŁADY SEKWENCYJNE... 15 1.4.1. Klasyfikacja układów sekwencyjnych... 18 1.4.2. Sposoby opisu układów sekwencyjnych... 19 1.5. INSTRUKCJE JĘZYKA VHDL IMPLIKUJĄCE LOGIKĘ SEKWENCYJNĄ... 21 1.5.1. Instrukcja procesu... 21 1.5.2. Instrukcja oczekiwania wait... 22 1.5.3. Instrukcja warunkowa if... 24 1.5.4. Instrukcja warunkowa case... 28 1.5.5. Instrukcje pętli... 30 1.5.6. Instrukcja przypisania... 31 1.6. PODSUMOWANIE... 33 2. SYNTEZA UKŁADÓW SEKWENCYJNYCH ZE ŹRÓDEŁ VHDL... 34 2.1. GENEROWANIE ZATRZASKÓW... 35 2.1.1. Zatrzask typu D wyzwalany poziomem wysokim... 35 2.2. GENEROWANIE PRZERZUTNIKÓW... 37 2.2.1. Przerzutnik typu D wyzwalany zboczem narastającym... 37 2.2.2. Przerzutnik typu D wyzwalany zboczem opadającym... 39 2.2.3. Przerzutnik typu D z wejściami asynchronicznymi R i S wyzwalany zboczem narastającym... 40 i
Spis treści 2.2.4. Przerzutnik typu D z wejściami asynchronicznymi R i S wyzwalany zboczem opadającym... 42 2.2.5. Przerzutnik synchroniczny RS wyzwalany zboczem narastającym... 44 2.2.6. Przerzutnik synchroniczny RS wyzwalany zboczem opadającym... 46 2.2.7. Przerzutnik synchroniczny RS z dodatkowymi wejściami asynchronicznymi wyzwalany zboczem narastającym... 48 2.2.8. Przerzutnik synchroniczny RS z wejściami asynchronicznymi wyzwalany zboczem opadającym... 50 2.3. GENEROWANIE MASZYNY STANÓW... 53 2.3.1. Budowa i działanie maszyny stanów... 53 2.4. PODSUMOWANIE... 64 3. ALGORYTM GENERACJI RÓWNAŃ BOOLOWSKICH DLA INSTRUKCJI PROCESU OPISUJĄCYCH LOGIKĘ SEKWENCYJNĄ... 65 3.1. ANALIZA STANÓW PROCESU ORAZ GENERACJA DANYCH POTRZEBNYCH DO ZBUDOWANIA MASZYNY STANÓW I DODATKOWYCH ATRYBUTÓW DLA KAŻDEJ INSTRUKCJI PRZYPISANIA W PROCESIE Z INSTRUKCJĄ WAIT... 68 3.1.1. Analiza instrukcji wait... 69 3.1.2. Analiza instrukcji warunkowych... 75 3.1.3. Analiza instrukcji pętli loop i while...loop... 83 3.1.4. Analiza instrukcji next... 87 3.1.5. Analiza instrukcji exit... 89 3.1.6. Analiza instrukcji przypisania... 92 3.1.7. Generowanie równania sygnału zerującego licznik... 92 3.2. GENEROWANIE RÓWNAŃ BOOLOWSKICH JEDNOSTKI STERUJĄCEJ... 94 3.3. GENEROWANIE RÓWNAŃ BOOLOWSKICH JEDNOSTKI WYKONAWCZEJ... 95 3.4. PODSUMOWANIE... 96 4. WERYFIKACJA SKUTECZNOŚCI PRZEDSTAWIONYCH ROZWIĄZAŃ.. 98 4.1. METODY I NARZĘDZIA WERYFIKACJI... 99 4.2. OSZACOWANIE SKUTECZNOŚCI OPRACOWANYCH ALGORYTMÓW... 106 4.3. PODSUMOWANIE... 111 5. PODSUMOWANIE I PRZEDSTAWIENIE WYNIKÓW PRACY... 113 ii
Spis treści 5.1. OSZACOWANIE ZŁOŻONOŚCI CZASOWEJ OPRACOWANYCH ALGORYTMÓW... 116 5.2. PRACE POKREWNE... 120 A. Szablony układów sekwencyjnych generowane przez kompilator VHDL2BOOL 124 A.1. ZATRZASK TYPU D WYZWALANY POZIOMEM WYSOKIM... 124 A.1.1. Budowa zatrzasku typu D... 124 A.2. PRZERZUTNIK TYPU D WYZWALANEGO ZBOCZEM NARASTAJĄCYM... 125 A.2.1. Budowa dwuzboczowego przerzutnika typu D wyzwalanego zboczem narastającym... 125 A.2.2. Budowa przerzutnika typu D bez opóźnienia czasowego wyzwalanego zboczem narastającym... 125 A.3. PRZERZUTNIK TYPU D WYZWALANY ZBOCZEM OPADAJĄCYM... 126 A.3.1. Budowa dwuzboczowego przerzutnika typu D wyzwalanego zboczem opadającym 126 A.3.2. Budowa przerzutnika typu D bez opóźnienia czasowego wyzwalanego zboczem opadającym... 127 A.4. PRZERZUTNIK TYPU D Z WEJŚCIEM CE WYZWALANY ZBOCZEM NARASTAJĄCYM... 128 A.4.1. Budowa dwuzboczowego przerzutnika typu D z wejściem CE wyzwalanego zboczem narastającym... 128 A.4.2. Budowa przerzutnika typu D bez opóźnienia czasowego z wejściem CE wyzwalanego zboczem narastającym... 128 A.5. PRZERZUTNIK TYPU D Z WEJŚCIEM CE WYZWALANY ZBOCZEM OPADAJĄCYM... 129 A.5.1. Budowa dwuzboczowego przerzutnika typu D z wejściem CE wyzwalanego zboczem opadającym... 129 A.5.2. Budowa przerzutnika typu D bez opóźnienia czasowego z wejściem CE wyzwalanego zboczem opadającym... 130 A.6. PRZERZUTNIK TYPU D Z WEJŚCIAMI ASYNCHRONICZNYMI R I S WYZWALANY ZBOCZEM NARASTAJĄCYM... 131 A.6.1. Budowa dwuzboczowego przerzutnika typu D z wejściami asynchronicznymi R i S wyzwalanego zboczem narastającym... 131 A.6.2. Budowa przerzutnika typu D z wejściami asynchronicznymi R i S bez opóźnienia czasowego wyzwalanego zboczem narastającym... 132 A.7. PRZERZUTNIK TYPU D Z WEJŚCIAMI ASYNCHRONICZNYMI R I S WYZWALANY ZBOCZEM OPADAJĄCYM... 133 iii
Spis treści A.7.1. Budowa dwuzboczowego przerzutnika typu D z wejściami asynchronicznymi R i S wyzwalanego zboczem opadającym... 133 A.7.2. Budowa przerzutnika typu D z wejściami asynchronicznymi R i S bez opóźnienia czasowego wyzwalanego zboczem opadającym... 134 A.8. PRZERZUTNIK TYPU D Z WEJŚCIEM CE ORAZ WEJŚCIAMI ASYNCHRONICZNYMI R I S WYZWALANY ZBOCZEM NARASTAJĄCYM... 135 A.8.1. Budowa dwuzboczowego przerzutnika typu D z wejściem CE oraz wejściami asynchronicznymi R i S wyzwalanego zboczem narastającym... 135 A.8.2. Budowa przerzutnika typu D z wejściem CE oraz wejściami asynchronicznymi R i S bez opóźnienia czasowego wyzwalanego zboczem narastającym... 136 A.9. PRZERZUTNIK TYPU D Z WEJŚCIEM CE ORAZ WEJŚCIAMI ASYNCHRONICZNYMI R I S WYZWALANY ZBOCZEM OPADAJĄCYM... 137 A.9.1. Budowa dwuzboczowego przerzutnika typu D z wejściem CE oraz wejściami asynchronicznymi R i S wyzwalanego zboczem opadającym... 137 A.9.2. Budowa przerzutnika typu D z wejściem CE oraz wejściami asynchronicznymi R i S bez opóźnienia czasowego wyzwalanego zboczem opadającym... 138 A.10. PRZERZUTNIK SYNCHRONICZNY RS WYZWALANY ZBOCZEM NARASTAJĄCYM.. 139 A.10.1. Budowa dwuzboczowego przerzutnika synchronicznego RS wyzwalanego zboczem narastającym... 139 A.10.2. Budowa przerzutnika synchronicznego RS wyzwalanego zboczem narastającym bez opóźnienia czasowego... 139 A.11. PRZERZUTNIK SYNCHRONICZNY RS WYZWALANY ZBOCZEM OPADAJĄCYM... 141 A.11.1. Budowa dwuzboczowego przerzutnika synchronicznego RS wyzwalanego zboczem opadającym... 141 A.11.2. Budowa przerzutnika synchronicznego RS wyzwalanego zboczem opadającym bez opóźnienia czasowego... 141 A.12. PRZERZUTNIK SYNCHRONICZNY RS Z DODATKOWYMI WEJŚCIAMI ASYNCHRONICZNYMI WYZWALANY ZBOCZEM NARASTAJĄCYM... 142 A.12.1. Budowa dwuzboczowego przerzutnika synchroniczny RS z wejściami asynchronicznymi wyzwalanego zboczem narastającym... 142 A.12.2. Budowa przerzutnika synchroniczny RS z wejściami asynchronicznymi wyzwalanego zboczem narastającym bez opóźnienia czasowego... 143 A.13. PRZERZUTNIK SYNCHRONICZNY RS Z WEJŚCIAMI ASYNCHRONICZNYMI WYZWALANY ZBOCZEM OPADAJĄCYM... 145 A.13.1. Budowa dwuzboczowego przerzutnika synchroniczny RS z wejściami asynchronicznymi wyzwalanego zboczem opadającym... 145 iv
Spis treści A.13.2. Budowa przerzutnika synchroniczny RS z wejściami asynchronicznymi wyzwalanego zboczem opadającym bez opóźnienia czasowego... 146 6. LITERATURA... 147 v
SPIS RYSUNKÓW Rysunek 1-1. Wykres Y Gajskiego i Kuhn a.... 3 Rysunek 1-2. Budowa kompilatora układów cyfrowych.... 8 Rysunek 1-3. Struktura automatu: a) Mealy ego, b) Moore a.... 17 Rysunek 1-4. Schemat układu synchronicznego.... 19 Rysunek 2-1. Ogólna postać maszyny stanów.... 53 Rysunek 2-2. Schemat licznika.... 54 Rysunek 2-3. Schemat przerzutnika T.... 54 Rysunek 3-1. Algorytm analizy instrukcji oczekiwania.... 74 Rysunek 3-2. Algorytm analizy instrukcji warunkowych.... 82 Rysunek 3-3. Algorytm analizy instrukcji pętli... 86 Rysunek 3-4. Algorytm generowania równania sygnału R.... 94 Rysunek 4-1. Schemat blokowy modelu implementującego algorytm kryptograficzny RSA... 108 Rysunek 5-1. Wykres czasu generowania jednostki sterującej w zależności od rozmiaru licznika maszyny stanów.... 117 Rysunek 5-2. Wykres czasu generowania jednostki wykonawczej w zależności od jej rozmiaru.... 119 Rysunek A-1. Zatrzask typu D wyzwalany poziomem wysokim: a) schemat, b) przebieg czasowy.... 124 Rysunek A-2. Przerzutnik dwuzboczowy typu D wyzwalany zboczem narastającym: a) schemat, b) przebieg czasowy.... 125 Rysunek A-3. Przerzutnik typu D bez opóźnienia czasowego wyzwalany zboczem narastającym: a) schemat, b) przebieg czasowy.... 126 Rysunek A-4. Przerzutnik dwuzboczowy typu D wyzwalany zboczem opadającym: a) schemat, b) przebieg czasowy.... 126 vi
Spis rysunków Rysunek A-5. Przerzutnik typu D bez opóźnienia czasowego wyzwalany zboczem opadającym: a) schemat, b) przebieg czasowy.... 127 Rysunek A-6. Przerzutnik dwuzboczowy typu D z wejściem CE wyzwalany zboczem narastającym: a) schemat, b) przebieg czasowy.... 128 Rysunek A-7. Przerzutnik typu D bez opóźnienia czasowego z wejściem CE wyzwalany zboczem narastającym: a) schemat, b) przebieg czasowy.... 129 Rysunek A-8. Przerzutnik dwuzboczowy typu D z wejściem CE wyzwalany zboczem opadającym: a) schemat, b) przebieg czasowy.... 130 Rysunek A-9. Przerzutnik typu D bez opóźnienia czasowego z wejściem CE wyzwalany zboczem opadającym: a) schemat, b) przebieg czasowy.... 130 Rysunek A-10. Przerzutnik dwuzboczowy typu D z asynchronicznymi wejściami R i S wyzwalany zboczem narastającym: a) schemat, b) przebieg czasowy.... 131 Rysunek A-11. Przerzutnik typu D z asynchronicznymi wejściami R i S bez opóźnienia czasowego wyzwalany zboczem narastającym: a) schemat, b) przebieg czasowy.... 132 Rysunek A-12. Przerzutnik dwuzboczowy typu D z asynchronicznymi wejściami R i S wyzwalany zboczem opadającym: a) schemat, b) przebieg czasowy.... 133 Rysunek A-13. Przerzutnik typu D z asynchronicznymi wejściami R i S bez opóźnienia czasowego wyzwalany zboczem opadającym: a) schemat, b) przebieg czasowy.... 134 Rysunek A-14. Przerzutnik dwuzboczowy typu D z wejściem CE oraz wejściami asynchronicznymi R i S wyzwalany zboczem narastającym: a) schemat, b) przebieg czasowy.... 135 Rysunek A-15. Przerzutnik typu D z wejściem CE oraz wejściami asynchronicznymi R i S bez opóźnienia czasowego wyzwalany zboczem narastającym: a) schemat, b) przebieg czasowy.... 136 Rysunek A-16. Przerzutnik dwuzboczowy typu D z wejściem CE oraz wejściami asynchronicznymi R i S wyzwalany zboczem opadającym: a) schemat, b) przebieg czasowy.... 137 Rysunek A-17. Przerzutnik typu D z wejściem CE oraz wejściami asynchronicznymi R i S bez opóźnienia czasowego wyzwalany zboczem opadającym: a) schemat, b) przebieg czasowy.... 138 Rysunek A-18. Dwuzboczowy przerzutnik synchroniczny RS wyzwalany zboczem narastającym: a) schemat, b) przebieg czasowy.... 139 vii
Spis rysunków Rysunek A-19. Przerzutnik synchroniczny RS bez opóźnienia czasowego wyzwalany zboczem narastającym: a) schemat, b) przebieg czasowy.... 140 Rysunek A-20. Dwuzboczowy przerzutnik synchroniczny RS wyzwalany zboczem opadający: a) schemat, b) przebieg czasowy.... 141 Rysunek A-21. Przerzutnik synchroniczny RS bez opóźnienia czasowego wyzwalany zboczem opadającym: a) schemat, b) przebieg czasowy.... 142 Rysunek A-22. Dwuzboczowy przerzutnik synchroniczny RS wyzwalany zboczem narastającym z wejściami asynchronicznymi RA i S.A: a) schemat, b) przebieg czasowy.... 143 Rysunek A-23. Przerzutnik synchroniczny RS wyzwalany zboczem narastającym z wejściami asynchronicznymi RA i S.A. bez opóźnienia czasowego: a) schemat, b) przebieg czasowy.... 144 Rysunek A-24. Dwuzboczowy przerzutnik synchroniczny RS wyzwalany zboczem opadającym z wejściami asynchronicznymi RA i S.A: a) schemat, b) przebieg czasowy.... 145 Rysunek A-25. Przerzutnik synchroniczny RS wyzwalany zboczem opadającym z wejściami asynchronicznymi RA i S.A. bez opóźnienia czasowego: a) schemat, b) przebieg czasowy.... 146 viii
SPIS TABEL Tabela 4-1. Czas kompilacji oraz zapotrzebowanie na pamięć operacyjną.... 109 Tabela 4-2. Porównanie ilości wygenerowanych układów sekwencyjnych... 110 Tabela 4-3. Podział ilościowy przerzutników wygenerowanych przez kompilator VHDL2BOOL... 111 Tabela 4-4. Rozmiar plików zawierających równania boolowskie wygenerowanych przez kompilator VHDL2BOOL... 111 ix
SPIS SYMBOLI I SKRÓTÓW ASCII (ang. American Standard Code for Information Interchange) amerykański standard kodowania na potrzeby wymiany informacji ASIC (ang. Application Specific Integrated Circuit) nieprogramowalny półprzewodnikowy układ scalony projektowany na zamówienie użytkownika i realizujący konkretne funkcje BLIF (ang. Berkeley Logic Interchange Format) format tekstowy opisu układu cyfrowego na poziomie struktury logicznej, umożliwiający przenoszenie danych projektu pomiędzy różnymi narzędziami CAD, rozwijany przez Berkeley University of California CAD (ang. Computer Aided Design) komputerowe wspomaganie prac projektowych CPLD (ang. Complex Programmable Logic Devices) układy programowalne o strukturze hierarchicznej DFG (ang. Dependence Flow Graph) graf przepływu zależności EDIF (ang. Electronic Design Interchange Format) format tekstowy opisu układu cyfrowego na poziomie struktury logicznej, umożliwiający przenoszenie danych projektu układu cyfrowego pomiędzy różnymi narzędziami CAD, rozwijany przez organizację Electronic Design Automation FPGA (ang. Field Programmable Gate Arrays) układy programowalne o strukturze komórkowej FPLD (ang. Field Programmable Logic Devices) układy programowane przez użytkownika FSM (ang. Finite State Machine) skończony automat stanu GNU powszechna licencja publiczna zezwalająca na swobodne uruchamianie, kopiowanie, rozpowszechnianie, analizowanie, zmianę i ulepszanie programów komputerowych HDL (ang. Hardware Description Language) język opisu sprzętu IP (ang. Intellectual Property) własność intelektualna PLD (ang. Programmable Logic Devices) układy programowalne QDIF (ang. QuickLogic Data Interchange Format) format opisu układu cyfrowego umożliwiający przenoszenie danych projektu pomiędzy różnymi narzędziami CAD, rozwijany przez korporację QuickLogic RSA algorytm szyfrowania z kluczem publicznym RTL (ang. Register Transfer Level) poziom przesłań międzyrejestrowych x
Spis symboli i skrótów Verilog HDL język opisu sprzętu (standard IEEE-1364) VHDL język opisu sprzętu (standard IEEE-1076) XNF (ang. Xilinx Netlist Format) format tekstowy opisu układu cyfrowego na poziomie struktury logicznej, umożliwiający przenoszenie danych projektu pomiędzy różnymi narzędziami CAD, rozwijany przez firmę Xilinx xi
1.WSTĘP 1 Sformatowane: Punktory i numeracja 1. WSTĘP Poniższy rozdział stanowi zwięzłe wprowadzenie do tematyki poruszanej w pracy. Zaprezentowano w nim podział specjalizowanych układów cyfrowych oraz opisano wspomagane komputerowo techniki ich projektowania. Omówiono również sposoby modelowania układów logicznych na różnych poziomach abstrakcji oraz zdefiniowano pojęcie syntezy jako procesu przekształcenia modelu do niższego poziomu reprezentacji. Zasadniczą część punktu 1.1 poświęcono charakterystyce języków opisu sprzętu ze szczególnym uwzględnieniem języka VHDL będącego przedmiotem badań niniejszej pracy. W punkcie 1.4 rozdziału poruszono zagadnienia związane z teorią układów cyfrowych, podając ich definicję oraz dokonując ich podziału. Szczególną uwagę poświęcono układom sekwencyjnym w tym automatom skończonym. W ostatnim punkcie rozdziału zaprezentowano podzbiór instrukcji języka VHDL będący przedmiotem badań podjętych w pracy. W odniesieniu do tych konstrukcji wskazano ich składnię, określono funkcjonalność oraz przedstawiono listę ograniczeń w syntezowalnym podzbiorze języka VHDL. Równocześnie w tej części rozprawy określono tematykę kolejnych jej rozdziałów oraz postawiono tezę i zdefiniowano cel podjęty w pracy. 1
Wstęp 1.1. Stan problemu W ostatnich latach nastąpił gwałtowny rozwój technologii układów scalonych opartej na zastosowaniu materiałów półprzewodnikowych. Częstym elementem każdego systemu cyfrowego stały się specjalizowane układy cyfrowe ASIC (ang. Application Specific Integrated Circuits). Stanowią one nową technikę opracowywania i produkcji układów scalonych, tak zwanych. układów na zamówienie. Technika ta zmienia dotychczasowy sposób projektowania systemów cyfrowych oparty na wielu odrębnych, współpracujących ze sobą, układach standardowych. Jeden wyspecjalizowany układ umożliwia realizację całego, nawet bardzo złożonego systemu cyfrowego [57][58]. Ze względu na technologie wytwarzania oraz techniki projektowania specjalizowane układy scalone dzieli się zazwyczaj na układy zamawiane przez użytkownika (ang. full-custom), układy projektowane przez użytkownika (ang. semicustom) oraz układy programowane przez użytkownika FPLD (ang. Field Programmable Logic Devices) [60]. Pierwsze dwa typy układów są nazywane także układami specjalizowanymi maską. Rola użytkownika w ich wytwarzaniu sprowadza się do zamówienia u producenta (full-custom) lub do projektowania z wykorzystaniem gotowych komórek bibliotecznych (semi-custom). Układy FPLD, zwane również układami specjalizowanymi przez programowanie stanowią dalszy krok w kierunku uproszczenia procesu projektowania i wytwarzania układów scalonych. Ich zasadniczymi cechami, jakie zawdzięczają niewielkiej liczbie procesów produkcyjnych, jest krótki czas opracowania i oprogramowania oraz niski koszt wyprodukowania małych serii. Do grupy tych układów należą struktury PLD (ang. Programmable Logic Devices) oraz FPGA (ang. Field Programmable Gate Array). Wytwarzanie coraz bardziej złożonych układów o coraz większym stopniu scalenia, wymagające zwiększenia precyzji produkcji oraz silna konkurencja producentów sprzętu spowodowały, iż bardzo ważnym zagadnieniem stało się projektowanie wspomagane komputerowo CAD (ang. Computer Aided Design). Dzięki technikom wykorzystującym narzędzia komputerowe powstała metodyka umożliwiająca skrócenie czasu projektowania oraz zwiększenie jakości układów scalonych [28][34]. Wykorzystanie narzędzi do projektowania wspomaganego 2
Wstęp komputerowo obejmuje wiele etapów projektowania układów mikroelektronicznych, rozpoczynając od specyfikacji poprzez symulację, weryfikację oraz syntezę. Modelowanie układu cyfrowego może odbywać się na różnych poziomach abstrakcji. Jednocześnie do specyfikacji tego samego układu na danym poziomie abstrakcji mogą być rozpatrywane różne jego cechy. Ze względu na poziom abstrakcji modele układu można podzielić na trzy podstawowe rodzaje: model architektury, logiczny oraz geometrii. Najwyższym poziomem jest poziom architektury, na którym rozpatrywane są operacje wykonywane przez układ. Poziom logiczny opisuje układ cyfrowy, wykorzystując zestaw funkcji logicznych, natomiast na poziomie geometrycznym rozpatrywana jest topografia układu. Ze względu na cechy modele można podzielić na: behawioralne, strukturalne oraz fizyczne. Model behawioralny opisuje funkcjonowanie układu [106], model strukturalny połączenia między poszczególnymi elementami, natomiast model fizyczny rozpatruje fizyczne elementy układu. Sposoby opisu systemu cyfrowego uwzględniające taki podział przedstawia wykres Y Gajskiego i Kuhn a (rys. 1-1) [34]. Osie tego wykresu definiują trzy rodzaje modeli. Każdy z nich może być opisany na różnych poziomach abstrakcji. Rysunek 1-1. Wykres Y Gajskiego i Kuhn a. Źródło: Na podstawie [34]. 3
Wstęp Proces przekształcenia modelu do niższego poziomu reprezentacji układu nazywany jest syntezą. W zależności od rozpatrywanego poziomu można rozróżnić następujące rodzaje syntezy: synteza architektury, synteza logiczna oraz synteza geometryczna (projektowanie fizyczne) [34]. Synteza poziomu architektury (wysokiego poziomu) pozwala na przejście z modelu behawioralnego do modelu strukturalnego na poziomie architektury. Synteza logiczna polega na utworzeniu modelu strukturalnego na poziomie logicznym na podstawie opisu logicznego mającego postać tablicy stanów, schematu lub opisu w języku HDL. Projektowanie fizyczne ma za zadanie opracowanie modelu fizycznego układu scalonego na poziomie geometrii z uwzględnieniem rozmieszczenia elementów i ich połączeń (ang. place and route). Klasyczne metody syntezy, sformułowane m. in. Przez D.A. Huffmana, G.H. Mealy ego i E.F. Moore a, wykorzystują elementarne układy logiczne, jakimi są bramki i przerzutniki. Ze względu na skomplikowany charakter obliczeń w przypadku ręcznego projektowania układów cyfrowych, stosowanie tych metod jest ograniczone do liczby sygnałów wejściowych nie większej od trzech i liczby stanów wewnętrznych układu nie większej od ośmiu. W celu zwiększenia tych liczb możliwe jest zastosowanie tzw. technik dekompozycji polegających na podziale układu na mniejsze części, które są łatwiejsze w projektowaniu. Ze względów ekonomicznych i technologicznych bazowanie jedynie na elementach elementarnych staje się w ostatnich czasach niecelowe. Częstsze zastosowanie mają efektywniejsze metody syntezy wykorzystujące tzw. bloki funkcjonalne będące bardziej złożonymi układami cyfrowymi. Syntezę układu cyfrowego złożonego z takich bloków wykonuje się zazwyczaj metodą mikroprogramowania [47]. W ostatnich latach do modelowania układów scalonych o wielkiej gęstości upakowania takich jak układy PLD oraz FPGA, niezbędnym narzędziem stały się języki opisu sprzętu HDL (ang. Hardware Description Language). Zadaniem tych języków jest umożliwienie projektantowi układów scalonych opisywania funkcji, struktury i parametrów realizowanego układu na wysokim poziomie abstrakcji. Specyfikacja układu cyfrowego powinna zapewniać pełny i jednoznaczny opis wymaganego zachowania, łącznie z opisem wszystkich funkcjonalnych, strukturalnych i fizycznych ograniczeń [5][57][58]. Tworzenie modelu układu cyfrowego w języku opisu sprzętu jest podobne do pisania programu w komputerowym języku programowania. Języki HDL posiadają 4
Wstęp cechy właściwe językom programowania takie jak: typy danych, pętle, instrukcje warunkowe, struktury danych. Jednak, inaczej niż w przypadku programów komputerowych, w budowie sprzętu ważniejszą rolę odgrywają aspekty strukturalne i fizyczne, dlatego języki opisu sprzętu charakteryzują się również cechami niedostępnymi dla typowych języków programowania komputerów. Przede wszystkim opis układu cyfrowego zawiera informacje strukturalne, takie jak opis interfejsu wraz z portami wejścia/wyjścia oraz definicje komponentów służących do budowy większych układów. Języki HDL muszą zatem umożliwiać tworzenie systemów zarówno w modelach strukturalnych jak i behawioralnych [34][57]. Równie ważną cechą języków HDL niespotykaną w językach komputerowych jest określanie zachowania modelowanego układu w zależności od czasu. Z tego względu języki HDL dostarczają predefiniowanych typów umożliwiających zawieszenie działania układu na określony kwant czasu. Jeszcze inną cechą tych języków jest umożliwienie przedstawienia równoległości działania układu przez zastosowanie współbieżnych procesów. Z tego powodu języki HDL są bliższe językom programowania maszyn równoległych. Pierwotnym zastosowaniem języków opisu sprzętu była jedynie symulacja układów, toteż posiadają one wiele cech takich jak: operacje na plikach, dynamiczna alokacja pamięci czy rekurencja, które uniemożliwiają bezpośrednią implementację sprzętową. Z tego powodu konieczne jest wyróżnienie syntezowalnego podzbioru danego języka oraz uzależnienie ostatecznej reprezentacji formy wyjściowej od układu, dla którego generowany jest sprzęt. Istnieje wiele języków opisu sprzętu, mających różne właściwości i umożliwiających realizację różnych zadań. Jednak w momencie pisania tej pracy do najbardziej popularnych można zaliczyć dwa z nich będące zarazem standardami przemysłowymi IEEE. Językami tymi są Verilog HDL [94] oraz VHDL [92][93], któremu poświęcona jest niniejsza praca. Język Verilog został zaprojektowany w sposób zapewniający dużą szybkość symulacji, dlatego w porównaniu z językiem VHDL posiada bardziej zwięzłą składnie oraz mniejszą różnorodność struktur językowych, co czyni go bardziej ograniczonym [12][34]. Język VHDL powstał w latach osiemdziesiątych jako część programu VHSIC (ang. Very High Speed Integrated Circuits) prowadzonego przez Departament Obrony Stanów Zjednoczonych. Głównym zadaniem programu było opracowanie efektywnych 5
Wstęp metod projektowania oraz wykorzystania najbardziej złożonych i bardzo szybkich układów scalonych [103]. W roku 1987 VHDL stał się standardem IEEE w dziedzinie języków opisu i projektowania układów VLSI. Kolejna ulepszona wersja języka została ustandaryzowana w roku 1993. VHDL jest oparty na języku ADA. Adaptuje baz zmian wiele jego konstrukcji. W chwili obecnej język VHDL jest szeroko rozpowszechniony wśród projektantów układów cyfrowych na świecie i cieszy się ogromnym powodzeniem w zastosowaniach przemysłowych. Do najważniejszych cech języka VHDL można zaliczyć [103]: - wparcie metodologii hierarchicznego projektowania sprzętu; - możliwość opisu oraz weryfikacji projektu w całym procesie jego powstawania (tj. na różnych poziomach abstrakcji); - niezależność od konkretnej technologii, metodologii projektowania i narzędzia wspomagania projektowania; - możliwość reprezentacji dynamiki systemu cyfrowego oraz współbieżnych operacji w sprzęcie; - możliwość samodokumentowania projektu osiągnięte dzięki prostej i przejrzystej strukturze języka; - dostarczenie mechanizmów modelowania układów z uwzględnieniem upływającego czasu cecha charakterystyczna dla typowego języka HDL; - możliwość symulowania projektowanych układów, a także możliwość tworzenia sekwencji sygnałów testujących (w tym również wbudowania sygnałów testowych w projekt); - możliwość realizacji nowych projektów z wykorzystaniem opracowanych, poznanych i zaimplementowanych uprzednio rozwiązań przechowywanych w bibliotece projektów. Mechanizmem abstrakcji, służącym w języku VHDL do modelowania układów cyfrowych jest jednostka projektowa (ang. design entity). Może ona reprezentować dowolnie złożone elementy lub układy logiczne. Jednostka projektowa składa się z dwóch części: - deklaracji jednostki projektowej (sprzęgu) (ang. entity declaration) opisującego interfejs układu cyfrowego z portami i parametrami formalnymi, - deklaracji jednego lub kilku ciał architektonicznych (ang. architecture body) definiujących własności strukturalne i behawioralne jednostki projektowej. 6
Wstęp W celu zapewnienia projektowanym układom możliwości wykonywania operacji współbieżnych język VHDL definiuje zbiór instrukcji współbieżnych, z których najważniejszą jest instrukcja procesu. Procesy są wykonywane równolegle w sposób niezależny, ale instrukcje sekwencyjne zawarte w procesie są wykonywane sekwencyjnie kolejno od pierwszej do ostatniej. Język VHDL wspiera różne typy danych, pozwala definiować własne typy oraz zmieniać zakres typów wbudowanych. Jest językiem o ścisłej typizacji wymagającym jawnej deklaracji wszystkich sygnałów i zmiennych użytych w projekcie. VHDL umożliwia użycie zmiennych, stałych oraz sygnałów. Zmienne mogą być używane wewnątrz modeli behawioralnych i nie są bezpośrednio powiązane ze sprzętem. Sygnały mogą być związane z sygnałami elektrycznymi przychodzącymi do portów układu i mogą zależeć od czasu. Język VHDL daje możliwość użycia konstrukcji typowych dla klasycznych języków programowania, takich jak wywołania funkcji i procedur, rozgałęzienia czy iteracje. Współbieżne modelowanie procesu umożliwia instrukcja wait służąca do wstrzymywania działania układu i synchronizacji z zegarem. Dostępne są również operatory logiczne, operatory relacji oraz operatory arytmetyczne. Działania arytmetyczne mogą być wykonywane tylko na liczbach całkowitych lub rzeczywistych. Ze względu na dopuszczenie przeciążania operatorów, operacje na pozostałych typach danych mogą być opracowane własnoręcznie przez użytkownika [34][103]. Oprócz VHDL a i Verilog a istnieje duża grupa mniej popularnych języków opisu sprzętu, jak np. opracowany w Japonii język UDL/I czy język Silage stworzony przez Hilfingera [34][43]. Od niedawna interesującą alternatywą, zyskującą coraz większe zainteresowanie, stanowią języki opisu sprzętu bazujące na języku C. W tej grupie dostępne są między innymi język ESIM [39], HardwareC [52] oraz SystemC [42][68][73][95]. Ostatni z wymienionych języków staje się coraz popularniejszym sposobem projektowania układów cyfrowych, wypierającym stopniowo języki VHDL i Verilog. Jest to projekt dostępny na zasadach licencji publicznej GNU, rozwijany przez organizację Open SystemC Initiative. Podstawowe zalety zastosowania języka C++ do opisywania układów cyfrowych to przede wszystkim duża popularność tego języka w programowaniu klasycznym (C i C++ są jednymi z najbardziej rozpowszechnionych języków wykorzystywanych w tworzeniu oprogramowania), wieloplatformowość (kompilatory języków C i C++ są dostępne na większości platform 7
Wstęp zarówno sprzętowych jak i systemowych) oraz duża ilość dostępnych kompilatorów i metod kompilacji źródeł opisanych w tym języku. Przez swoje szerokie zastosowanie w klasycznym programowaniu, język C++ wydaje się być naturalnym sposobem opisu układów logicznych. Rozwinięcie to pozwala na jednolity sposób opisu systemów oraz platform sprzętowo-programowych. SystemC dostarcza zorientowanych sprzętowo konstrukcji, zaimplementowanych jako biblioteki klas standardowego języka C++. Zawiera on odpowiednie elementy niezbędne do opisu układów cyfrowych, takie jak: procesy, moduły, porty, sygnały oraz interfejsy. Biblioteka języka SystemC dostarcza zbioru charakterystycznych dla opisu sprzętu typów danych, do których należą m.in. bit, bit vector, time, a także działających na nich funkcji. Język wprowadza również mechanizm zdarzeń, które służą do określania warunków uruchamiania bądź przerywania procesów. Podstawowym narzędziem projektowania układów PLD i FPGA, wykorzystywanym na etapie projektu logicznego oraz fizycznego, jest pakiet programów projektowych, określony jako kompilator HDL. Techniki kompilacji układów logicznych są podobne do kompilacji oprogramowania. W obydwu przypadkach w budowie kompilatora można wyróżnić dwie podstawowe części: przednią, przekształcającą program źródłowy w formę pośrednią oraz tylną, przekształcającą formę pośrednią w formę wynikową (rys. 1-2). Przód kompilatora składa się z faz, które zależą od języka źródłowego i są niemal niezależne od formy wynikowej. Zwykle część przednia składa się z analizatora leksykalnego, składniowego, semantycznego, tablicy symboli i generatora kodu pośredniego. W części tej dokonywana jest również optymalizacja formy pośredniej oraz istnieje obsługa błędów dla poszczególnych faz [6][34]. W części tylnej kompilatora oprogramowania znajdują się elementy zależne od maszyny docelowej oraz niezależne od języka źródłowego. W tej części znajduje się optymalizacja i generacja kodu oraz operacje obsługi błędów i tablicy symboli [6][34]. Rysunek 1-2. Budowa kompilatora układów cyfrowych. 8
Wstęp Źródło: Na podstawie [34]. W przypadku kompilatorów układów cyfrowych część końcowa jest bardziej złożona niż w kompilatorach oprogramowania. Korzysta ona z różnych technik syntezy (syntezy architektury, syntezy logicznej) oraz łączenia bibliotek polegającym na powiązaniu reprezentacji układu z komórkami biblioteki i ustaleniu połączeń między komórkami. W wyniku syntezy i optymalizacji logicznej dokonywanej przez system projektowy, powstaje opis układu w postaci pliku (netlisty), zazwyczaj w formatach EDIF (ang. Electronic Design Interchange Format), BLIF (ang. Berkeley Logic Interchange Format), QDIF (ang. QuickLogic Data Interchange Format) lub XNF (ang. Xilinx Netlist Format). Plik ten stanowi dane wejściowe dla programu wpasowującego projekt w wybrany układ FPGA (ang. fiter). Do sprawdzenia poprawności logicznej i parametrów dynamicznych układu stosuje się w kolejnym etapie tzw. program symulacyjny [47]. Języki opisu sprzętu stały się nierozerwalnie związane z programowalnymi układami logicznymi o wielkiej gęstości upakowania elementów zyskując zarazem nie mniejszą wagę, niż sama technologia produkcji. Zarówno w Polsce jak i na świecie badania w tej dziedzinie koncentrują się na kilku podstawowych problemach. Jednym z nich jest symulacja opisów VHDL umożliwiająca weryfikację funkcjonalną układu zanim zostanie wykonana synteza, dzięki czemu wszelkie błędy projektowe mogą zostać ujawnione na stosunkowo wczesnym etapie projektowania, a ich wpływ na cały cykl projektowy zostanie zminimalizowany. Inną grupę stanowią badania nad metodami optymalizacji systemów cyfrowych opracowanych z wykorzystaniem języków HDL minimalizującymi powierzchnię układów oraz zwiększającymi szybkość ich działania. Ostatnim kierunkiem badań, który jednocześnie stanowi przedmiot niniejszej pracy, są techniki kompilacji oraz syntezy układów cyfrowych ze źródeł HDL. 1.2. Cel i teza pracy Z powodu przemysłowego charakteru języka VHDL, większość dostępnych narzędzi do kompilacji i syntezy źródeł opisanych w tym języku to produkty komercyjne. Utrudnia to dostęp do wiedzy na temat metod i algorytmów zawartych w tych narzędziach. Najczęściej publikowanymi przez producentów informacjami są 9
Wstęp przewodniki oraz specyfikacje dotyczące podzbioru języka dostępnego w danym narzędziu. Wiodące w zastosowaniach przemysłowych kompilatory języka VHDL to: FPGA Express (i jego nowsza wersja Compiler II) firmy Synopsys [87], XST firmy Xilinx [104], LeonardoSpectrum firmy Exemplar Logic, Inc. [38] oraz Synplify firmy Synplicity, Inc. [88]. Specyfikacje tych narzędzi różnią się pod względem obsługiwanego podzbioru instrukcji VHDL oraz wprowadzonych ograniczeń dotyczących użycia tych instrukcji. Zawężony zakres funkcjonalności wprowadzony jest m.in. dla instrukcji implikujących logikę sekwencyjną, a zwłaszcza dla konstrukcji zawierających instrukcję wait. Wynika to ze złożoności układu generowanego w wyniku kompilacji takich konstrukcji lub wręcz niemożności wygenerowania prawidłowego układu. Oprócz ograniczeń wynikających ze specyfikacji IEEE języka VHDL [92], do których należy m.in. brak możliwości konstruowania procesu zawierającego jednocześnie listę czułości i instrukcje oczekiwania, specyfikacje wymienionych narzędzi wprowadzają podzbiór własnych ograniczeń zmniejszających funkcjonalność języka VHDL. Wszystkie z wymienionych narzędzi wymagają aby w przypadku wystąpienia instrukcji wait w którejkolwiek ścieżce logicznej procesu, wystąpiła ona również we wszystkich pozostałych jego ścieżkach. Kolejną wspólną regułą jest, aby wszystkie występujące w procesie instrukcje oczekiwania zawierały to samo wyrażenie złożone z jednobitowego sygnału zegarowego. Wspólna zasada dotycząca pętli (za wyjątkiem specyfikacji Synplify) wymusza stosowanie instrukcji oczekiwania wewnątrz pętli while...loop i loop oraz zabrania umieszczania instrukcji wait wewnątrz pętli for...loop. Ograniczenia różniące omawiane specyfikacje to wprowadzona w kompilatorze Synplify reguła określająca miejsce wystąpienia instrukcji oczekiwania na początku lub na końcu instrukcji procesu. Dodatkowe zasady, sformułowane w poniższych punktach, wprowadza kompilator XST: - proces może zawierać tylko jedną instrukcje pętli; - pierwszą instrukcją pętli musi być instrukcja wait; - po każdej instrukcji wait musi wystąpić instrukcja next lub exit. Najmniej ograniczoną pod względem funkcjonalności jest specyfikacja firmy Synopsys dotycząca kompilatora FPGA Express. Z tego względu stała się ona specyfikacją wzorcową, na której oparte zostały wszystkie algorytmy opracowane w ramach niniejszej pracy. 10
Wstęp Poza produktami komercyjnymi dostępne są również narzędzia akademickie powstające na kilku uczelniach, takich jak Department of Computer Science and Engineering of Auburn University. W grupie tej istnieją narzędzia generujące w wyniku kompilacji źródeł VHDL różne formy pośrednie, jak grafy przepływu zależności lub sieci Petriego [31][32][35]. Synteza opisanego w ten sposób układu wymaga przekształcenia go w inną, syntezowalną postać taką jak lista połączeń EDIF. Jednym z najbardziej rozpowszechnionych akademickich systemów do wspomagania projektowania układów cyfrowych jest Alliance VLSI CAD System rozwijany przez grupę Équipe Achitecture des Systemes et Micro-Électronique działającą na uniwersytecie Université Pierre et Marie Curie we Francji [37]. System ten jest kompatybilny ze standardem IEEE VHDL-87 [93]. Pakiet zawiera symulator i kompilator języka VHDL, zestaw narzędzi do syntezy logicznej oraz automatycznego rozmieszczania i łączenia elementów składowych układów FPGA. Badania dotyczące syntezy układów cyfrowych prowadzone są także w kilku placówkach w Polsce [1][2][3][4][57][58][59][60][89][90][91]. Realizowane są prace związane z komputerowym projektowaniem i syntezą układów logicznych przy wykorzystaniu języków opisu sprzętu, a także z modelowaniem układów cyfrowych za pomocą sieci Petriego oraz bezpośrednimi sposobami implementacji układów cyfrowych wyrażonych poprzez te sieci. Niniejsza praca leży w dziedzinie nauk technicznych i dotyczy dyscypliny Informatyka (Projektowanie logiczne, Układy scalone, Języki programowania, Inżynieria oprogramowania). Rozważanym w niej zagadnieniem naukowym jest opracowanie podstaw teoretycznych dotyczących automatycznej syntezy układów cyfrowych ze źródeł VHDL z wykorzystaniem metod kompilacji. Praca ma za zadanie rozwinąć dotychczasową wiedzę w zakresie kompilacji źródeł VHDL opisujących układy sekwencyjne do postaci równań boolowskich oraz upublicznić uzyskane w jej ramach rozwiązania. Mała liczba publikacji dotyczących metod efektywnej kompilacji języków opisu sprzętu do postaci syntezowalnej jest podstawowym problemem przy pracach nad tego rodzaju kompilatorami. Brak powszechnego dostępu do teorii opisującej metody i algorytmy kompilacji źródeł VHDL jest uzasadnieniem celu tej pracy jakim jest opracowanie, analiza i weryfikacja algorytmów automatycznego generowania równań boolowskich dla logiki sekwencyjnej opisanej instrukcjami procesu języka 11
Wstęp VHDL, w oparciu o metody kompilacji oraz badanie efektywności i określenie zakresu stosowalności tych algorytmów. Prowadzone w pracy rozważania służą wykazaniu prawdziwości następującej tezy: Istnieje możliwość opracowania formalnych algorytmów, opartych o metody kompilacji, generujących w sposób automatyczny równania boolowskie dla konstrukcji języka VHDL implikujących logikę sekwencyjną o jakości spełniającej wymogi przemysłu. Metodyka użyta do uzyskania wyników teoretycznych polegała na analizie krytycznej istniejących popularnych narzędzi syntezy. W jej rezultacie określono ograniczenia syntezowalnego podzbioru instrukcji VHDL opisujących logikę sekwencyjną. Ponadto zbadano strukturę układów cyfrowych wygenerowanych w wyniku syntezy. Pozwoliło to na ustalenie rodzajów podstawowych elementów logicznych, z jakich zostały zbudowane te układy. Przy opracowaniu rezultatów teoretycznych korzystano z zagadnień dotyczących teorii układów logicznych, budowy i syntezy układów cyfrowych, teorii automatów, metod kompilacji oraz specyfikacji języków opisu sprzętu w tym języka VHDL. Do zbadania poprawności uzyskanych wyników wykorzystano metodykę opartą na badaniach eksperymentalnych. Weryfikacja została przeprowadzona z wykorzystaniem bazy testów w języku VHDL opracowanych przez firmę Aldec oraz autora pracy. Badane źródła zostały dobrane w taki sposób, aby zawierały wydzielone konstrukcje VHDL rozważane w pracy. Kierując się ich składem, testy podzielono na trzy grupy: z instrukcjami wait, z instrukcjami wait oraz warunkowymi, z instrukcjami wait oraz pętlami (w tym z instrukcjami next i exit). Do przeprowadzenia badań wykorzystano symulatory ModelSim i VHDL Simili oraz kompilator FPGA Express opisane szerzej w rozdziale 4.1. W skład środowiska testowego wchodziły również narzędzia akademickie takie jak: symulator równań boolowskich oraz automat testujący. Sposób weryfikacji polegał na porównaniu wygenerowanych wyników z narzędziem wzorcowym, a jego szczegółowe kroki przedstawiono w rozdziale 4.1. Dane wejściowe układu testowego stanowiły wektory wartości sygnałów cyfrowych w postaci 0 i 1 oddzielonych średnikiem, a wielkościami mierzonymi były wektory sygnałów wyjściowych. Otrzymane wyniki zostały skumulowane w zaprojektowanej bazie danych w celu dalszej analizy. Przeprowadzona analiza wyników została przedstawiona w rozdziale 4.2 w postaci tabel zestawieniowych oraz wniosków. 12
Wstęp Nowością pracy jest forma wyjściowa zastosowana w opracowanym narzędziu, jaką stanowią równania boolowskie. Autorowi nie są znane narzędzia kompilacji języka VHDL wprost do równań boolowskich. Wyrażenie boolowskie (formuła boolowska) jest utworzone z pewnej liczby symboli zmiennych boolowskich oraz stałych 0 i 1 przez zastosowanie skończonej liczby operacji logicznych: sumy (ang. OR), iloczynu (ang. AND) oraz negacji (ang. NOT) [47][61]. Równania boolowskie są matematyczną formą reprezentacji układów logicznych wygodną do dalszych etapów odwzorowania technologicznego. Jako wynik syntezy umożliwiają zastosowanie wszystkich istniejących technik i narzędzi do minimalizacji, walidacji, symulacji i syntezy układów logicznych oraz podział równań i zastosowanie symulacji wieloprocesorowej. Ważną zaletą równań boolowskich jest możliwość ich upraszczania, a co za tym idzie możliwość uzyskiwania mniejszej liczby bramek logicznych projektowanego układu cyfrowego. Zasady formalne upraszczania formuł boolowskich związane są z aksjomatami algebry Boole a. Proces ten ma ogromne znaczenie praktyczne, przez co, oprócz klasycznych metod minimalizacji wyrażeń boolowskich, takich jak metoda Quine a-mccluskey a czy metoda Karnaugha, opracowano dla jego potrzeb wiele zaawansowanych rozwiązań, stanowiących podstawę nowoczesnej syntezy logicznej. Do metod tych należą: stosowana w układach PLA synteza dwupoziomowa oraz używana w układach semi- i full-custom synteza wielopoziomowa, wykorzystująca procedury faktoryzacji i dekompozycji (w tym dekompozycji funkcji boolowskich). Metody oraz narzędzia syntezy układów cyfrowych są szeroko opisane w książkach [57][58][59][60]. Wymienione wyżej argumenty stanowiły główny powód wyboru równań boolowskich na formę wyjściową opracowanych algorytmów. Rozwiązania powstałe w ramach pracy obejmą szeroki zakres języka VHDL zgodny ze specyfikacją firmy Synopsys dotyczącą kompilatorów do syntezy logicznej [87]. Zezwalają na stosowanie wielu instrukcji oczekiwania w pojedynczym procesie VHDL, a także dowolne jej zagnieżdżanie w konstrukcjach warunkowych if i case oraz pętlach loop i while...loop. Do sterowania synchronizacją w procesie z wieloma instrukcjami wait zaproponowano maszynę stanów będącą implementacją automatu skończonego Mealy ego. Opracowano jej reprezentację w formie równań boolowskich. 13
Wstęp Dodatkowo opracowano szablony przerzutników D i RS (także wersje z wejściami asynchronicznymi) stosowane do realizacji instrukcji przypisania w części wykonawczej maszyny stanów. Przedstawione w pracy rozwiązania zostały zaimplementowane w module generatora kodu będącego częścią kompilatora VHDL2BOOL języka VHDL, opracowywanego w Katedrze Technik Programowania Wydziału Informatyki Politechniki Szczecińskiej [15][22]. Prace nad tym narzędziem zostały zainicjowane przez firmę Aldec. Kompilator jest oparty na specyfikacji firmy Synopsys dotyczącej kompilatorów do syntezy logicznej [87]. Składa się on z sześciu podstawowych komponentów: analizatora leksykalnego, analizatora syntaktycznego, analizatora semantycznego, generatora kodu, postprocesora oraz optymalizatora równań boolowskich. Wynikiem kompilacji są równania boolowskie generowane przez generator kodu po wcześniejszej analizie źródła VHDL przez analizatory leksykalny, syntaktyczny oraz semantyczny. Ostatnim etapem kompilacji jest optymalizacja równań boolowskich przy użyciu postprocesora i optymalizatora. 1.3. Struktura pracy Treść rozprawy została podzielona na pięć rozdziałów. Dalsza część tego rozdziału dostarcza podstaw teoretycznych niezbędnych do zrozumienia badań podjętych w pracy. Zdefiniowano w nim pojęcie układów cyfrowych oraz dokonano ich podziału ze względu na sposób działania. W szczególności w rozdziale scharakteryzowano układy sekwencyjne, przedstawiono ich rodzaje oraz podano opisy w formie równań logicznych. Rozdział porusza również zagadnienia związane z teorią automatów w zakresie niezbędnym do zrozumienia zagadnień rozpatrywanych w pracy. W jednym z punktów tego rozdziału zaprezentowano podzbiór instrukcji języka VHDL będący przedmiotem podjętych badań. Omówiono instrukcję procesu tworząca niezależny wątek reprezentujący wydzieloną część projektu, instrukcję oczekiwania wait oraz instrukcje warunkowe if i case. Dodatkowo opisano instrukcje pętli loop oraz while...loop, instrukcje następną next, wyjścia exit oraz przypisania. W odniesieniu do wymienionych konstrukcji w rozdziale wskazano ich składnię, określono funkcjonalność oraz przedstawiono listę ograniczeń w syntezowalnym podzbiorze języka VHDL. 14
Wstęp Rozdział 2 poświęcony jest układom logicznym generowanym dla poszczególnych instrukcji języka VHDL implikujących logikę sekwencyjną. Dokonano w nim systematyki tych konstrukcji uwzględniając rodzaj generowanego dla nich układu cyfrowego. W szczególności omówiono instrukcje języka VHDL wymuszające generowanie maszyny stanów. Przedstawiono opisy i schematy oraz omówiono budowę poszczególnych jej części z wyszczególnieniem wszystkich wejść i wyjść układu, a także opisano reprezentujący ją zbiór równań boolowskich. Rozdział 3 zawiera szczegółową propozycję, dotyczącą algorytmu generowania równań boolowskich dla instrukcji języka VHDL, implikujących logikę sekwencyjną, który w celu uproszczenia prezentacji został podzielony na fragmenty dotyczące analizy poszczególnych zagadnień. Opisano w nim sposoby analizy i generowania równań boolowskich reprezentujących część sterującą maszyny stanów oraz warunki generowania równań logicznych części wykonawczej. Rozdział 4 omawia sposoby sprawdzania poprawność proponowanych rozwiązań. Przedstawiono w nim również propozycję automatyzacji procesu generowania testów oraz samej weryfikacji. Następnie opisano wykonane eksperymenty, wyjaśniono uzyskane wyniki oraz dostarczono na ich podstawie odpowiedzi na temat skuteczności opracowanych algorytmów. Rozdział ten oszacowuje także ocenę wyników własnej pracy na tle innych kompilatorów i narzędzi syntezy języka VHDL. Rozdział 5 dokonuje przeglądu literatury naukowej w zakresie istniejących metod i algorytmów syntezy układów logicznych oraz formułuje wnioski końcowe. Podjęta w nim zostaje również próba oszacowania złożoności uzyskanych rozwiązań. 1.4. Układy sekwencyjne Istnieją dwie podstawowe odmiany układów cyfrowych: układy kombinacyjne i układy sekwencyjne. Cechą odróżniającą obie grupy jest właściwość pamiętania stanów logicznych, którą charakteryzują się układy sekwencyjne, a której są pozbawione układy kombinacyjne. Układ kombinacyjny służy do przetwarzania informacji dyskretnej dwuwartościowej. Informacja dyskretna składa się ze znaków, którymi mogą być zarówno litery, cyfry, jak i inne symbole. W układzie kombinacyjnym każda kombinacja sygnałów wejściowych określa jednoznacznie kombinację sygnałów 15