Verilog Uknowns
所以我写了这个简单的32位减法器模块..问题是c_out的输出总是变成“x”,因此整个输出都是“xxxxxxxx…”我做错了什么?注意:所有模块单独工作正常…就像补码和全加器一样…工作正常。您正在检查输出,同时更改输入信号。切换c_in的分配和延迟。我想你的意思是当系统启动时,c_in有一个值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]
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
。但理想情况下,不应使用该选项,并且您应该具有一些重置条件来启动系统。