What is the difference between Verilog ! and ~?

verilog boolean-logic modelsim

29822 просмотра

3 ответа

So it ended up that the bug that had kept me on for days, was a section of code that should have evaluated to False evaluating to True. My initial code went something like:

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

i.e. If x is NOT ONE and y is NOT ONE then do stuff. Stepping through the debugger, I realized even though x was 1 the expression in the if-statement still resulted into TRUE and the subsequent code was executed.

However, when I changed the statement to:

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

and also tried:

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

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


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

`шкала времени 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

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

Автор: SleepingSpider Источник Размещён: 12.11.2019 09:38

Ответы (3)


16 плюса

!Символ представляет логическое или логическое отрицание. Для любого значения, xотличного от нуля, !xоценивается как ноль или ложь, а когда xравен нулю, !xоценивается как единица или истина.

~Символ представляет побитовое отрицание. Каждый бит в значении переключается, так что в течение 16-бит x == 0xA5A5, ~xбудет равно 0x5A5A.

В if()условных ожидает выражение , которое истинным или ложным, где - нибудь от нуля (положительное или отрицательное) истинно, и ноль является ложным.

&&Является логическим И. Он принимает два выражения, оценивая их как одно или true, если и только если оба выражения имеют значение true. Опять же, «истина» здесь означает ненулевое, положительное или отрицательное.

Учитывая все это, мы можем видеть, что единственное время ~xи !xоценка одного и того же значения - это когда x == -1или, если xне подписано, когда x == MAX_UNSIGNED.

Автор: This isn't my real name Размещён: 07.05.2013 05:28

5 плюса

Понимаю. Переменная «x» в приведенном выше коде представляла собой целочисленное значение Verilog ( integer x;). Однако целочисленная переменная представляется Verilog в виде 32-разрядного целого числа. Таким образом, хотя x был «1», как я наблюдал, ~ x не приведет к «0», а к «11111111111111111111111111111110»! И поэтому неудивительно, что первый случай был выполнен. Моя вина. Спасибо за ответы на все вопросы.

Автор: SleepingSpider Размещён: 07.05.2013 06:02

2 плюса

~ является побитовым оператором и возвращает инвертирование аргумента.

! является логическим оператором и возвращает один бит.

Пример:

reg [7:0] bit_wise, logic_op;
initial begin
  bit_wise = ~8'hA1; // bit_wise == 8'h6E
  logic_op = !8'hA1; // logic_op == 8'b00
  $display("bit_wise:%h logic_op:%h", bit_wise, logic_op); // bit_wise:5e logic_op:00
end

Для вашего примера:

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

Эффективно так же, как:

if(x!='1 && y!='1) begin // '1 means the with of x all 1s and the with of y all 1s
    //do stuff
end

Как правило, лучший стиль кодирования - использовать логические операторы внутри операторов if. Используйте только побитовые операторы с манипуляциями с назначением данных.

Автор: Greg Размещён: 07.05.2013 05:50
Вопросы из категории :
32x32