Czytałem tę stronę http://www.asic-world.com/verilog/verilog_one_day3.html, kiedy natrafiłem na następujące:
Zwykle musimy resetować przerzutniki, więc za każdym razem, gdy zegar dokonuje przejścia z 0 do 1 (pozowanie), sprawdzamy, czy reset jest potwierdzony (reset synchroniczny), a następnie kontynuujemy normalną logikę. Jeśli przyjrzymy się bliżej, zobaczymy, że w przypadku logiki kombinacyjnej mieliśmy „=” do przypisania, a dla bloku sekwencyjnego mieliśmy operatora „<=”. Cóż, „=” blokuje przypisanie, a „<=” to przypisanie nieblokujące. „=” wykonuje kod sekwencyjnie wewnątrz początku / końca, podczas gdy nieblokujące „<=” wykonuje się równolegle.
Byłem całkiem pewien, że nieblokujące przypisania były sekwencyjne, podczas gdy blokujące przypisania były równoległe. W końcu możesz wykonywać przypisania blokujące za pomocą instrukcji przypisania poza zawsze blokami, a wszystkie działają równolegle. Czy to pomyłka, czy może zachowanie jest inne w bloku zawsze? A jeśli zachowanie JEST inne w obrębie zawsze bloku, czy można przypisać funkcje nieblokujące poza blokiem zawsze?
assign
instrukcje występują poza blokami zawsze i są zwykle używane do opisania logiki kombinatorycznej (bez zatrzaśnięcia) (podczas gdy zawsze bloki, z pewnymi wyjątkami, opisują logikę sekwencyjną). AFAIK,assign
instrukcje zawsze wykonują się „równolegle”, ilekroć ich LHS zmienia wartość.Instrukcje przypisania nie są ani „blokujące”, ani „nieblokujące”, są „ciągłe”. Wyjście instrukcji przypisania jest zawsze równe określonej funkcji jej danych wejściowych. Przypisania „blokujące” i „nieblokujące” istnieją tylko w obrębie zawsze bloków.
Przypisanie blokujące ma wpływ natychmiast po przetworzeniu. Przydział nieblokujący ma miejsce pod koniec przetwarzania bieżącej „delty czasowej”.
zawsze bloki mogą być użyte do modelowania logiki kombinatorycznej lub sekwencyjnej (systemverilog ma always_comb i always_ff, aby to wyjaśnić). Podczas modelowania logiki kombinatorycznej zwykle bardziej efektywne jest użycie =, ale zazwyczaj nie ma to większego znaczenia.
Podczas modelowania logiki sekwencyjnej (np. Zawsze @ (posedge clk)) zwykle używasz zadań nieblokujących. Pozwala to zniechęcić „stan po zboczu zegara” pod względem „stanu przed zboczem zegara”.
Czasami przydaje się stosowanie przypisań blokujących w sekwencyjnych blokach zawsze jako „zmiennych”. Jeśli to zrobisz, musisz pamiętać o dwóch kluczowych zasadach.
Złamanie tych reguł może spowodować błędy syntezy i / lub różnice w zachowaniu między symulacją a syntezą.
źródło
Termin Blokowanie przypisanie dezorientuje ludzi, ponieważ słowo blokowanie wydaje się sugerować logikę czasową sekwencyjny. Ale w zsyntetyzowanej logice nie oznacza to , ponieważ wszystko działa równolegle .
Być może mniej mylącym terminem byłoby natychmiastowe przypisanie , które nadal różnicowałoby pośrednie wyniki logiki kombinacyjnej od danych wejściowych do nieprzezroczystych elementów pamięci (na przykład rejestrów taktowanych), które mogą mieć opóźnione przypisanie .
Z legalistycznego punktu widzenia wszystko działa bardzo ładnie. Można w rzeczywistości, należy rozważyć
=
być blokowanie (czas sekwencyjny) działanie nawet w obrębiealways_comb
sekwencji. Jednak rozróżnienie między sekwencją czasową i równoległą nie ma w tym przypadku absolutnie żadnej różnicy, ponieważalways_comb
blok jest zdefiniowany tak, aby powtarzał się, dopóki sekwencja instrukcji nie zbiegnie do stanu stabilnego - dokładnie to zrobi obwód sprzętowy (jeśli spełni czas wymagania).Syntetyczny podzbiór Verilog (a zwłaszcza SystemVerilog) jest niezwykle prosty i łatwy w użyciu - gdy poznasz niezbędne idiomy. Musisz tylko porzucić sprytne użycie terminologii związanej z tak zwanymi elementami behawioralnymi w języku.
źródło
initial
instrukcji wprogram
blokach, wykorzystuje wyłącznie (sekwencyjne w czasie) przypisanie blokujące . Jest to przydatne do projektowania testbench , ale ogólnie nie do specyfikacji RTL.