Menu
Coddy logo textTech

Casex And Casez

Часть раздела Основы путешествия по Verilog на Coddy. Урок 56 из 90.

Иногда вас интересуют только определённые биты значения, тогда как остальные биты можно проигнорировать. Например, в приоритетном энкодере нужно найти первый бит 1 независимо от остальных битов.

Обычный case statement потребовал бы перечислить каждую возможную комбинацию неважных битов, что невозможно для широких шин.

<strong>casez</strong> и <strong>casex</strong> решают эту проблему, позволяя помечать определённые биты как «не имеющие значения» с помощью ?, z или x.

Casez vs Casex vs Обычный case

StatementБиты безразличияЛучше всего подходит для
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 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

? означает «неважно». Этот бит может быть равен 0, 1 или чему угодно.

challenge icon

Задание

Что нужно сделать:

Add пропущенное casez statement, чтобы этот decoder заработал.

Как это работает:

  • 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
  • default → out = 4'b0000

Попробуйте сами

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Проверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Основы

Потренируйтесь самостоятельно: Онлайн-компилятор Verilog