VHDL: Korzystanie z operatora „*” podczas implementacji mnożników w projekcie

10

Współczesne układy FPGA mają wbudowane bloki DSP, najnowsze układy FPGA mają nawet wbudowane jednostki zmiennoprzecinkowe zgodne z IEEE-754.

Możliwe jest utworzenie encji / modułu DSP za pomocą GUI po wybraniu w nim wymaganych parametrów, a następnie umieszczeniu go w projekcie.

Kiedy musimy wykonać takie mikromanagowanie w projekcie instancji w rzeczywistych blokach DSP, a kiedy po prostu wpisujemy operator „*” w kodzie i pozwalamy narzędziu do syntezy obsługiwać szczegóły niskiego poziomu? Który jest lepszy?

Istnieje wiele różnych rodzajów algorytmów mnożenia, jeśli chodzi o mnożenie binarne. Od teraz mamy wbudowane bloki DSP na krzemie, a nawet wbudowane zmiennoprzecinkowe mnożniki, czy to oznacza, że ​​wszystkie te algorytmy nie stały się faktycznie przestarzałe.

quantum231
źródło
Jakie układy FPGA mają w układzie FPU zgodne z 754?
Martin Thompson,

Odpowiedzi:

6

Zrobiłem to kilka razy sam.

Zasadniczo narzędzia do projektowania będą wybierać między implementacją tkaniny a wycinkiem DSP na podstawie ustawień syntezy.

Na przykład, dla Xilinx ISE, w ustawieniach procesu syntezy, Opcjach HDL, jest ustawienie „-use_dsp48” z opcjami: Auto, AutoMax, Tak, Nie. Jak można sobie wyobrazić, kontroluje to, jak mocno narzędzia starają się umieścić Plasterki DSP. Miałem kiedyś problem polegający na tym, że pomnożyłem liczbę całkowitą przez 3, co wywnioskowało wycinek DSP - tyle że już ręcznie wywnioskowałem każdy wycinek DSP w układzie, więc syntezator nie powiódł się! Zmieniłem ustawienie na Nie, ponieważ już używałem każdego wycinka dsp.

Jest to prawdopodobnie dobra zasada (właśnie wymyśliłem): jeśli twój projekt jest taktowany mniej niż 50 MHz, i prawdopodobnie będziesz używał mniej niż 50% wycinków DSP w układzie, to po prostu użyj *, + i - operatorzy. spowoduje to wywnioskowanie wycinków DSP bez rejestrów potokowych. To naprawdę ogranicza maksymalną prędkość. (Nie mam pojęcia, co się stanie, gdy użyjesz podziału)

Jeśli jednak wygląda na to, że zamierzasz przeprowadzić wycinki bliżej maksymalnej prędkości wycinka DSP (333 MHz dla klasy Spartan 6 o normalnej prędkości) Jeśli zamierzasz użyć wszystkich wycinków, powinieneś ręcznie wywnioskować je .

W takim przypadku masz dwie opcje.

Opcja 1: ręcznie użyj surowego szablonu instancji DSP. Opcja 2: użyj bloku IP z Xilinx Core Generator. (Chciałbym skorzystać z tej opcji. W tym samym czasie dowiesz się wszystkiego o genach podstawowych, które pomogą w przyszłości)

Przed wykonaniem którejkolwiek z tych czynności przeczytaj pierwszą parę stron instrukcji obsługi wycinka DSP. W przypadku Spartan 6 (DSP48A1) byłby to Xilinx doc UG389: http://www.xilinx.com/support/documentation/user_guides/ug389.pdf

Najpierw rozważ opcję Core Generator. Zwykle tworzę projekt testowy w Core Generatorze dla części, z którą pracuję, w której tworzę dowolną liczbę bloków IP tylko po to, aby nauczyć się systemu. Następnie, gdy jestem gotowy do dodania jednego do mojego projektu w ISE, klikam prawym przyciskiem myszy Hierarchię projektu, klikam nowe źródło i wybieram „IP (CORE Generator & Architecture Wizard)”, aby móc edytować i ponownie generować blok bezpośrednio z mojego projektu.

W Core gen, spójrz na różne bloki IP, z których możesz wybierać - jest ich kilkadziesiąt, z których większość jest całkiem fajna.

Rdzeń Mnożnika jest tym, na co powinieneś najpierw spojrzeć. Sprawdź każdą stronę i kliknij przycisk arkusza danych. Ważnymi częściami są liczby bitów całkowitych, etapy potoku (opóźnienie) i wszelkie sygnały sterujące. Tworzy to najprostszy możliwy blok, zabierając wszystkie niepotrzebne porty.

Kiedy w ubiegłym roku budowałem filtr IIR rzędu 5 na 3, musiałem skorzystać z ręcznego szablonu tworzenia instancji, ponieważ budowałem bardzo niestandardową implementację, z 2 wycinkami DSP taktowanymi 4x szybciej niż częstotliwość próbkowania. To był całkowity ból.

Marcus10110
źródło
13

Jeśli chcesz tylko pomnożyć dwie liczby i odpowiadają one blokowi DSP, *operator powinien wywnioskować blok DSP. Jeśli nie, odeślij narzędzie do syntezy :)

Jednak, aby skorzystać z bardziej złożonych kombinacji funkcji DSP, często wymaga bezpośredniej instancji bloku i konfiguracji jego parametrów. Przykłady rzeczy, które mogą nie być dobrze odwzorowane przez wnioskowanie (na przykładzie Xilinx DSP48E1 ):

  • Korzystanie z sumatora wstępnego
  • Zastosowanie akumulatora postowego
  • Zastosowanie detektora wzorców
  • Zastosowanie jednostki logicznej

