Jak uniknąć zatrzasków podczas syntezy

9

Chcę zaprojektować blok kombinacyjnej logiki przy użyciu VHDL, ale czasami syntezowany wynik zawiera niezamierzone zatrzaśnięcie.

Jakich wskazówek kodowania muszę przestrzegać, aby uniknąć wnioskowania syntezatora o zatrzaski?

Przykład: w małym segmencie kodu powinienem używać instrukcji if-else?

W5VO
źródło
Jeśli ktoś może dostać to, o co staram się zapytać, proszę o informację
Nie byłem pewien, co masz na myśli ze swojego przykładu. Sprawdź, czy przeformułowanie jest zgodne z pierwotnymi założeniami.
W5VO,
@fatai, już skomentowałem, istnieje specjalna metoda usuwania konta dostępna na meta.stackexchange.com. Link do ostatniego pytania, na którym mnie oznaczono. Moderatorzy na miejscu nigdy nie mają takiej mocy. Wymaga to skontaktowania się z zespołem programistów.
Kortuk

Odpowiedzi:

13

Aby uniknąć zatrzaśnięć, musisz upewnić się, że wszystkie wyjścia są przypisane we wszystkich możliwych gałęziach kodu.

na przykład,

if a = '1' then
   b(0) <= '1';
else
   b(1 downto 0) <= "00";
end if;

wygeneruje zatrzask, ponieważ w pierwszym warunku wartość b (1) nie jest określona, ​​więc kompilator zdecydował, że chcesz zachować tam poprzednią wartość b (1). Jednym ze sposobów napisania tego, który nie generowałby zatrzasku, jest:

if a = '1' then
   b <= prev_b;
   b(0) <= '1';
else
   b(1 downto 0) <= "00";
end if;

...

if rising_edge (clk)
    prev_b <= b;
end if;

Tutaj wyraźnie stwierdzasz, że b powinien zachować swoją starą wartość, a następnie zastąp b (0) nową wartością.

Innym sposobem jest podanie wartości domyślnej ba, jak w odpowiedzi @ TomiJ.

Jeśli opublikujesz kod, na którym się zatrzaskujesz, możemy pomóc Ci znaleźć konkretny powód.

fbo
źródło
Nie sądzę, aby twoje podejście b <= bpozwoliło uniknąć zatrzaśnięcia, ponieważ nadal wymaga zachowania stanu sygnału.
Tomi Junnila,
Możesz mieć rację; Jestem zbyt przyzwyczajony do logiki taktowanej. Będę edytować.
fbo
6

Jeśli używasz procesów do logiki kombinacyjnej (i odradzam to tylko z tego powodu), upewnij się, że każda ścieżka przez proces przypisuje coś do każdego sygnału napędzanego przez proces. Żadne z wyników nie może być zależne od żadnego z wyników „ostatniego uruchomienia” procesu.

W przeciwnym razie wnioskujesz o zatrzasku, ponieważ przy następnym planowaniu procesu musi on zachować wartość sygnału, który nie otrzymał nowej wartości ostatnim razem.

Wolę zachować czysto kombinacyjną logikę jako ciągłe przypisania i używać procesów dla logiki taktowanej, wtedy nie dostaję zatrzasków.

Martin Thompson
źródło
5

Cztery zasady, aby uniknąć zatrzasków:

  • Nie czytaj z sygnałów, do których piszesz.
  • Posiadaj prawidłową listę czułości (wszystkie odczytywane sygnały powinny znajdować się na liście czułości)
  • Upewnij się, że wszystkie sygnały, do których zapisujesz, są przypisane na każdej ścieżce. (na przykład: w każdej gałęzi instrukcji if-else)
  • W przypadku procesów wykorzystujących zmienną należy się upewnić, że każda zmienna jest inicjowana wartością domyślną przed odczytaniem jej (w innej zmiennej lub sygnale).

Ponadto, jeśli masz kilka procesów kombinacyjnych, upewnij się, że nie tworzysz pętli.

Kilka stylów kodowania może pomóc ci przestrzegać tych zasad, na przykład styl w odpowiedzi @ TomiJ. Jak zauważa @Martin Thompson, może być lepiej unikać logiki kombinacyjnej razem. Zamiast tego umieść wszystko w taktowanym procesie.

Philippe
źródło
+1 Ładny zestaw zasad. Czy zgodziłbyś się, że twoja reguła nr 2 (dotycząca listy czułości) jest tak naprawdę ważna dla zapewnienia spójnych wyników między syntezą a symulacjami, ale tak naprawdę nie robi różnicy w odniesieniu do wnioskowania zatrzasków?
rick
@ Ric AFAIK, nie ma gwarancji, co zrobi narzędzie do syntezy z niepełnymi listami wrażliwości. Standard IEEE dla syntezy VHDL (1076.6-1999) stwierdza, że: „Lista czułości procesu powinna zawierać wszystkie sygnały odczytane w instrukcji procesu. Procesy z niepełnymi listami czułości nie są obsługiwane”. To powiedziawszy, wiem, że niektóre narzędzia syntezy (być może wszystkie?) Akceptują niekompletne listy wrażliwości, ale po prostu ignorują listę wrażliwości razem. Jeśli polegasz na tym zachowaniu zamiast na surowszym standardzie IEEE, wydaje mi się, że twoje stwierdzenie byłoby poprawne.
Philippe,
Dzięki, to brzmi dobrze, spowodowałoby to, że mój model nie byłby zgodny z tym standardem. To właśnie wzbudziło moją ciekawość, ponieważ wszystkie narzędzia do syntezy, które do tej pory widziałem, ignorują listę wrażliwości, ale słyszałem plotki, że niektórzy mogą wnioskować o zatrzaskach.
rick
3

Jak zauważyli @fbo i @Martin Thompson, musisz upewnić się, że każdemu sygnałowi sterowanemu przez proces przypisana jest pewna wartość w każdej gałęzi procesu, a wartość ta nie może zależeć od poprzedniego stanu któregoś z wyjść procesu.

Najłatwiejszym sposobem, aby to zapewnić, jest przypisanie wartości domyślnej do każdego wyjścia na samym początku procesu, na przykład (przykład z opcją fbo):

COMBO: process(a)
begin
    b <= (others => '0'); -- Assign default value to b
    if a = '1' then
        b(0) <= '1';
    else
        b(1 downto 0) <= "00";
    end if;
end process COMBO;
Tomi Junnila
źródło
1
To dobra metoda, której często używam. Czasami jednak ostrzeżenie o zatrzasku może wskazywać, że zapomniałeś przypisać niektóre bity, podczas gdy ta metoda może utrudnić znalezienie błędu. Na przykład, jeśli przypisujesz wszystkie bity szerokiego sygnału osobno i przypadkowo je przeliczyłeś.
fbo
2
Tylko w procesie kombinatorycznym. W taktowanym procesie wnioskujesz o flipflop, który może być dokładnie tym, czego chcesz.
Martin Thompson,