Verilog Uknowns

Verilog Uknowns,verilog,system-verilog,Verilog,System Verilog,所以我写了这个简单的32位减法器模块..问题是c_out的输出总是变成“x”,因此整个输出都是“xxxxxxxx…”我做错了什么?注意:所有模块单独工作正常…就像补码和全加器一样…工作正常。您正在检查输出,同时更改输入信号。切换c_in的分配和延迟。我想你的意思是当系统启动时,c_in有一个值 module subtractor(out,x,y); output [31:0]out; input [31:0]x,y; wire c_out,c_dummy; wire [31:0]

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

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

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
调整输入和检查输出时要小心。无论何时更改信号值,都必须等待更改通过系统的其余部分传播,然后再检查输出

然而,由于c_in似乎只是作为常量在这个系统中使用,因此我建议您考虑使用localparam或某些常量值来代替c_in。例如:

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

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

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
调整输入和检查输出时要小心。无论何时更改信号值,都必须等待更改通过系统的其余部分传播,然后再检查输出

然而,由于c_in似乎只是作为常量在这个系统中使用,因此我建议您考虑使用localparam或某些常量值来代替c_in。例如:

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

如果已知
thirty2bit\u fa
正在工作,那么我的猜测是
$display
即将发布。在其前面添加一个
#1
,或将其更改为
$strobe
,并让我们知道这是否改变了什么。您如何知道单独的模块正在工作。这是一个奇怪的模型。没有时钟,也没有重置。所有值都由verilog初始化为“x”,因此您的模块不会对其进行更新。在任何情况下都是什么?在开始时,默认情况下所有值都是
x
。您可以使用
数据类型,在开始时将其设置为
0
。但理想情况下,不应使用该选项,并且您应该具有一些重置条件来启动系统。如果知道
thirtytwo\u bit\u fa
正在工作,那么我猜
$display
很快就会发布。在其前面添加一个
#1
,或将其更改为
$strobe
,并让我们知道这是否改变了什么。您如何知道单独的模块正在工作。这是一个奇怪的模型。没有时钟,也没有重置。所有值都由verilog初始化为“x”,因此您的模块不会对其进行更新。在任何情况下都是什么?在开始时,默认情况下所有值都是
x
。您可以使用
数据类型,在开始时将其设置为
0
。但理想情况下,不应使用该选项,并且您应该具有一些重置条件来启动系统。