VHDL: liczby całkowite do syntezy?

17

Jestem trochę zdezorientowany, jeśli powinienem używać liczb całkowitych w VHDL do sygnałów syntezy i portów itp.

Używam std_logic w portach najwyższym poziomie, ale wewnętrznie I został za pomocą liczb całkowitych dystansowych wszędzie. Natknąłem się jednak na kilka odniesień do osób, które mówią, że powinieneś używać tylko podpisanego / niepodpisanego dla kodu kierowanego na syntezę.

Poszedłem i przerobiłem mój obecny projekt, aby użyć niepodpisanego ... i, cóż, jest znacznie brzydszy.

Czy używanie liczb całkowitych jest złą praktyką? Jaki jest problem? Czy istnieje niepewność co do szerokości, na którą narzędzie odwzorowuje liczby całkowite?

darron
źródło
Dobre pytanie. Zastanawiam się nad tym. Zacząłem od używania liczb całkowitych, dodatnich i innych typów w dowolnym miejscu, ale okazało się, że jest bardzo włochaty, aby poprawnie zsyntetyzować. Mam nadzieję, że ktoś może wyjaśnić, dlaczego wszyscy używają std_logic w bardzo typowym języku.
Trygve Laugstøl
1
Tak. Czy to nie szalone? Często wpisywane w bieżącej praktyce powoduje, że wiele DATA_I <= TO_UNSIGNED (32010, DATA_I'LENGTH); pisać rzeczy ... to nikomu nie przeszkadza? :) Z pewnością wydaje się, że to dużo niepotrzebnego bagażu. (Zwłaszcza przy dodawaniu do tego STD_LOGIC_VECTOR () ) Zadeklarowałem swój typ i rozmiar, powinien to być DATA_I <= 32010; To powinno być dorozumiane. Przechodzenie między podpisanymi / niepodpisanymi itp. Może i powinno być jawne ... ale bezpośrednie jednoznaczne przypisanie lub operacja na liczbach całkowitych powinna być niejawna.
darron

Odpowiedzi:

15

Liczby całkowite są w porządku w syntezie, używam ich cały czas.

Używam std_logic na portach najwyższego poziomu, ale wewnętrznie używałem liczb całkowitych dystansowych w całym miejscu

W porządku!

Być świadomym:

  • Najpierw symulujesz, prawda :) - Typy liczb całkowitych nie automatycznie „przechodzą” w symulacji - błąd wykraczania poza określony dla nich zakres. Jeśli chcesz zachować zachowanie podczas najazdu, musisz je jawnie zakodować.
  • -(2)31-1)+2)31-1-2)31unsignedsigned
  • Jeśli ich nie ograniczysz, czasem możesz skończyć z 32-bitowymi licznikami, w których mniej by to zrobiło (jeśli syntezator i kolejne narzędzia nie „zobaczą”, że mogą zoptymalizować bity).

Na górze:

  • Są znacznie szybsze do symulacji niż wektory bez znaku / podpisu
  • Nie przechodzą one automatycznie w symulacji (tak, jest na obu listach :). Jest to przydatne - na przykład otrzymujesz wczesne ostrzeżenie, że twój licznik jest za mały.

Kiedy używasz typów wektorów, używasz ieee.numeric_std, nieieee.std_logic_arith prawda?

Używam integers tam, gdzie mogę, ale jeśli jawnie chcę „najazdu liczników n-bitowych”, zwykle używam unsigned.

Martin Thompson
źródło
Tak, używam numeric_std. Myślę, że najbardziej martwię się o narzędzia Xilinx ... wciąż generują one std_logic_vector do wszystkiego, a „UNSIGNED” nawet nie jest podświetlane w składni.
darron
1
@darron Nie martw się podświetlaniem składni. Edytor i wyróżniacz składni to zupełnie inne oprogramowanie niż narzędzie do syntezy. Poza tym niepodpisany jest „tylko” typem danych. Jest częścią standardowej biblioteki, a nie samego języka.
Philippe
Czy zamiast tego dolna granica -2 ^ 32 + 1? Gdyby to było -2 ^ 31 - 1, wystarczyłby jeszcze jeden bit do przedstawienia tylko jednej liczby - bardzo dziwne.
Bregalad
@Bregalad - dobry haczyk - od dłuższego czasu było źle!
Martin Thompson,
@MartinThompson A może możesz napisać to jako - (2 ^ 32-1), jeśli wolisz zachować znak minus.
Bregalad
7

