2017-09-04 77 views
0
module subtractor(out,x,y); 
    output [31:0]out; 
    input [31:0]x,y; 
    wire c_out,c_dummy; 
    wire [31:0]sum1,sum2,sum3,y_c; 
    reg c_in; 

    ones_complement oc0(y_c,y); 
    thirtytwo_bit_fa thirtytwo_fa0(c_out,sum1,c_in,x,y_c); 
    thirtytwo_bit_fa thirtytwo_fa1(c_dummy,sum2,c_in,sum1,c_out); 
    thirtytwo_bit_fa thirtytwo_fa2(c_dummy,sum3,c_in,sum2,{32{~c_out}}); 

    initial 
    begin 
     #1 c_in=0; 
     $display("%b",c_out); 
    end 

    assign out=c_out?sum1:-sum1; 
endmodule 

所以我写了这个简单的32位减法器模块..问题是,c_out的输出总是变成'x',因此整个输出是'xxxxxxxx ...'。我究竟做错了什么?注意:所有模块单独工作得很好......就像补码和全加器一样......工作正常。Verilog Uknowns

+1

如果知道'thirtytwo_bit_fa'正在工作,那么我的猜测是'$ display'即将发布。在它之前添加一个'#1'或将其改为'$ strobe',并告诉我们是否改变了任何内容。 – Greg

+1

你怎么知道单独的模块正在工作。这是一个奇怪的模型。没有时钟也没有重置。所有的值都由verilog初始化为'x',所以你的模块不会更新它。无论如何,这是什么? – Serge

+0

在开始时默认情况下,所有的值都是'x'。你可以使用'bit'数据类型,在开始时使它成为'0'。但理想情况下,不应该使用,并且您应该有一些重置条件来启动您的系统。 –

回答

1

您正在检查输出,同时更改输入信号。切换c_in的分配和延迟。我认为你的意思是c_in在系统启动时有一个值。

initial 
    begin 
    c_in=0; 
    #1; 
    $display("%b",c_out); 
    end 

调整输入和检查输出时要小心。无论何时改变信号的值,在检查输出之前,必须等待更改传播通过系统的其余部分。

但是,由于看起来c_in只是在这个系统中作为一个常量使用,所以我建议你考虑在c_in的地方使用localparam或者一些常数值。例如:

localparam c_in_zero = 1'b0; 

thirtytwo_bit_fa thirtytwo_fa0(c_out,sum1,c_in_zero,x,y_c);