Menu
Coddy logo textTech

Casex와 Casez

Coddy Verilog 여정의 기초 섹션에 포함된 레슨 — 90개 중 56번째.

때로는 값 내의 특정 비트에만 관심이 있고, 다른 비트들은 무시해도 되는 경우가 있습니다. 예를 들어, 우선순위 인코더(priority encoder)에서는 다른 비트들과 상관없이 첫 번째 1 비트를 찾고자 합니다.

일반적인 case 문은 don't-care 비트의 모든 가능한 조합을 나열해야 하며, 이는 폭이 넓은 버스(wide buses)에서는 불가능합니다.

<strong>casez</strong><strong>casex</strong>?, z, 또는 x를 사용하여 특정 비트를 "don't care"로 표시할 수 있게 함으로써 이 문제를 해결합니다.

Casez vs Casex vs 일반 Case

구문Don't-Care 비트최적의 용도
case없음정확한 매칭
casezz 또는 ?우선순위 인코더 (권장됨)
casexx, z 또는 ?피해야 함 (버그를 숨김)
  • <strong>casez</strong>z 또는 ?인 비트를 무시합니다 (권장됨)
  • <strong>casex</strong>는 또한 x 비트를 무시합니다 — 이는 시뮬레이션 오류를 숨길 수 있습니다

항상 <strong>casez</strong>를 사용하고, <strong>casex</strong>는 사용하지 마십시오. casex가 먼저 만들어졌지만, 엔지니어들은 이것이 x 값(종종 초기화되지 않은 레지스터나 시뮬레이션 오류를 나타냄)을 무시하기 때문에 위험하다는 사실을 깨달았습니다. casez는 더 안전한 대안으로 도입되었습니다.

예제

casez (data)
  4'b???1: out = 0;   // Bit0은 1이어야 하며, 나머지는 상관없음
  4'b??1?: out = 1;   // Bit1은 1이어야 하며, 나머지는 상관없음
  4'b?1??: out = 2;   // Bit2는 1이어야 하며, 나머지는 상관없음
  4'b1???: out = 3;   // Bit3은 1이어야 하며, 나머지는 상관없음
endcase

?는 "상관없음(don't care)"을 의미합니다. 해당 비트는 0, 1 또는 무엇이든 될 수 있습니다.

challenge icon

챌린지

할 일:

이 디코더가 작동하도록 누락된 casez 문을 추가하세요.

작동 원리:

  • input = 4'b???1out = 4'b0001
  • input = 4'b??1?out = 4'b0010
  • input = 4'b?1??out = 4'b0100
  • input = 4'b1???out = 4'b1000
  • 기본값 → out = 4'b0000

치트 시트

casez? 또는 z를 사용하여 무관 비트(don't-care bits)를 포함한 패턴 매칭을 허용하며, 특정 비트만 중요한 우선순위 인코더(priority encoders)에 유용합니다.

구문무관 비트(Don't-Care Bits)참고 사항
case없음정확한 매칭
casezz 또는 ?권장됨
casexx, z, 또는 ?사용 지양 — 버그를 숨길 수 있음

항상 casex보다 casez를 우선적으로 사용하세요. casexx 값을 무시하므로, 초기화되지 않은 레지스터나 시뮬레이션 오류를 가릴 수 있습니다.

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
  default: out = 0;
endcase

?는 "무관(don't care)"을 의미하며, 해당 비트는 0, 1 또는 어떤 값이라도 될 수 있습니다.

직접 해보기

module decoder (
  input [3:0] in,
  output reg [3:0] out
);
  
  always @(*) begin
    // TODO: 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 icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

기초의 모든 레슨