Ваш код имеет предполагаемую защелку.Более того, вы использовали как блокирующие, так и неблокирующие назначения в одном и том же блоке всегда.
always
@(a or b or cin) begin //Not all dependencies are mentioned
sum <= (a ^ b & cin); //Non-blocking assignment
t1 = a & cin;
t2 = b & cin;
t3 = a & b;
cout = (t1 | t2) | t3;
end
Я предлагаю вам переписать блок всегда, как показано ниже.
always
@(*) begin
sum = (a ^ b & cin);
t1 = a & cin;
t2 = b & cin;
t3 = a & b;
cout = (t1 | t2) | t3;
end
На самом делевам не нужен блок всегда для вышеуказанной комбинационной логики.Просто используйте операторы assign.
module fa_seq(a, b, cin, sum, cout);
input a, b, cin;
output sum, cout;
wire t1, t2, t3;
assign sum = (a ^ b & cin);
assign t1 = a & cin;
assign t2 = b & cin;
assign t3 = a & b;
assign cout = (t1 | t2) | t3;
endmodule
Однако эффективный способ написания полного кода сумматора был бы: -
module fa_seq(a, b, cin, sum, cout);
input a, b, cin;
output sum, cout;
assign {cout,sum} = (a + b + cin);
endmodule