使用 for 循环在 verilog 中获取 xxx 的输出



我正在尝试学习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)

相关内容

最新更新