Verilog Cheat Sheet: ściąga z Veriloga
Ostatnia aktualizacja
Struktura modułu i porty
Moduł to podstawowy element konstrukcyjny: ma nazwę i listę portów.
| Składnia | Znaczenie |
|---|---|
module adder(...); ... endmodule | Definicja modułu i jego ciała |
input clk; | Port wejściowy |
output q; | Port wyjściowy |
output reg q; | Wyjście sterowane z bloku always |
input [7:0] data; | 8-bitowa magistrala wejściowa (wektor) |
inout sda; | Port dwukierunkowy |
adder u1 (.a(x), .b(y), .sum(s)); | Instancja modułu z nazwanymi portami |
Typy danych
wire modeluje połączenie; reg przechowuje wartość przypisywaną przez kod proceduralny.
| Element | Co robi |
|---|---|
wire w; | Sieć sterowana przez assign lub wyjście modułu |
reg r; | Przechowuje wartość przypisaną w bloku always/initial |
wire [3:0] bus; | Wektor 4-bitowy (bity od 3 do 0) |
reg [7:0] count; | Rejestr 8-bitowy |
bus[2] | Wybór pojedynczego bitu |
bus[3:1] | Wybór zakresu bitów (part-select) |
reg mem [0:255]; | Pamięć: tablica rejestrów |
parameter WIDTH = 8; | Nazwana stała modułu |
Literały liczbowe
Format to <size>'<base><value>: rozmiar w bitach, podstawa jako b/o/d/h.
| Składnia | Znaczenie |
|---|---|
4'b1010 | 4-bitowa liczba binarna, wartość 10 |
8'hFF | 8-bitowa liczba szesnastkowa, wartość 255 |
8'hff | To samo: wielkość liter cyfr szesnastkowych nie ma znaczenia |
16'd255 | 16-bitowa liczba dziesiętna, wartość 255 |
3'o7 | 3-bitowa liczba ósemkowa, wartość 7 |
8'b1010_1100 | Podkreślniki grupują cyfry dla czytelności |
1'bx | Nieznana wartość bitu (x) |
1'bz | Wartość bitu w stanie wysokiej impedancji (z) |
Operatory
Operatory bitowe, logiczne, porównania i redukcji.
| Operator | Co robi |
|---|---|
& | ^ ~ | Bitowe AND, OR, XOR, NOT |
&& || ! | Logiczne AND, OR, NOT (zwracają 1 bit) |
== != < > <= >= | Operatory porównania |
<< >> | Przesunięcie w lewo i w prawo |
+ - * / % | Operatory arytmetyczne |
&bus | Redukcja AND (AND wszystkich bitów) |
|bus | Redukcja OR (OR wszystkich bitów) |
^bus | Redukcja XOR (parzystość wszystkich bitów) |
{a, b} | Konkatenacja; {4{1'b1}} powiela do 4'b1111 |
Przypisanie ciągłe
assign steruje sygnałem wire w sposób ciągły: używaj go do logiki kombinacyjnej.
| Składnia | Znaczenie |
|---|---|
assign y = a & b; | Steruje y wynikiem AND z a i b |
assign sum = a + b; | Ciągłe obliczanie sumy |
assign y = sel ? a : b; | Operator trójargumentowy: multiplekser 2 na 1 |
assign {c, s} = a + b; | Przechwycenie przeniesienia i sumy naraz |
assign y = ~en; | Sterowanie sygnałem wire przez zanegowany sygnał |
Bloki proceduralne
always i initial wykonują instrukcje; lista czułości decyduje, kiedy.
| Składnia | Znaczenie |
|---|---|
always @(*) begin ... end | Logika kombinacyjna (każda zmiana wejścia) |
always @(posedge clk) | Wykonanie na każdym zboczu narastającym zegara (sekwencyjne) |
always @(negedge clk) | Wykonanie na każdym zboczu opadającym zegara |
always @(posedge clk or posedge rst) | Blok taktowany z asynchronicznym resetem |
initial begin ... end | Jedno wykonanie w chwili 0 (testbenche, tylko symulacja) |
begin ... end | Grupowanie kilku instrukcji |
#10 | Opóźnienie o 10 jednostek czasu (tylko symulacja) |
Przypisania blokujące i nieblokujące
Używaj = do logiki kombinacyjnej, a <= do taktowanej logiki sekwencyjnej.
| Składnia | Znaczenie |
|---|---|
a = b; | Blokujące: wykonuje się po kolei, natychmiast |
a <= b; | Nieblokujące: najpierw odczyt wszystkich prawych stron, potem przypisanie |
always @(*) y = a & b; | Logika kombinacyjna: używaj blokującego = |
always @(posedge clk) q <= d; | Przerzutnik: używaj nieblokującego <= |
Mieszanie = i <= w jednym bloku | Unikaj tego: to częste źródło błędów |
Instrukcje sterujące
Warunki i rozgałęzienia wielokierunkowe w blokach proceduralnych.
| Składnia | Znaczenie |
|---|---|
if (cond) ... else ... | Instrukcja warunkowa |
if (a) x = 1; else x = 0; | If/else w jednej linii |
case (sel) ... endcase | Rozgałęzienie wielokierunkowe według wartości |
2'b00: y = a; | Element case |
default: y = 0; | Domyślny element case |
for (i = 0; i < 8; i = i + 1) | Pętla (często w generate lub symulacji) |
repeat (4) @(posedge clk); | Powtórzenie instrukcji N razy |
Popularne wzorce
Elementy, które piszesz raz po raz, oraz zadania testbenchy.
| Wzorzec | Składnia |
|---|---|
| Przerzutnik D | always @(posedge clk) q <= d; |
| Rejestr z resetem | always @(posedge clk) if (rst) q <= 0; else q <= d; |
| Licznik | always @(posedge clk) count <= count + 1; |
| Rejestr stanu FSM | always @(posedge clk) state <= next_state; |
| Logika następnego stanu FSM | always @(*) case (state) ... endcase |
| Wypisanie wartości | $display("q = %b", q); |
| Wypisanie przy zmianie | $monitor("t=%0t q=%b", $time, q); |
| Zakończenie symulacji | $finish; |
Cała składnia Veriloga, której potrzebujesz, na jednej stronie. Ten Verilog cheat sheet to szybka ściąga z języka opisu sprzętu: deklarowanie modułów i portów, wybór typów danych, pisanie logiki kombinacyjnej i sekwencyjnej oraz wzorce bloków always, które opisują prawdziwe układy.
Składnia opisana tutaj to standardowy Verilog (IEEE 1364), który działa w popularnych symulatorach, takich jak Icarus Verilog i Verilator. Skopiuj to, czego potrzebujesz, albo sprawdź na żywo w edytorze online Veriloga: napisz moduł, zasymuluj go i zobacz wynik w przeglądarce.
Verilog cheat sheet: FAQ
Czy ten Verilog cheat sheet jest darmowy?
Czym różni się wire od reg?
wire modeluje fizyczne połączenie i musi być sterowany w sposób ciągły, przez instrukcję assign lub wyjście modułu, więc używasz go dla sieci kombinacyjnych. reg przechowuje wartość, dopóki kod proceduralny jej nie zmieni, więc używasz go dla wszystkiego, co jest przypisywane w bloku always lub initial. Wbrew nazwie reg nie zawsze staje się sprzętowym rejestrem; oznacza tylko, że wartość jest ustawiana proceduralnie.Czym różni się przypisanie blokujące od nieblokującego?
=) wykonuje się natychmiast i po kolei, jak zwykła instrukcja w programie, więc używaj go do logiki kombinacyjnej w blokach always @(*). Przypisanie nieblokujące (<=) najpierw oblicza wszystkie prawe strony, a potem razem aktualizuje lewe, co poprawnie modeluje przerzutniki, więc używaj go w taktowanych blokach always @(posedge clk). Mieszanie obu w jednym bloku to klasyczne źródło błędów symulacji.