В чем разница между Verilog! и ~?

В итоге получилось, что ошибка, которая не давала мне покоя несколько дней, была частью кода, которая должна была быть оценена как False, а оценка - True. Мой начальный код был примерно таким:

if(~x && ~y) begin
    //do stuff
end

т.е. если x НЕ ОДИН, а y НЕ ОДИН, то делайте что-то. Пройдя через отладчик, я понял, что, хотя x равен 1, выражение в операторе if все равно приводит к TRUE, и последующий код выполняется.

Однако, когда я изменил заявление на:

if(x == 0 && y == 0) begin
//do stuff
end

а также попробовал:

if(!x && !y) begin
//do stuff
end 

код внутри оператора if не был оценен, что было ожидаемым поведением. Я понимаю, что ~ это побитовое отрицание и! логическое отрицание, но не должноt (~ x && ~ y) и (! x && у) оценивать одно и то же? Я'боюсь, кодовая база слишком велика, поэтому я могуВставьте его сюда, но это было единственное изменение, которое я сделал, чтобы код работал так, как я планировал. Благодарю.

В ответ на один из комментариев ниже я создал контрольный пример для проверки этого поведения:

`шкала времени 10 нс / 1 нс

модуль 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

И как ни странно,Первый случай исполнен напечатан, чтобы подтвердить оригинальное поведение, которое я наблюдал.

Ответы на вопрос(3)

Ваш ответ на вопрос