我正在尝试学习verilog,我不明白使用for循环时出了什么问题。
在我尝试实现的示例模块中,我将根据输入设置输出的第一位,而输出的其余位将根据输入和输出的前一位进行设置-
module example_module(A,B,C);
input [15:0] A;
input [15:0] B;
output [15:0] C;
reg[15:0] C;
integer i;
always@(A or B)begin
C[0] = A[0]&B[0];
for(i = 0;i<15;i=i+1)begin
C[i+1] = A[i+1]|(B[i+1]&C[i]) ;
end
end
endmodule
对于测试台-
`timescale 1ns/1ns
module example_module_tb;
reg[15:0] A;
reg[15:0] B;
wire [15:0] C;
example_module e(A,B,C);
initial begin
A = 16'd23;
B = 16'd32;
end
initial begin
$dumpfile("example_module_tb.vcd");
$dumpvars;
end
initial #400 $finish;
endmodule
当我在 veriwell 上运行它,然后使用 GTK wave 时,我得到的输出线 C 是 16'bxxx0,基本上第一个位是设置的,但其他位不是?
有人可以解释一下如何解决这个问题吗?
谢谢!
编辑:这是我正在使用的实际 3 个文件,但我为 CLA_logic_tb.v 获得了 xxx!
GP_generator.v
module GP_generator(A,B,G,P);
input [15:0] A;
input [15:0] B;
output [15:0] G;
output [15:0] P;
reg [15:0] G;
reg [15:0] P;
integer i;
always@(A or B)
begin
for(i = 0; i<16; i= i +1)begin
G[i] = A[i]&B[i];
P[i] = A[i]^B[i];
end
end
endmodule
CLA_logic.v
module CLA_logic(A,B,C);
input [15:0] A;
input [15:0] B;
output [15:0] C;
reg[15:0] C;
wire [15:0] G;
wire[15:0] P;
GP_generator g1(A,B,G,P);
integer i;
always@(A or B)begin
C[0] = A[0]&B[0];
for(i = 0;i<15;i=i+1)begin
C[i+1] = G[i]|(P[i]&C[i]) ;
end
end
endmodule
CLA_logic_tb.v
`timescale 1ns/1ns
module CLA_logic_tb;
reg[15:0] A;
reg[15:0] B;
wire [15:0] C;
CLA_logic c(A,B,C);
initial begin
A = 16'd23;
B = 16'd32;
end
initial begin
$dumpfile("CLA_logic_tb.vcd");
$dumpvars;
end
initial #400 $finish;
endmodule
设置了 C 的第一位,但其余的给出 xxx
好,任何还在看的人,
错误在始终块中!
而不是
always @(A or B)
它应该包括使用的所有变量!所以应该是
always @(A or B or G or P)