A zwłaszcza kombinacje powyższych.

Narzędzia do syntezy nie są jeszcze wystarczająco dobre, aby zmapować całkowicie dowolne kombinacje logiki i arytmetyki tak skutecznie, jak można się spodziewać.

Martin Thompson
źródło
4

Jeśli obecne są bloki DSP, powinieneś ich użyć, jeśli możesz, ponieważ będzie to bardziej wydajne niż używanie LUT do tego samego. Chyba że nie potrzebujesz mnożenia o wysokiej wydajności, w takim przypadku powinieneś wdrożyć, powiedzmy, potokowy sumator i rejestr przesuwny, aby zaoszczędzić miejsce.

Zanim przejdę do narzędzi GUI, przyjrzę się wnioskowaniu o blokach DSP. Podręcznik Xilinx XST zawiera „przepisy” HDL na tworzenie instancji bloków DSP z czystym verilog / VHDL. Zasadniczo, jeśli dodasz wystarczającą liczbę rejestrów przed i / lub po multiplikatorach, XST użyje bloku DSP do automatycznego wykonania operacji. Możesz sprawdzić dzienniki syntezy, aby sprawdzić, czy poprawnie wnioskuje o blokach DSP. Zakładam, że Altera ma coś podobnego.

Nawiasem mówiąc, zastanawiałem się nad tym kilka minut temu, ponieważ obecnie pracuję nad implementacją twistera Mersenne, która używa tylko mnożnika dla początkowego materiału siewnego. Moja implementacja pierwszego przejścia nie spełnia terminu, ale funkcjonalność jest poprawna. XST umieścił także operację zwielokrotniania w blokach DSP, jednak nie jest zoptymalizowany, więc działa o około połowę szybciej, niż bym chciał. Prawdopodobnie wrócę mnożnik za pomocą techniki shift-and-add, która zajmie 32 razy więcej cykli zegara, ale nie będzie już wymagała mnożnika sprzętowego.

alex.forencich
źródło
Dlaczego nie powinien mierzyć czasu podczas korzystania z mnożnika sprzętowego?
quantum231
Najwyraźniej mnożenie 32-bit na 32-bitowe niepotokowe zajmuje więcej niż 8 ns.
alex.forencich,
hmm, rozumiem, nie brałem tego pod uwagę. Dlatego bloki DSP nie są przetwarzane potokowo. Zastanawiam się, jak dokładnie realizują pomnożenie. Czy to naprawdę twardy równoległy mnożnik?
quantum231
Myślę, że można go skonfigurować do pracy na kilka różnych sposobów. Zgodnie z instrukcją XST dodanie wystarczającej liczby rejestrów na wejściu i wyjściu pozwoli XST na użycie multiplikatora potokowego w wycinku DSP48. W moim przypadku był tylko jeden rejestr wyjściowy i brak rejestrów wejściowych, więc nie mógł z tego skorzystać. Ponieważ było to tylko do inicjalizacji (inicjowanie PRNG), zastąpiłem równoległe mnożenie bitowym szeregowym mnożnikiem, aby zaoszczędzić na zużyciu zasobów.
alex.forencich,
2

Zależy to od tego, ile potrzebujesz optymalizacji i ile przenośny powinien być twój projekt. To trochę jak oprogramowanie, optymalizacja przy użyciu odrobiny asemblera lub pozwalanie kompilatorowi na wybór instrukcji. Możesz także mieć pewne kompromisy między rozmiarem a prędkością, abyś nie mógł sobie pozwolić na kombinatoryczny mnożnik podwójnej precyzji.

Nie wiedziałem, gdzie są wbudowane multiplikatory FP w FPGA.

Rzeczywisty operator mnożenia zgodny z IEEE P754 odpowiedni dla CPU wymaga więcej niż dużego mnożnika: Musisz dodać wykładniki, przesunąć normalne, zarządzać nieskończonością i kilka najczęściej bezużytecznych flag (niedokładne, niedopełnienie ...)

TEMLIB
źródło
FPGA najnowszej generacji, takie jak seria Altera 10, mają sprzętowy mnożnik zmiennoprzecinkowy zgodny z IEEE-754! Jednak sam nie miałem okazji z nich korzystać.
quantum231
Jeśli mamy wbudowane bloki DSP, to FPGA powinno ich użyć zamiast multiplikatora kombinatorycznego lub użyć innego algorytmu, który np. Używa bloku pamięci, prawda?
quantum231
2

Przeczytałem ten dokument http://www2.warwick.ac.uk/fac/sci/eng/staff/saf/papers/fpl2014-ronak.pdf :

Chociaż funkcje mieszczące się w jednym bloku DSP można skutecznie syntetyzować z potokowego kodu RTL, odkryliśmy, że bardziej złożone funkcje wymagające wielu bloków DSP mają niższą wydajność. Standardowy opis funkcji matematycznej RTL może być mocno potokowany, na przykład po każdej operacji, jednak ponieważ ten potokowanie może nie uwzględniać struktury i wewnętrznych etapów bloku DSP, powstały zsyntetyzowany projekt może wykazywać wydajność poniżej normy bloki DSP są łączone w sposób, który nie pozwala im działać z pełną prędkością.

Chciałbym znaleźć źródło ich narzędzi, by sprawdzić ich wyniki.

hlide
źródło