Jak zidentyfikować obszary projektu FPGA, które wykorzystują najwięcej zasobów i obszaru?

11

Pracuję nad dużym projektem FPGA i jestem bardzo blisko limitów zasobów FPGA, którego obecnie używam, Xilinx LX16 w pakiecie CSG225.

Projekt jest również prawie ukończony, ale w tej chwili nie będzie już pasował do FPGA. Mogę wyłączyć części, aby je dopasować, jednak muszę zmniejszyć zużycie zasobów, aby ukończyć projekt i spełnić wymagania dotyczące czasu i wielkości.

Chciałbym wiedzieć, czy w naszych raportach znajdują się narzędzia, które mogą pomóc mi określić, które części mojego projektu zużywają najwięcej zasobów. Mój projekt nie jest podzielony na partycje i jest podzielony na kilkanaście lub więcej modułów VHDL.

Raporty dotyczące czasu Xilinx są fantastyczne, ale teraz muszę wiedzieć, gdzie mogę uzyskać najlepszą cenę za oszczędność miejsca.

Trudno mi też powiedzieć, z jakiego rodzaju zasobów mi się wyczerpują lub jakie są skutki tych zasobów.

Kolejną irytacją jest to, że w miarę powiększania się projektu komponenty, które były używane w celu osiągnięcia czasu, zaczynają zawodzić, ponieważ ich rozmieszczenie nie jest już tak idealne.

Obecnie korzystam z raportów statycznych dotyczących czasu post-place i trasy oraz używam SmartXplorer. Korzystam ze strategii projektowania, aby zoptymalizować czas.

Po wyłączeniu części mojego projektu, aby go dopasować, oto kilka wyników:

wykorzystanie rejestru wycinków: 42% wykorzystanie wycinków LUT: 96% liczba w pełni wykorzystanych par LUT-FF: 38% Czy to oznacza, że ​​jestem lekki w rejestrach, ale intensywny w korzystaniu z bramki?

Czy istnieją narzędzia, które pomogą programistom zoptymalizować obszar, a przynajmniej dać im lepszy wgląd w kod?

Aktualizacja: Po przyjrzeniu się wykorzystaniu poziomu modułu dowiedziałem się, że mam małe asynchroniczne fifos fifos w całym miejscu, które zajmują około 30% wszystkich LUT. Używam ich jako kleju w domenie krzyżowej dla szybkich autobusów. Powinienem być w stanie je wyeliminować, ponieważ zegary są ściśle powiązane. (Wejście 120 MHz, produkuje 100 MHz i 200 MHz przez DCM)

Marcus10110
źródło
Wygląda na to, że masz wiele połączeń między sygnałami, jestem pewien, że możesz to naprawić, zmieniając poziomy optymalizacji, udostępniania zasobów i tym podobne. Jakiego narzędzia używasz? ISE czy Vivado?
FarhadA
1
Używam ISE (Vivado nie obsługuje Spartan-6). Wysłałem to na fora Xilinx i powiedzieli, że włączyli Szczegółowy Raport Mapy. Zrobiłem to, a plik * .mrp zawiera teraz sekcję 13 - Wykorzystanie według hierarchii. Opublikuję dane, gdy będę lepiej sformatowany.
Marcus10110,

Odpowiedzi:

5

Przekazałem to pytanie na forum Xilinx tutaj: http://forums.xilinx.com/t5/Implementation/How-to-determine-what-part-of-the-design-consumes-the-most/td-p / 393247

Ta odpowiedź w dużej mierze opiera się na komentarzach tam zawartych. Dzięki Deepika, Sikta i Gabor.

Najpierw włącz „Generuj szczegółowy raport MAP” we właściwościach procesu mapy (-detail).

Następnie otwórz Podsumowanie projektu i przejdź do opcji Wykorzystanie poziomu modułu. Oto pełna hierarchia pokazująca ekskluzywne i integracyjne wykorzystanie projektu.

Każda linia pokaże parę liczb, taką jak 0/5392. Oznacza to, że ten moduł zawiera zero tego konkretnego elementu, ale ten moduł i wszystkie jego podmoduły zawierają łącznie 5392 elementów.

Oto moja produkcja (częściowo rozwinięta) Raport wykorzystania

Pracując nad zmniejszeniem rozmiaru, Gabor zaleca przejście na większy FPGA w narzędziach syntezatora, aby mógł całkowicie odwzorować, nawet jeśli jest zbyt duży, aby zmieścił się w twoim obecnym FPGA, i przyspieszy działanie narzędzi.

Marcus10110
źródło
3

