Realizacja bezpiecznego programowalnego sterownika logicznego z wykorzystaniem języków HDL Arkadiusz Bukowiec 1 Radosław Gąsiorek 2 Agnieszka Węgrzyn 3 Prezentowany referat przedstawia ogólną koncepcję testowania i weryfikacji sterownika bezpiecznego oraz bloków funkcyjnych, w nim zastosowanych, projektowanych z wykorzystaniem języków HDL. Rozwiązanie bazuje na testowaniu układów z wykorzystaniem plików testowych napisanych w dwóch różnych języku HDL, a następnie porównaniu otrzymanych wyników. 1. Wstęp W ciągu ostatnich lat spotkano się z gwałtownym rozwojem programowalnych układów FPGA. Umożliwia to realizację z ich wykorzystaniem bardzo złożonych układów. Wraz ze wzrostem złożoności układów coraz częściej w ich projektowaniu znajdowały zastosowanie języki opisu sprzętu (np. Verilog). Języki te umożliwiają opis układu zarówno na poziomie bramek logicznych jak i na wyższych poziomach. Dodatkową zaletą zastosowania języków opisu sprzętu jest możliwość weryfikacji projektu praktycznie w każdej jego etapie. Realizacja bezpiecznego sterownika logicznego z wykorzystaniem języków opisu sprzętu znajduje się dopiero w początkowej fazie prac inżynierskich. Wykonanie sterownika bezpiecznego wymaga również zrealizowania bloków funkcyjnych zgodnym ze standardem IEC 1131-3 [2]. Realizacja tych projektów wymaga dokładnej weryfikacji modułów już podczas wstępnych prac, ze względu na potrzebę stałego nadzorowania poprawności działania sterownika. 2. Architektura bezpiecznego programowalnego sterownika logicznego W układzie zastosowano dwuprocesorową budowę master-slave (rys. 1). Taka architektura sterownika została przedstawiona dokładnie w [1]. Slave przetwarza dane według algorytmów zapisanych w formie bloków funkcyjnych zgodnych z normą IEC 1 Arkadiusz Bukowiec, Politechnika Zielonogórska, student III roku informatyki 2 Radosław Gąsiorek, Politechnika Zielonogórska, student III roku informatyki 3 mgr inż. Agnieszka Wegrzyn, Politechnika Zielonogórska, Instytut Informatyki i Elektroniki
1131-3 [2], natomiast master steruje przepływem danych i inicjuje procesor slave do wykonywania obliczeń. W celu wykrywania błędów sprzętowych zastosowano dwie pary takich procesorów, realizujących ten sam algorytm. W układzie zastosowano również komparator bezpieczny, który dokonuje kontroli zgodności wszystkich danych z obu par procesorów. Sterownik komunikuje się z otoczeniem poprzez porty wejściowe i wyjściowe, które łączą się z procesorami slave. Stan wejść jest zatrzaskiwany na początku cyklu w układzie wejściowym i pamiętany w czasie jego trwania. Odczytu z układu wejściowego dokonują procesory slave na żądanie procesora master. W sterowniku zastosowano jeden układ wejściowy wspólny dla obu procesorów slave. Stany wyjść są pamiętane w buforach wyjściowych wbudowanych do procesorów slave, a na koniec cyklu przepisywane do rejestrów latch. Następnie są one porównywane w układzie wyjściowym i udostępniane na zewnątrz sterownika. Układ wyjściowy jednocześnie generuje sygnał statusu pracy OK, a w razie awarii sterownika zapewnia on ustawienie wyjść w stan wyłączenia (bezpieczny stan sterownika). Master Master Komparator Komparator Slave Slave Wejścia Wyjścia Komparator Rys. 1. Schemat działania bezpiecznego programowalnego sterownika logicznego 3. Opis bloków funkcyjnych w języku HDL Do opisu bloków funkcyjnych wykorzystano język Verilog, ze względu na jego największą przydatność w opisie prostszych układów cyfrowych, jakimi w tym
przypadku są bloki funkcyjne dla bezpiecznego sterownika programowalnego. Na rys. 2 umieszczono przykładowy syntezowalny model. module shl (in,no,out); parameter size=16; input [0:size-1] in ; input [0:size-1] no; output [0:size-1] out; assign out = in << no; endmodule Rys. 2. Syntezowalny model układu shl Dla ustandaryzowania typów wykorzystano tylko i wyłącznie typy zgodne ze standardem IEC 1131-3, który umożliwia używanie typów 1, 8, 16, 32 i 64 bitowych. Dla sygnału no, który odpowiada za ilość bitów koniecznych do przesunięcia danej wejściowej, stworzono wejście szesnastobitowe, choć w zupełności wystarczyłoby pięć bitów, ponieważ maksymalne konieczne przesunięcie to 16 miejsc, a liczbę tą można zapisać na pięciu bitach. Języki HDL umożliwiają sparametryzowanie bloków funkcyjnych i dostosowanie do faktycznych potrzeb dopiero podczas syntezy. Inną ważną rzeczą, o której należy pamiętać podczas projektowania bloków funkcyjnych, jest zadbanie o to, aby były one jak najmniej wrażliwe na wartości wejściowe nieokreślone (w języku Verilog wartość X), gdyż konstrukcje warunkowe z użyciem tych wartości nie są syntezowalne. Najprostszym sposobem na rozwiązanie tego problemu jest użycie konstrukcji else po instrukcji warunkowej if sprawdzającej przewidywanie, możliwe wartości wejściowych. 4. Weryfikacja układu sterownika Podczas projektowania układu bezpiecznego sterownika bardzo ważną częścią jest dokonanie weryfikacji utworzonych modułów. Przetestowanie układu jedynie przed przystąpieniem do syntezy może okazać się nie wystarczające. Wstępnym etapem testowania jest sprawdzenie poprawności działania napisanych modułów jeszcze przed przystąpieniem do syntezy. Do tego celu wykorzystuje się pliki z wektorami testowymi napisane w języku HDL. Podczas testowania układu należy przetestować zarówno każdy z modułów osobno jak i połączone ze sobą w jeden układ. Testowanie całego sterownika powinno odbyć się dla kilku różnych programów mających realne zastosowanie (np. program sterujący działaniem respiratora). Podczas realizacji programu na wejścia układu powinny być podawane każdorazowo inne dane, nawet takie, które w rzeczywistym zastosowaniu były by bardzo nieprawdopodobne. Bardzo ważne dla sterowników bezpiecznych jest, aby w trakcie testowania sprawdzić nie tylko czy układ zachowuje się poprawnie w czasie pracy, ale też sprawdzić, czy odpowiednio zachowuje się podczas awarii. W tym calu należy w plikach testowych zasymulować awarię. Symulację awarii można dokonać poprzez: zmianę wartości wewnętrznych sygnałów testowanego układu;
zastosowanie błędnie działających układów. Tworząc testy symulujące awarię należy utworzyć grupę takich testów, z których każdy będzie symulował awarię innego modułu. Dopiero, kiedy układ przejdzie pomyślnie wstępną procedurę testowania można przystąpić do syntezy układu. Drugi etap testowania to symulacja listy fizycznych połączeń w układzie FPGA (ang. netlist). Do testowania można wykorzystać te same pliki testowe oraz programy, co podczas testowania modułów napisanych w języku HDL. Porównując otrzymane wyniki należy zwrócić szczególną uwagę na wektory testowe, w których wstępują wartości X i Z. Jest to bardzo ważny krok weryfikacji gdyż syntezowalne konstrukcje języków HDL nie dają możliwości bezpośredniego uzależniania stanu wyjść od wartości X i Z na wejściach. Przedstawiony poniżej przykład ilustruje zabronioną pod kątem syntezy konstrukcję języka Verilog: if (in===1 bz) ; Może to spowodować uzyskanie innych wyników podczas testowania listy połączeń. W sytuacji, gdy uzyskane wyniki są zgodne z założeniami można przystąpić do operacji Place & Route. Trzecim i zarazem ostatnim, przed zaprogramowaniem układu FPGA, etapem testowania jest symulacja czasowa. W symulacji tej wykorzystuje się wygenerowany w czasie Place & Route plik SDF zawierający opóźnienia czasowe układu. Podczas symulacji czasowej można wykorzystać te same programy i moduły testowe, co poprzednio, jednak należy zwrócić tu uwagę czy częstotliwość zmian wektorów testowych nie przekracza wymaganego czasu utrzymania poszczególnych sygnałów na wejściach. W wynikach otrzymanych po symulacji czasowej należy zwrócić szczególną uwagę czy uzyskane opóźnienia nie wpływają krytycznie na działanie układu. Ostatecznej weryfikacji układu dokonuje się już po zaprogramowaniu układu do struktury FPGA. Specyficznym z punktu widzenia testowania jest moduł układu procesora slave. Moduł ten realizuje funkcje oparte o bloki funkcyjne zgodne z normą IEC 1131-3. Realizacja układu z wykorzystaniem języków HDL wymaga wykonania opisu również tych funkcji. Ponieważ bloki muszą być zgodne ze standardem i mogą być wykorzystane przy projektowaniu innych układów powinny być poddane ostatecznej weryfikacji przed zastosowaniem ich w układzie sterownika. Przystępując następnie do testowania sterownika zakłada się, że bloki funkcyjne procesora slave zostały już zweryfikowane i działają poprawnie. 5. Testowanie bloków funkcyjnych Ze względu na bezpieczeństwo i pewność działania sterownika, a co za tym idzie także bloków funkcyjnych, bardzo ważnym, jeśli nie najważniejszym etapem tworzenia bloków funkcyjnych jest ich testowanie. Dlatego też temu tematowi poświęcono więcej miejsca w pracy. Etap testowania można podzielić na kilka podetapów: a) tworzenie drugiego modelu funkcjonalnego, z wykorzystaniem innych konstrukcji; b) symulacja obu modeli, modyfikacja modeli tak aby generowały identyczne wyniki;
c) synteza modeli, symulacja po syntezie, analiza czasowa; d) utworzenie kilku modeli realizujących funkcje możliwe do zaprogramowania w późniejszym sterowniku; e) złożenie z wcześniej zaprojektowanych bloków modeli spełniających identyczne funkcje co projekty z punktu wyżej; f) symulacja modeli z d) i e), porównanie wyników symulacji, g) synteza modeli z e), symulacja po syntezie, analiza czasowa; h) implementacja bloków funkcyjnych do układu typu CPLD lub FPGA, ostateczne testowanie na płycie. Realizując powyższe założenia na podstawie pierwszego modelu, należy zamodelować drugi z założenia funkcjonalnie identyczny, jednak z wykorzystaniem innych konstrukcji języka Verilog. Należy zachować zgodność pod względem typów wejść/wyjść, reagowania na stany nieokreślone. Dzięki takiemu podejściu w późniejszym etapie testowania będzie można łatwiej wykryć błędy, oraz będzie można wybrać bardziej bezpieczny model bloku funkcyjnego. W wektorach testowych, wykorzystywanych w czasie symulacji, powinny się znaleźć wszystkie możliwe wymuszenia (łącznie z wartościami X oraz Z). Przykładowo dla układu o czterech wejściach potrzebne będzie 4 4 =256 wektorów testowych. Liczba tych wymuszeń jest bardzo dużo już dla małej liczby wejść. Zatem należałoby przygotować program (np. w języku C) generujący moduły testujące ze wszystkimi wymuszeniami. Synteza obu modeli prowadzona jest w kierunku skuteczności czasowej, ponieważ jest to ważniejsze w przypadku opisywanego tematu niż objętość zajmowanego układu. Po analizie oraz operacji Place & Route, wykonać należy ponowną symulację oraz analizę czasową. Z dwóch modeli wybrany zostaje ten dający lepsze zależności czasowe nawet, jeżeli zajmuje on większą powierzchnie w układzie programowanym. Następnie można stworzyć opis funkcjonalny zadań, realizowanych przez bloki funkcyjne sterownika, przy których będą one mogły być wykorzystany (rys. 3), przykładowo, sterowanie aparaturą podtrzymującą życie, czy zarządzanie linią produkcyjną. Opis tych modeli powinien być wykonany na jak najwyższym poziomie z wykorzystaniem, np. języka VHDL. Te prace mogą być wykonane przez inny zespół projektantów, dzięki czemu zwiększa się wiarygodność całego systemu. Omawiane modele nie muszą być syntezowalne. Tworzone są one w celu wygenerowania plików wynikowych z symulacji tychże modeli (na podstawie wcześniej tworzonych modułów testujących). Następnie projektowane są modele, które powinny działać tak samo, jak wcześniej wykonane układy funkcjonalne, z tą różnicą, że złożone z opracowanych wcześniej bloków funkcyjnych. Po symulacji wyniki powinny być identyczne, jak z modeli funkcjonalnych. Ewentualne przyczyny różnic należy poprawić w układzie generującym mniej konkretny, dokładny wynik. Następnie stworzone modele, poddane zostają syntezie oraz analizie czasowej. Kolejne kroki weryfikacji bloków funkcyjnych są zbliżone do opisanych w rozdziale 3. Jeżeli wszystkie dotychczas przeprowadzone testy i porównania przeszły pozytywnie, można przystąpić do próbnej implementacji samych bloków do układu programowalnego i dodatkowo sprawdzić ich działanie w środowisku fizycznym.
Symulacja Moduł testujący Opis funkcjonalny Wymuszenia Opis syntezowalny VHDL Verilog Entity end Architecture end Wyniki symulacji? = Wyniki symulacji Rys. 3. Sposób symulacji i porównania wyników 6. Podsumowanie oraz kierunki dalszych prac W referacie przedstawiono sposób realizacji bezpiecznego programowalnego sterownika logicznego oraz dedykowanych jemu bloków funkcyjnych z wykorzystaniem języków HDL (w szczególności języka Verilog i VHDL). Praca podkreśla bardzo duże znaczenie testowania układów już we wstępnej fazie projektu oraz realizację ich z wykorzystaniem różnych rozwiązań. Projekt realizacji sterownika bezpiecznego oraz bloków funkcyjnych znajduję się na razie w fazie wstępnej i będzie kontynuowany w ramach prac Koła Naukowego fantasic. Literatura [1] Śnieżek M., Halang W. A.: Bezpieczny programowalny sterownik logiczny, Oficyna Wydawnicza Politechniki Rzeszowskiej, Rzeszów, 1998 [2] International Electrotechnical Commission: International standard IEC 1131-3, Programmable Controllers, Part 3: Programming Languages, Geneva, 1992 Realisation of Programmable Safety Controller with use of HDLs In this paper, methods of testing and verification of a safety-application controller and its function blocks designed with use of HDLs are described. The solution is based on use testbench files, and modules designed with two different languages Verilog and VHDL, and comparison of results.