Jan Decaluwe napisał całą białą księgę na temat problemów liczb całkowitych a wektorów bitowych. Spodziewam się, że jego odpowiedzi będą używać liczb całkowitych, gdy tylko będzie to możliwe . http://www.jandecaluwe.com/hdldesign/counting.html

Philippe
źródło
6

Nie ma nic złego w używaniu liczb całkowitych do RTL per se , ale istnieją powody, dla których niektórzy tego unikają. To naprawdę jest pytanie o subiektywną „najlepszą praktykę” i ostatecznie będziesz musiał dowiedzieć się, co wolisz. Jako pomoc podzielę się swoim doświadczeniem i przemyśleniami na ten temat.

Zasadniczo jestem za używaniem (ograniczonych) liczb całkowitych, także podczas pisania do syntezy. Czasami to robię, ale w praktyce zwykle trzymam się signedi unsigned. Rozwiążę dlaczego.

W każdym razie będziesz zmuszony użyć wektoryzowanych typów danych w części swojego projektu:

  • Prawie żaden adres IP dostawcy lub IP strony trzeciej nie użyje integertypu portów

  • Np. Podczas wysyłania danych przez BlockRam, nawet jeśli wnioskujesz i dlatego nigdy nie potrzebujesz interfejsu z żadnym adresem IP / makro / prymitywem, najprawdopodobniej i tak będziesz musiał przekonwertować na typ wektorowy

  • Nawet jeśli żadna z powyższych sytuacji, będzie przede wszystkim trzeba interfejs do czegoś innego w pewnym momencie (port najwyższego poziomu, jeśli nic innego)

Ponieważ nie możesz użyć integerpełnego projektu, możesz pominąć to wszystko razem, ponieważ:

  • W niektórych momentach i tak będziesz musiał przeprowadzić konwersję, co integerw pierwszej kolejności pozbawia Cię sensu

  • Ponadto w przypadku symulacji konwersje te będą zwykle wywoływane za pomocą wektorów 'U'lub 'X'przed resetem lub w innym czasie, a każde takie wywołanie funkcji wygeneruje komunikaty ostrzegawcze z funkcji pakietu, zaśmiecające ostrzeżenia / monity symulacji

Wady używaniainteger :

  • W przeciwieństwie do typów wektorowych, liczby całkowite nie mają 'U'i'X' ; Uważam, że są bardzo pomocne w symulacjach. Widzisz, jak niezainicjowane sygnały rozprzestrzeniają się w projekcie, i prawdopodobnie zareagujesz, jeśli zobaczysz wiele niezainicjowanych sygnałów po resecie. Nie będzie tak w przypadku liczb całkowitych.

  • W przypadku liczb całkowitych istnieje większe ryzyko błędnego dopasowania symulacji / syntezy podczas dodawania lub odejmowania, co powoduje niedopełnienie / przepełnienie. (Jak już wskazał ktoś inny.)

Typowe przypadki, w których uważam, że integerto naprawdę dobra opcja:

  • Do sygnałów debugowania / liczników monitorowanych przez chipScope / signalTap itp.

  • Całkowicie wewnętrzna reprezentacja liczników, które nigdy nie wchodzą ani nie wychodzą z twojego kodu. Tak, istnieją takie przypadki, na przykład jeśli piszesz FIFO i są zapisy martwe-zaliczanie / czyta tworząc sygnały full, empty, almostFullitd. (Jednak arytmetyki na wskaźnikach jest lepszy sposób niż martwy liczy w tym przypadku. ..)

Moje własne wnioski: czasami używam liczb całkowitych, ale oszczędnie i głównie w przypadkach opisanych powyżej. Nie widzę dużego narzutu w używaniu unsignedi signedzamiast liczb całkowitych, a zatem zwykle trzymam się ich.

Carl
źródło