Оператор case работает так же, как и оператор switch в C. При заданном входе оператор проверяет, соответствует ли данное выражение одному из выражений в списке констант. Оператор case является частным случаем конструкции if-else с большим количеством ветвлений. Оператор case нашел широкое применение в комбинационной логике, в частности очень удобен при описании дешифраторов и конечных автоматов, также может быть предпочтительней конструкции if-else, при наличии большого числа условий. Синтаксис выглядит следующим образом:

case (<expression>) 
item_1 : begin 
<multiple statements> 
end 
item_2, 
item_3 : <statement> 
item_4 : <statement> 
default : <statement> 
endcase

Конструкция case начинается с ключевого слова case, выражение (expression) будет оцениваться ровно один раз и сравниваться со списком констант (item_1, item_2 и т.д) в порядке их написания, при соответствии с кокай-либо константой выполняется выражение (statement) соответсвующие данной константе, при несовпадении ни с одной константой выполняется условие default, и заканчивается ключевым словом endcase. Также, выражения в каждой из ветвей могут содержать различные конструкции begin-end, if-else, т.е. быть вложенными.  

Оператор case обязан находится внутри операторов always.

Рисунок 1 – Дешифратор семисегментного индикатора с использованием оператора case на языке SystemVerilog

 

Рисунок 2 – Компиляция модуля segsev

Рисунок 3 – Симуляция модуля segsev

         В общем случае ветвь default необязательна, но в некоторых случаях, когда не все сочетания входов перечислены, просто необходима. Примером является семисегментник, изображенный на рисунке 1, его вход d – четырехразрядная шина, общее количество всевозможных входных комбинаций 16 из них перечислено всего 10. При отсутствии ветви default и наличие не перечисленной константы, комбинационная логика дешифратора превратиться в регистровую.

Рисунок 4 – Дешифратор 3: 8

На рисунке 4 показан дешифратор 3:8, в данном случае необходимость в default нет, т.к. перечислены все возможные комбинации входов, но оно полезно, если один из входов равен z или x.