При описании комбинационной логики в блоках always
вы должны убедиться, что все ваши переменные присвоены значению во всех путях в вашем коде.В противном случае будет обнаружена защелка.Легко пропустить что-то подобное в традиционных блоках always
, поэтому в SystemVerilog был введен блок always_comb
, чтобы явно проверить это.
В вашем случае у вас есть несколько шин, которые не назначенызначения в каждой ветви оператора case, например, mcand
не имеет значения, назначенного ему в ветвях nao_multiplicar
и fim
.
Существует 2 решения.Во-первых, нужно назначить все переменные во всех ветвях кода.
Другое решение - записать значения по умолчанию для всех переменных в always_comb
перед оператором case.Таким образом, каждая переменная всегда будет присваиваться значению каждый раз, когда срабатывает блок always_comb
, и предупреждений не будет.В этом случае вы должны иметь дело только с переменными, которые нужно изменить:
always_comb
begin
// Defaults (I think I got them all)
mplier = multiplier;
mcand = multiplicand;
Prod_aux = 0;
Prod = 0;
cont_aux = 0;
cont = 0;
Product = 0;
endm = 0;
// Now override the defaults when appropriate
case(state)
inicio:
begin
mplier = multiplier;
mcand = multiplicand;
Prod = 0;
cont_aux = cont + 1;
cont = cont_aux;
end
multiplicar:
begin
mcand_aux = mcand << 1;
mcand = mcand_aux ;
mplier_aux = mplier >> 1;
mplier = mplier_aux ;
Prod_aux = Prod + mcand;
Prod = Prod_aux;
cont_aux = cont + 1;
cont = cont_aux;
end
nao_multiplicar:
begin
cont_aux = cont + 1;
cont = cont_aux;
end
fim:
begin
Product = Prod;
endm = 1;
end
endcase
end