【问题标题】:My if and else statements in verilog are not giving expected results我在 verilog 中的 if 和 else 语句没有给出预期的结果
【发布时间】:2021-09-23 02:36:06
【问题描述】:

我正在尝试一个简单的代码来将输入与某个值(阈值)进行比较,并尝试使用 if 和 else 条件语句将变量分配给 0 或 1,具体取决于变量是否超过阈值。但是,在这种情况下,我总是为不同的输入获得相同的单个值。我是 verilog 的新手,正在尝试为不同的应用程序编写算法,这是我的第一步。提前致谢。

module makebig(a,z);
input signed [15:0]  a;
output reg z;
initial
begin
if (a<16'b0000000000000000) begin
 z<=1;
end
else  begin
 z<=0;
end

end
endmodule

现在是它的测试平台。

module makebig_tb();

reg  signed [15:0] a;

wire z;

makebig uut(.a(a),.z(z));
initial
begin
a=16'b0100000000000000;
#5 a=16'b000000000000101;
#5 a=-2;
end
initial
begin
$monitor("a=%b,z=%b",a,z);
end
end module

我不明白为什么它不起作用。这个的输出是这样的......

a=0100000000000000,z=0;
a=0000000000000101,z=0;
a=1111111111111110,z=0;

【问题讨论】:

  • 不是我的区域,但是....您确定if 中的常量已签名吗?尽管有input signed 声明,但可能以无符号数字评估比较......
  • 是的,在变量a的赋值中,我提到了'signed'。我什至尝试将 2^16 的一半作为阈值,但仍然不是预期的结果。
  • 您的if 语句仅在时间 0 执行一次。
  • @dave_59 我不明白。你能详细说明一下吗?

标签: if-statement verilog


【解决方案1】:

这里有两个错误,在cmets中已经指出了两个错误:

  1. 您只运行一次比较 (initial begin)。将其替换为 always @(*) begin 以在每次输入之一更改时运行它

  2. 与无符号常量的比较将导致整个比较无符号。将16'b0000000000000000 替换为$signed(16'b0000000000000000)

这会产生预期的输出

a=0100000000000000,z=0;
a=0000000000000101,z=0;
a=1111111111111110,z=1;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多