
Сообщение от
omercury
Он процитирован, и кажется идентичным отображённому в посте.
Я там добавил спойлер с примером.

Сообщение от
omercury
Вернёмся к условию задачи:
Валидные значения: 'b01, 'b10 и 'b11
Блок case, также, как и if/else, выполняет только
одну ветку из всех условий, находящихся в блоке.
Чтоб сделать наглядней абсурдность ситуации, заменим <operators> на установку и сброс триггера.
блок
Код:
case (in)
2'b10 : reg <= 1'b1;
2'b01 : reg <= 1'b0;
обработает одно из двух валидных состояний, пропущено значение 'b11
блок
Код:
if(in1) reg <= 1'b1;
elseif(in2) reg <= 1'b0;
обработает один из 3х доступных вариантов
а что сделает это?

Сообщение от
HardWareMan
// Общий блок внутри begin/end
if (in1 & ~in2) begin ... end
if (~in1 & in2) begin ... end
// Конец общего блока
Ровно то же самое, что и в твоём примере с case. 1 условие из двух. Ведь мы же хорошие мальчики и переносим сигналы условия в свой тактовый домен, верно? И у case точно такие же требования. Ну а чтобы модифицировать мой пример под твой пример, то надо описать вот так:
Код:
// Общий блок внутри begin/end
if (in1 & ~in2) begin ... end
if (~in1 & in2) begin ... end
if (in1 & in2) begin ... end
// Конец общего блока
Что касается твоего:
Код:
if(in1) reg <= 1'b1;
elseif(in2) reg <= 1'b0;
То он тоже обработает один из 2х доступных вариантов:
1. in1=1, тогда он по приоритету сработает и значение in2 проигнорируется.
2. in1=0, тогда проанализируется значение in2.
И согласись, это совсем не то, что ты описал как {1,0}:{0,1}:{1:1}. Это будет соответствовать вот такой таблице:
Код:
in1 in2 res
1 x #1
0 1 #2
0 0 --
Мой пример для этого будет выглядеть вот так:
Код:
// Общий блок внутри begin/end
if (in1) begin ... end
if (~in1 & in2) begin ... end
// Конец общего блока
В общем, следует понимать, что все условия на одном уровне в одном блоке обрабатываются одновременно. Но так как мы и так избавляемся от метастабильности (а кто не избавляется, то сам себе злобный буратино) то можно сказать, что case это лишь красивое описание группы таких условий. Причем даже твой случай в case можно описать как комбинация 2'b1x + 2'b01 и оно сработает. Т.е., в большинстве случаев case и группа if в одном блоке решение равноправное. А вот случаи, когда красивее то или иное решение есть. В случае с case это когда надо организовать условие с default. Надеюсь, не надо объяснять в чём сила этого самого default? А в случае с набором условий - да хоть мой пример выше. Или иногда надо организовать несколько значений, которые проще описать в виде логического уравнения, например (in1 | (in2 & ~in3)). Потому как это ведет к перечислению всех вариантов, которые попадают под эту формулу в одном условии case. А в случае данной формулы это будет целых 5 значений. Хотя, если константы именованы то case тупо нагляднее, о чём я и говорил: удобство для погромиста.