vvp时verilog中的无限循环
infinite loop in verilog when vvp
当我运行 vvp 时,这段代码陷入无限循环,我不知道为什么。
这段代码编译没有任何错误。
有没有人能弄清楚为什么这段代码会陷入死循环?
module full_adder(a, b, m, s);
parameter W = 4;
output [W-1:0] s;
input [W-1:0] a, b;
input [W:0] m;
reg i;
reg [W-1:0] s_;
always @(*) begin
for (i = 0; i < W; i = i + 1) begin
if (a[i] & b[i] & m[i]) s_[i] = 1;
else if (a[i] & ~b[i] & ~m[i] | ~a[i] & b[i] & ~m[i] | ~a[i] & ~b[i] & ~m[i]) s_[i] = 1;
else s_[i] = 0;
// when 1 is odd between a, b and carry then s is 1
end
end
assign s[W-1:0] = s_[W-1:0];
endmodule
module cla_gen(C, P, G, C0);
parameter W = 4;
output [W:0] C;
input [W-1:0] P, G;
input C0;
reg [W:0] c;
reg i;
always @(*) begin
for (i = 1; i <= W; i = i + 1) begin
c[i] = G[i-1] + P[i-1] & c[i-1];
end
end
assign C = c;
endmodule
module addsub_cla(S, C, V, A, B, M);
parameter W = 4;
output [W-1:0] S;
output C, V;
input [W-1:0] A, B;
input M;
wire [W:0] carry;
cla_gen CLAGEN(.C(carry), .P(A & ~B | ~A & B), .G(A & B), .C0(M));
assign carry[0] = M;
full_adder FA(.a(A), .b(B), .m(carry), .s(S));
assign C = carry[W];
assign V = (carry[W] != carry[W-1]) ? 1 : 0;
endmodule
您编写了两个无限循环。在此声明中,i
是一位宽:
reg i;
所以,这是一个无限循环(因为i
总是小于W
):
for (i = 1; i <= W; i = i + 1) begin
当然,你的意思是
integer i;
我建议始终对循环变量使用 integer
,而不是位宽更有限的其他类型。
当我运行 vvp 时,这段代码陷入无限循环,我不知道为什么。
这段代码编译没有任何错误。
有没有人能弄清楚为什么这段代码会陷入死循环?
module full_adder(a, b, m, s);
parameter W = 4;
output [W-1:0] s;
input [W-1:0] a, b;
input [W:0] m;
reg i;
reg [W-1:0] s_;
always @(*) begin
for (i = 0; i < W; i = i + 1) begin
if (a[i] & b[i] & m[i]) s_[i] = 1;
else if (a[i] & ~b[i] & ~m[i] | ~a[i] & b[i] & ~m[i] | ~a[i] & ~b[i] & ~m[i]) s_[i] = 1;
else s_[i] = 0;
// when 1 is odd between a, b and carry then s is 1
end
end
assign s[W-1:0] = s_[W-1:0];
endmodule
module cla_gen(C, P, G, C0);
parameter W = 4;
output [W:0] C;
input [W-1:0] P, G;
input C0;
reg [W:0] c;
reg i;
always @(*) begin
for (i = 1; i <= W; i = i + 1) begin
c[i] = G[i-1] + P[i-1] & c[i-1];
end
end
assign C = c;
endmodule
module addsub_cla(S, C, V, A, B, M);
parameter W = 4;
output [W-1:0] S;
output C, V;
input [W-1:0] A, B;
input M;
wire [W:0] carry;
cla_gen CLAGEN(.C(carry), .P(A & ~B | ~A & B), .G(A & B), .C0(M));
assign carry[0] = M;
full_adder FA(.a(A), .b(B), .m(carry), .s(S));
assign C = carry[W];
assign V = (carry[W] != carry[W-1]) ? 1 : 0;
endmodule
您编写了两个无限循环。在此声明中,i
是一位宽:
reg i;
所以,这是一个无限循环(因为i
总是小于W
):
for (i = 1; i <= W; i = i + 1) begin
当然,你的意思是
integer i;
我建议始终对循环变量使用 integer
,而不是位宽更有限的其他类型。