目次
1. Wstęp
Verilog jest jednym z języków opisu sprzętu (HDL) szeroko stosowanych w projektowaniu układów cyfrowych. Jedną z jego cech jest instrukcjacase, będąca niezbędnym konstruktem do efektywnego opisywania rozgałęzień warunkowych. Jest ona szczególnie powszechna w projektowaniu automatów stanowych (FSM) oraz multiplekserów.
W tym artykule omówimy podstawy, zaawansowane przypadki użycia oraz dobre praktyki dotyczące instrukcji case w Verilogu. Z praktycznymi przykładami kodu wyjaśnianymi krok po kroku, nawet początkujący będą mogli łatwo podążać za opisem, więc warto przeczytać całość do końca.2. Podstawowa składnia instrukcji case w Verilogu
Czym jest instrukcja case?
Instrukcja case w Verilogu jest konstruktem, który wykonuje różne operacje w zależności od podanego warunku (selektora). Działa podobnie do instrukcji switch-case w języku C, ale z pewnymi istotnymi różnicami.
Podstawowa składnia wygląda następująco:case (expression)
condition1: statement1;
condition2: statement2;
condition3: statement3;
default: statement4; // Executes if no condition matches
endcase
Podstawowe użycie case
Poniższy przykład pokazuje prostą instrukcję case, która przypisuje różne sygnały do out w zależności od 2‑bitowego wejścia sel:module case_example(input [1:0] sel, output reg [3:0] out);
always @(*) begin
case (sel)
2'b00: out = 4'b0001;
2'b01: out = 4'b0010;
2'b10: out = 4'b0100;
2'b11: out = 4'b1000;
default: out = 4'b0000; // Default value for safety
endcase
end
endmodule
Tutaj out przyjmuje różne wartości w zależności od sel. Dzięki włączeniu przypadku default, nieoczekiwane wejścia są obsługiwane w sposób bezpieczny.Różnice między case, casex i casez
Verilog udostępnia rozszerzone formy instrukcji case: casex i casez. Działają one jak maski wieloznaczne, pozwalając ignorować niektóre bity.
| Składnia | Charakterystyka |
| ——– | ————— |
| case | Wymaga dokładnego dopasowania (domyślne zachowanie) |
| casex | Ignoruje wartości X (nieznane) i Z (wysoka impedancja) |
| casez | Ignoruje tylko wartości Z | Przykład użycia casez:casez (sel)
2'b1?: out = 4'b1111; // Matches if the MSB is 1
2'b01: out = 4'b0001;
default: out = 4'b0000;
endcase
Tutaj 1? oznacza, że dopóki najbardziej znaczący bit jest równy 1, dopasowanie zachodzi niezależnie od niższego bitu. 
3. Praktyczne przykłady użycia case
Podstawowe rozgałęzienie warunkowe
Poniższy przykład przedstawia prosty dekoder CPU, który wykonuje różne operacje w zależności od wartości 8‑bitowegoopcode:module decoder(input [7:0] opcode, output reg [3:0] control_signal);
always @(*) begin
case (opcode)
8'h00: control_signal = 4'b0001; // NOP
8'h01: control_signal = 4'b0010; // ADD
8'h02: control_signal = 4'b0100; // SUB
default: control_signal = 4'b0000; // Undefined instruction
endcase
end
endmodule
Użycie case w automatów stanowych
Instrukcja case jest szeroko stosowana w FSM (Finite State Machines):typedef enum reg [1:0] {IDLE, RUN, STOP} state_t;
state_t current_state, next_state;
always @(posedge clk) begin
if (reset)
current_state <= IDLE;
else
current_state <= next_state;
end
always @(*) begin
case (current_state)
IDLE: next_state = RUN;
RUN: next_state = STOP;
STOP: next_state = IDLE;
default: next_state = IDLE;
endcase
end
Implementuje to automat o 3 stanach. Dla układów wymagających zarządzania stanem, case znacząco upraszcza logikę.4. Dobre praktyki i uwagi
Podczas korzystania z instrukcjicase w Verilogu, należy mieć na uwadze następujące kwestie:1. Zawsze uwzględniaj przypadek default
Ważne jest pokrycie wszystkich możliwych wejść. W syntezie FPGA lub ASIC pominięcie default może spowodować niezamierzone generowanie latchy.2. Używaj casex i casez z ostrożnością
Te konstrukcje mogą dopasowywać niezamierzone sygnały. Zawsze symuluj dokładnie, gdy ich używasz.casez (sel)
2'b1?: out = 4'b1111; // Matches if MSB = 1
2'b01: out = 4'b0001;
default: out = 4'b0000;
endcase
3. Nie nadużywaj case
Dla małych gałęzi warunkowych, if-else może być bardziej intuicyjny i czytelny. Używaj case głównie wtedy, gdy istnieje wiele opcji do obsłużenia.5. Wnioski
W tym artykule omówiliśmy następujące kwestie dotyczące instrukcjicase w Verilogu:
✅ Podstawowa składnia i zachowanie
✅ Różnice między case, casex i casez ✅ Praktyczne zastosowanie (gałęzie warunkowe, maszyny stanów – FSM)
✅ Kluczowe uwagi i najlepsze praktyki Poprawne użycie instrukcji case w Verilogu pozwala zwiększyć czytelność i zapobiec błędom projektowym. Stosuj te koncepcje w swoich przyszłych projektach!Co dalej uczyć się w Verilogu
Gdy zrozumiesz instrukcjęcase, kolejnym krokiem jest poznanie bloku always oraz różnicy między obwodami kombinacyjnymi a sekwencyjnymi celu głębszego zrozumienia projektowania w Verilogu.


