尝试实现 32 位加法器时出错

error trying to implement 32-bit adder

我正在尝试使用 verilog.But 添加两个 32 位数字,结果我得到了很多无关紧要的信息。 32位加法器使用4个8位adders.One 8位加法器使用一位Full-Adder.FAdder使用3转8位译码器。 这是我的代码-

module Decoder(D,x,y,z);
    input x,y,z;
    output [0:7] D;
    wire xn,yn,zn;

    not n1(xn,x);
    not n2(yn,y);
    not n3(zn,z);

    and a1(D[0],xn,yn,zn);
    and a2(D[1],xn,yn,z);
    and a3(D[2],xn,y,zn);
    and a4(D[3],xn,y,z);
    and a5(D[4],x,yn,zn);
    and a6(D[5],x,yn,z);
    and a7(D[6],x,y,zn);
    and a8(D[7],x,y,z);
endmodule

module FAdder(S,C,x,y,z);
    input x,y,z;
    output S,C;
    wire [0:7] D;

    Decoder dec(D,x,y,z);

    assign S= D[1] | D[2] | D[4] | D[7];
    assign C= D[3] | D[5] | D[6] | D[7];

endmodule


module eightbitAdder(S,Carry,in1,in2,z);
    input [7:0] in1;
    input [7:0] in2;
    input z;
    output [7:0] S;
    output Carry;
    wire  C[7:0]; 
    assign z=0;
    FAdder F1(S[0],C[0],in1[0],in2[0],z);
    FAdder F2(S[1],C[1],in1[1],in2[1],C[0]);
    FAdder F3(S[2],C[2],in1[2],in2[2],C[1]);
    FAdder F4(S[3],C[3],in1[3],in2[3],C[2]);
    FAdder F5(S[4],C[4],in1[4],in2[4],C[3]);
    FAdder F6(S[5],C[5],in1[5],in2[5],C[4]);
    FAdder F7(S[6],C[6],in1[6],in2[6],C[5]);
    FAdder F8(S[7],C[7],in1[7],in2[7],C[6]);
    assign Carry=C[7];
endmodule

module t32bitadder(S,Carry1,in1,in2);
    input [31:0] in1,in2;
    output [31:0] S;
    output Carry1;
    wire [3:0] C1;
    wire initCarry;
    assign initCarry=0;
    eightbitAdder e1(S[7:0],C1[0],in1[7:0],in2[7:0],initCarry);
    eightbitAdder e2(S[15:8],C1[1],in1[15:8],in2[15:8],C1[0]);
    eightbitAdder e3(S[23:16],C1[2],in1[23:16],in2[23:16],C1[1]);
    eightbitAdder e4(S[31:24],C1[3],in1[31:24],in2[31:24],C1[2]);
    assign Carry1=C1[3];
endmodule

module testbench32bitAdder;
   reg [31:0] in1,in2;
   reg z;
   wire [31:0] S;
   wire C;
   t32bitadder Al(S,C,in1,in2);

   initial
      $monitor(,$time,"in1=%b,in2=%b,S=%b,C=%b",in1,in2,S,C);

   initial
      begin
         #0 in1=32'b00000001000000010000000110000001;in2=32'b00000001000000010000000110000001;
         #4 in1=32'b11000001100000011000000100000001;in2=32'b11000001100000010000000100000001;
         #4 in1=32'b00000001000000010000000100000001;in2=32'b10000001000000010000000100000001;


      end

这是我得到的结果-

#                     0in1=00000001000000010000000110000001,in2=00000001000000010000000110000001,S=0000001000000010000000xx00000010,C=0
#                     4in1=11000001100000011000000100000001,in2=11000001100000010000000100000001,S=100000xx000000101000001000000010,C=1
#                     8in1=00000001000000010000000100000001,in2=10000001000000010000000100000001,S=10000010000000100000001000000010,C=0

注意第二个输出中的 dont-care。这是因为 C1[2] 变成了 X 。谁能指出我的错误?

vipin 是正确的,eightbitAdder 模块中的 assign z=0; 行导致不关心。在你的测试中,第一个8位加法器的进位是1,它试图将下一个8位加法器的z输入设置为1,但这与[=12=的连续赋值冲突] 到 0,从而导致 z = 1'bx。这种不关心通过第一个 FA 传播并影响第二个 FA,这导致结果的第 8 位和第 9 位出现 2 个不关心(第 1 位是第 0 位)。在第二次测试中,第三个和最后一个 8 位加法器之间发生了同样的事情。您的第三个测试不会在 8 位加法器之间传播进位,因此不会生成无关紧要的内容。