case

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

Если ни один из элементов case не соответствует заданному выражению, выполняются инструкции внутри необязательный элемента default. Операторы case могут быть вложенными.

Синтаксис

case (<expression>)
  case_item1 :  <single statement>
  case_item2,
  case_item3 :  <single statement>
  case_item4 :  begin
                  <multiple statements>
                end
  default    : <statement>
endcase

Пример

module mux_(input [2:0]  a, b, c, input [1:0]  sel, output reg [2:0]  out); 
  always @(*) begin
    case(sel)
      2'b00   : out = a;     
      2'b01   : out = b;     
      2'b10   : out = c;     
      2'bz    : out = 3'bz;   
      2'bx    : out = 3'bx;   
      default : out = 0;     
    endcase
  end
endmodule

module case_tb;
  reg [2:0] aa, bb, cc, d;
  reg [1:0] sel;

  mux_ mux(aa, bb, cc, sel, d);
  initial begin
    $display("Time\t a \t b \t c \tout\tsel");
    $monitor("[%2t]\t%b\t%b\t%b\t%b\t%b", $time, aa, bb, cc, d, sel);
    #10 bb = 0; cc = 1;
    #10 sel = 0;
    #10 aa = 1;
    #10 sel = 1;
    #10 sel = 2;
    #10 cc = 2'bz;
    #10 sel = 5;
    #10 sel = 2;
    #10 sel = 2'bz;
    #10 sel = 2'bx;
  end
endmodule

Результат исполнения

casex/casez

Особые варианты case: casex и casez. Оба оператора используются для упрощения условных операторов за счет уменьшения количества принимаемых условных решений.

Ключевые различия:

  • case : точное сравнение всех бит (1, 0, x, z)

  • casez: игнорирует только z (1, 0, x)

  • casex: игнорирует и x, и z (1, 0)

? – символ, обозначающий, что значение бита на указанной позиции может иметь любое значение.

Пример casex/casez/case

Результат исполнения case
Результат исполнения casex
Результат исполнения casez

unique/priority

В SystemVerilog добавлены варианты unique и priority:

  • unique-case

  • unique0-case

  • priority-case

Гарантирует, что ровно один вариант условия совпадает с выражением. Если совпадает более одного или ни одного - генерируется ошибка или предупреждение.

Аналогично unique-if и unique0-if unique0-case не генерирует предупреждения/ошибки.

Результат исполнения unique-case

Результат исполнения unique0-case

priority-case гарантирует, что хотя бы один вариант условия совпадает с выражением. Выполняется первый совпадающий вариант.

Результат исполнения priority-case

Результат исполнения case

Last updated