Должен сказать, что я не согласен с аква.То, что он (и wisemonkey) говорит о @*
, правильно, но все остальное неправильно.
Эти две строки не имеют ничего общего с состоянием бездействия.Эти утверждения являются хорошей практикой кодирования.Они гарантируют, что эти два выхода всегда назначаются при оценке этого блока.Давайте посмотрим, почему это важно:
- Представьте, что этих двух утверждений нет.
- Далее предположим, что
state_reg = S0
и a = b = 0
- Какмы вычисляем блок Always, вводим инструкцию case, половину s0 и присваиваем 1 для
y1
a
, равным нулю, поэтому мы не вводим оператор if и выпадаем из регистраи завершить блок
В конце блока y1 == 1
и y0 == ...
erm, зависнуть на том, что получает y0
?Я предполагаю, что это должно сохранить это старое значение.Он не получил новый.
Это означает, что возможно y0
должен помнить, что это значение от одного цикла к следующему.Это означало бы, что для этого нужна какая-то память, например, регистр или защелка.В этом случае это будет защелка, написанная в стиле, который иногда управляет выводом, а иногда и удерживает его.
... но мы этого не хотим.y1
и y0
должны были быть простыми проводами.Поэтому мы должны удостовериться, что каждому из них всегда назначается, независимо от состояния или входов.Мы могли бы сделать это, имея назначения во всех ветвях логики, но это становится большой работой.В качестве альтернативы у нас может быть задание по умолчанию, которое мы позже переопределим при необходимости.
Причина, по которой эти операторы не вводят y1
при переходе к 0
в s0
или s1
, заключается в том, что все, что происходит внутри блока Always, происходит без прохождения времени.Время не проходит между 0
, назначаемым сверху, и 1
в s0
или s1
.Все, что видно, это конечное состояние.
Вы заметите, что код делает то же самое с переменной состояния.У него есть присвоение по умолчанию, что следующее состояние является текущим состоянием, и затем переопределяет, что оно соответствует правильным условиям.
Хороший чистый конечный автомат.В этом нет ничего плохого.