Weryfikacja miękkiego procesora

18

Obecnie jestem w trakcie projektowania prostego procesora w VHDL przy użyciu Xilinx ISE i ISIM. Część projektowa idzie wyjątkowo dobrze, ale nie mogę znaleźć sposobu, aby przeprowadzić weryfikację w spójny sposób.

Obecnie mam stanowisko testowe VHDL, które aktualizuję, aby przetestować funkcję, nad którą pracuję w dowolnym momencie. Jest to bardzo ad-hoc i nie pomaga mi wychwycić regresji i nie może być użyte do weryfikacji zgodności ze specyfikacją / zestawem instrukcji.

Myślałem o opracowaniu obszernego zestawu testów, ale problem polega na tym, że potencjalny stan części ogólnego przeznaczenia jako procesora jest ogromny w porównaniu z mniej ogólnymi komponentami.

Szukam metody, która pozwala mi na projektowanie i testowanie w bardziej kontrolowany sposób. Jakiś rodzaj „sprzętowego TDD”, jeśli chcesz. Czy coś takiego istnieje? Czy można go stosunkowo łatwo zastosować do części ogólnego przeznaczenia, takich jak procesor?

drxzcl
źródło

Odpowiedzi:

16

Cały problem weryfikacji procesora jest bardzo duży i trudny. Są ludzie, którzy robią karierę właśnie z tego. Przedstawię tylko przegląd ...

  1. Napisz program w języku asemblera, który testuje każdą instrukcję i każdy najmniejszy szczegół każdej instrukcji. Na przykład podczas testowania instrukcji ADD można ją przetestować przy użyciu liczb dodatnich, ujemnych i po jednym (dwa razy). Następnie przetestowałbyś flagę przenoszenia, flagę zerową itp. Inne specjalne cechy procesora (takie jak przewidywanie gałęzi itp.) Miałyby swoją własną specjalną część tego testu.

  2. Napisz, używając C / C ++ lub czegoś innego, model swojego procesora. To jest twój wirtualny procesor. Jest to również „złoty procesor”, co oznacza, że ​​jest to procesor, z którym porównywane jest wszystko inne. Idealnie osoba, która napisała VHDL, NIE jest tą samą osobą, która pisze model C / C ++.

  3. Napisz / stwórz system, w którym możesz uruchomić model C / C ++ i model VHDL obok siebie i porównać wyniki cyklicznie. Uruchom program montażu od kroku 1 i upewnij się, że oba modele są zgodne.

  4. Uruchom dwa modele na losowych „instrukcjach”. Zasadniczo wypełnij „ram” losowymi danymi i wykonaj te losowe dane, jakby były prawdziwymi instrukcjami. Uruchom te same losowe dane na obu modelach VHDL i C / C ++ i porównaj wyniki. Ten model C / C ++ działałby na niektórych stacjach roboczych i / lub serwerach (nie na nowym CPU).

  5. Skonfiguruj maszynę lub kilka maszyn, aby powtórzyć krok 4 zasadniczo na zawsze. Nawet jeśli Twój procesor jest „gotowy” i jest produkowany od roku lub dłużej, nadal będziesz przeprowadzać ten test.

  6. Powtórz te kroki, ilekroć jest więcej rzeczy do symulacji. Na przykład uruchomiłbyś go na VHDL po trasie z taktowaniem, gdy jest to dostępne.

Nie ma gwarancji, że porównanie wersji VHDL i C / C ++ wyłapie każdy błąd - ale tak naprawdę nie ma lepszego sposobu. Testowanie procesora na losowych instrukcjach zajmuje dużo czasu, ale jest to również bardzo przydatne. Jedyną realną alternatywą jest zatrudnienie wielu ludzi, którzy po prostu piszą cały dzień kod, aby przetestować różne części procesora - i robią to większe firmy, ale robią też losowe dane.

Dla jednej osoby piszącej kod VHDL zwykle jest to tylko krok nr 1, który jest wykonywany. Ale jeśli zamierzasz sprzedać procesor, to przynajmniej niektóre inne kroki powinny zostać wykonane (i naprawdę powinieneś zrobić je wszystkie).


źródło
Doskonała odpowiedź, dziękuję! To ma sens. „Złoty procesor” jest rzeczywiście brakującym elementem układanki, który umożliwia weryfikację cyklicznie podczas testowania. Ponieważ jest to głównie projekt zabawkowy, myślę, że dostosuję się do pierwszego zdania ostatniego akapitu i zrobię tylko krok nr 1. Ale wiedza, co powinienem zrobić, jest nieoceniona.
drxzcl
Możesz także mieć złoty, ale nieprecyzyjny cyklicznie model C ++, który pozwala mu być znacznie prostszym, a zatem bardziej prawdopodobnym, aby był poprawny - przydatny na przykład do testowania funkcjonalności ALU („2 + 2 = 4 i niektóre flagi, I nie przejmuj się, kiedy „zamiast” 2 + 2 = 4 po jednym tiku i flagi po 2 tikach ”)
Martin Thompson
Ponadto uruchom pokrycie kodu (aby sprawdzić, czy wykonałeś to wszystko) i pokrycie testu (aby sprawdzić, czy wszystkie testy zostały przetestowane zarówno pod kątem pozytywnym, jak i negatywnym)
Martin Thompson,
Dalsze działania: stosując procedurę „kroku pierwszego” udało mi się znaleźć wiele błędów ... w moim asemblerze: P Sam rdzeń wydaje się być względnie sprawny.
drxzcl,