Итак, это закончилось тем, что ошибка, которая удерживала меня в течение нескольких дней, была частью кода, который должен был быть оценен как False, оценивая True. Мой исходный код выглядел примерно так:
if(~x && ~y) begin //do stuff end
то есть. Если x НЕ ОДИН, а y НЕ ОДИН, тогда делайте что-нибудь. Пройдя через отладчик, я понял, что хотя x равно 1, выражение в if-statement все еще приводило к 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
модуль 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
И как ни странно, "первый случай выполнен" печатается, чтобы подтвердить первоначальное поведение, которое я наблюдал.