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

时间:2015-11-11 12:46:21

标签: verilog

我正在尝试使用verilog添加两个32位数字。但是我在调​​整中得到了许多不关心。 32位加法器使用4个8位加法器。一个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

注意第二个输出中的非关心。这是因为C1 [2]变为X。谁能指出我的错误?

1 个答案:

答案 0 :(得分:1)

vipin是正确的,assign z=0;模块中的eightbitAdder行导致无关紧要。在您的测试中,第一个8位加法器的执行为1,它尝试将z输入设置为下一个8位加法器为1,但这与{{1}的连续赋值冲突}到0,从而产生z。这种不小心通过第一个FA传播并且也影响第二个FA,这导致结果的第8和第9位不关心(其中第一个位是第0位)。在第二次测试中,您的第三个和最后一个8位加法器之间也会发生同样的事情。你的第三个测试不会在8位加法器之间传播一个进位,因此不会产生任何关注。