Wygląda na to, że zużywasz prawie wszystkie zasoby logiczne, a używasz tylko połowy rejestrów. Wygląda na to, że musisz dowiedzieć się, co zjada wszystkie twoje LUT. Istnieją sposoby optymalizacji poszczególnych komponentów i uczynienia ich nieco bardziej wydajnymi pod względem miejsca - takie jak pamięci RAM, rejestry przesuwne i maszyny stanu. Spójrz na wynikowy plik .log z syntezatora. Powie ci, jakie są składowe. Upewnij się, że poprawnie wnioskuje o komponentach. Jeśli tak nie jest, może nie generować szczególnie wydajnej listy sieci. Możesz wiele powiedzieć, patrząc na pliki dziennika syntezy. Możliwe jest, że kilka drobnych zmian w kodzie pozwoli syntezatorowi wnioskować o różnych komponentach, więc spójrz do instrukcji syntezatora dla niektórych szablonów. Może być konieczne przełączenie syntezatora, aby zoptymalizować obszar zamiast prędkości. Sprawdź także, czy nie masz żadnych wyłączonych ustawień wnioskowania. Kiedyś próbowałem zsyntetyzować komponent projektowy, który zużył 40% Spartan 3E 500 (9312 4-wejściowych par LUT / FF, 5,6 KB pamięci RAM) dla Virtex 6 HXT 565 (352440 6-wejściowych par LUT / podwójnych FF, 32 Blok pamięci RAM). Xilinx par zajął 7 godzin i zajął około 40% układu. ?!?!?!? Okazuje się, że pamięć RAM bloku blokującego została wyłączona, a syntezator zamienił kilka KB pamięci RAM na LUT. Nie najskuteczniejsza decyzja w historii. Po zmianie ustawienia zajęło to 1% układu. Domyśl. 312 4-wejściowych par LUT / FF, 5,6 KB pamięci RAM) dla Virtex 6 HXT 565 (354 240 6-wejściowych par LUT / FF, 32 MB pamięci RAM). Xilinx par zajął 7 godzin i zajął około 40% układu. ?!?!?!? Okazuje się, że pamięć RAM bloku blokującego została wyłączona, a syntezator zamienił kilka KB pamięci RAM na LUT. Nie najskuteczniejsza decyzja w historii. Po zmianie ustawienia zajęło to 1% układu. Domyśl. 312 4-wejściowych par LUT / FF, 5,6 KB pamięci RAM) dla Virtex 6 HXT 565 (354 240 6-wejściowych par LUT / FF, 32 MB pamięci RAM). Xilinx par zajął 7 godzin i zajął około 40% układu. ?!?!?!? Okazuje się, że pamięć RAM bloku blokującego została wyłączona, a syntezator zamienił kilka KB pamięci RAM na LUT. Nie najskuteczniejsza decyzja w historii. Po zmianie ustawienia zajęło to 1% układu. Domyśl.

alex.forencich
źródło
3

Warto opublikować całą sekcję „wykorzystanie zasobów” z danych wyjściowych narzędzia.

Czy korzystasz ze wszystkich bloków RAM? Często zdarza się, że można zastąpić funkcje logiczne / matematyczne równoważnymi tabelami wyszukiwania pamięci RAM, jeśli domena jest wystarczająco ograniczona i są wystarczająco skomplikowane, aby warto było je wstępnie obliczyć.

Podobnie jak wnioskowanie o pamięci, to samo dotyczy multiplikatorów. Czasami niewielkie odchylenie od zalecanego szablonu tworzenia instancji może spowodować wyrzucenie mnożnika na podstawie jednostek DSP48A.

Jeśli używasz kontrolera PCIe, czy możesz zmniejszyć całkowitą przestrzeń bufora zarezerwowaną dla ładunków TLP lub maksymalny rozmiar pakietu TLP? Może to zmniejszyć zużycie pamięci RAM / logiki rdzenia IP kosztem przemyślanej / całkowitej przepustowości.

Dzięki (Altera) Quartus możesz wielokrotnie wybierać elementy w widoku hierarchii projektu i zobaczyć tam użycie obszaru po p & r oznaczone kolorami / klastrami. Może to dać wizualny obraz względnego wykorzystania modułów projektowych.

shuckc
źródło
Dzięki. Używam twardych makr IP dla multiplikatorów i użyłem CoreGen do tworzenia FIFO, chociaż wybrałem niektóre z małych fifos do użycia rozproszonej pamięci RAM (zamiast blokowej pamięci RAM). Sprawdzę ich użycie.
Marcus10110,