Menu
Coddy logo textTech

CaseX i CaseZ

Część sekcji Podstawy ścieżki Verilog w Coddy. Lekcja 56 z 90.

Czasami interesują Cię tylko konkretne bity w wartości, a pozostałe bity można zignorować. Na przykład w enkoderze priorytetowym chcesz znaleźć pierwszy bit 1, niezależnie od pozostałych bitów.

Zwykła instrukcja case wymagałaby wypisania każdej możliwej kombinacji bitów typu „don't-care”, co jest niemożliwe w przypadku szerokich magistral.

<strong>casez</strong> i <strong>casex</strong> rozwiązują ten problem, pozwalając oznaczyć niektóre bity jako „bez znaczenia” za pomocą ?, z lub x.

Casez vs Casex vs zwykły case

InstrukcjaBity bez znaczeniaNajlepsze zastosowanie
caseBrakDokładne dopasowanie
casezz lub ?Kodery priorytetowe (zalecane)
casexx, z lub ?Unikaj (ukrywa błędy)
  • <strong>casez</strong> ignoruje bity o wartości z lub ? (zalecane)
  • <strong>casex</strong> ignoruje również bity x, co może ukrywać błędy symulacji

Zawsze używaj <strong>casez</strong>, a nie <strong>casex</strong>. casex powstało jako pierwsze, ale inżynierowie zdali sobie sprawę, że jest niebezpieczne, ponieważ ignoruje wartości x (które często wskazują na niezainicjalizowane rejestry lub błędy symulacji). casez wprowadzono jako bezpieczniejszą alternatywę.

Przykład

casez (data)
  4'b???1: out = 0;   // Bit0 must be 1, others don't matter
  4'b??1?: out = 1;   // Bit1 must be 1, others don't matter
  4'b?1??: out = 2;   // Bit2 must be 1, others don't matter
  4'b1???: out = 3;   // Bit3 must be 1, others don't matter
endcase

? oznacza „dowolna wartość”. Ten bit może mieć wartość 0, 1 albo dowolną inną.

challenge icon

Wyzwanie

Co zrobić:

Dodaj brakującą instrukcję casez, aby ten dekoder działał.

Jak to działa:

  • input = 4'b???1 → out = 4'b0001
  • input = 4'b??1? → out = 4'b0010
  • input = 4'b?1?? → out = 4'b0100
  • input = 4'b1??? → out = 4'b1000
  • Domyślnie → out = 4'b0000

Spróbuj swoich sił

module decoder (
  input [3:0] in,
  output reg [3:0] out
);
  
  always @(*) begin
    // TODO: Dodaj instrukcję casez
    // in = 4'b???1 -> out = 4'b0001
    // in = 4'b??1? -> out = 4'b0010
    // in = 4'b?1?? -> out = 4'b0100
    // in = 4'b1??? -> out = 4'b1000
    // default -> out = 4'b0000
  end
  
endmodule
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Podstawy

Poćwicz samodzielnie: Kompilator Verilog online