В чем разница между 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
И как ни странно,Первый случай исполнен напечатан, чтобы подтвердить оригинальное поведение, которое я наблюдал.