所以最终让我坚持了好几天的错误是一段应该评估为 False 评估为 True 的代码。我的初始代码类似于:
if(~x && ~y) begin
//do stuff
end
即如果 x 不是 ONE 并且 y 不是 ONE 则做一些事情。单步调试调试器,我意识到即使 x 为 1,if 语句中的表达式仍然为 TRUE,并且执行了后续代码。
但是,当我将声明更改为:
if(x == 0 && y == 0) begin
//do stuff
end
并尝试过:
if(!x && !y) begin
//do stuff
end
未评估 if 语句中的代码,这是预期的行为。我知道 ~ 是按位否定和 ! 逻辑否定,但 (~x && ~y) 和 (!x && !y) 不应该评估为同一件事吗?恐怕代码库太大,所以我不能在这里粘贴,但这是我为使代码按预期工作所做的唯一更改。谢谢。
作为回应,针对以下评论之一,我创建了一个测试用例来测试这种行为:
`timescale 10ns/1ns
module test_negation();
integer x, y;
initial begin
x = 1; y = 0;
if(~x && ~y) begin
$display("%s", "First case executed");
end
if(!x && !y) begin
$display("%s", "Second case executed");
end
if(x == 0 && y == 0) begin
$display("%s", "Third case executed");
end
end endmodule
奇怪的是,打印了“第一个案例执行”以确认我观察到的原始行为。