В приведенных вами примерах код ведет себя идентично коду c. Переменная получает переназначенные новые значения и последнее выигрывает. В verilog это верно для блокирующих (=) или неблокирующих (<=) назначений, но не для их сочетания. </p>
Как и в 'c', это зависит от техники оптимизации компилятора. Это может устранить ненужные назначения, поэтому релевантным является только последнее.
В вашем первом примере значение 'C' будет равно 'B' в конце блока. Значение 'C' во втором примере будет либо 0
, либо B
, в зависимости от A
.
Теперь, для простоты объяснения, смешивание блокировки и неблокирующие назначения вызовут последний выигрыш «неблокирующих» назначений. Причина в том, что все nba выполняются после завершения блока.
always @(*) begin
C <= A;
C = B;
end
Значение C
будет A
в конце цикла моделирования.
Что касается вопроса об использовании промежуточных значений, то здесь нет разницы. Вы используете их по мере необходимости. Компилятор симуляции или синтез оптимизирует ваш код в любом случае. Последний пример абсолютно нормален, за исключением того, что он вообще ничего не меняет. Он ведет себя так же, как и этот, который, на мой взгляд, более явный и более читаемый. Единственная проблема заключается в том, что вы неправильно используете назначения nba в комбинационной логике c (что я исправил).
always @(*)
begin
if (A==1)
C = B ;
else
C = 1'b0;
Полагаю, в вашем посте есть еще один немой вопрос, будет ли промежуточное значение вызывать события на ' C ', ответ в этом случае нет . События не будут производиться блоком Always до тех пор, пока он не завершит свое выполнение (или пока он не достигнет задержки или не начнет ожидать события). Итак, релевантно только последнее значение.
В коде тестового стенда вы можете увидеть такую ситуацию:
always @* begin
C = A;
C = B;
#5 C = D;
end
В приведенном выше случае значение C
станет B
. Выполнение блока Always будет остановлено из-за задержек # 5. В течение этого времени другие блоки будут видеть значение B
. В тиках # 5 значение будет изменено на D
.