Найти тему

Case – оператор выбора в языке Verilog

В статье рассмотрены основы работы с операторами case, casex и casez.

Синтаксис:

case (выражение)
альтернатива_1: оператор_1_1;
альтернатива_2: begin
оператор_2_1;
оператор_2_2;
...
оператор_2_n;
end
альтернатива_3, альтернатива_4: оператор_3_1;
альтернатива_5: ;
...
альтернатива_n: оператор_n;
default: оператор_m;
endcase

Все альтернативы имеют такой же тип данных, как и выражение. Несколько альтернатив, необходимых для выполнения одинакового блока операторов, могут перечисляться через запятую. Оператор может быть простым, либо составным (блок операторов), заключенным в конструкцию begin end.

Сравнения выражения с альтернативами происходит в порядке записи от верхней альтернативы к нижней. После выполнения оператора, принадлежащего какой-либо альтернативе, дальнейшее сравнение заканчивается и следующие альтернативы игнорируются. Поэтому, для повышения быстродействия, рекомендуется размещать наиболее часто используемые альтернативы в начале списка.

Если выражение не удовлетворило ни одной из альтернатив, выполнится блок операторов default. Default не является обязательным и может не употребляться. В таком случае, если выражение не совпадет ни с одной из альтернатив, никакие операторы выполнены не будут. Однако, синтезатор может выдать предупреждение и том, что существуют значения выражения, для которых не существует альтернатив. Кроме того, допускается записать выражение, опустив при этом операторы.

Casex и casez

Данные операторы имеют такой же синтаксис, как и case, но имеет в записи своих альтернатив так называемые отсоединенные разряды.

Пример:

`timescale 1 ns / 1 ps

module test
(
input wire [3:0] ctrl,
input wire in1,
input wire in2,
output reg out
);

always (*)
casex (ctrl)
4'bx01x: out <= in1 && in2;
4'bx10x: out <= in1 || in2;
default: out <= 0;
endcase

endmodule

Если в альтернативе присутствует значение х, то этот разряд интерпретируется как отсоединенный и его значение игнорируется. Т. е. в примере, если если выражение ctrl будет равно 0010 или 0011, или 1010, или 1011, выполнится оператор

out <= in1 && in2

Аналогичным образом работает и оператор casez, но значение x необходимо заменить на z.

Наука
7 млн интересуются