Поведение Verilog оператора IF с недопустимым значением в условии

Если оператор IF в Verilog имеет недопустимое значение в условии, оценивается только ветвь else. (В симуляции.)

Например, ниже в модуле SimpleIfStatement2b, если a = 1'bx: b=0'b1

Я искал в стандарте Vegilog-2005 такое поведение и не нашел.

Является ли это поведение частью стандарта или только в реализации симулятора iverilog? Это также относится к VHDL/SystemVerilog/SystemC? Где стандарт описывает это?

module SimpleIfStatement2b(input a,
        output reg b
    );

    always @(a) begin: assig_process_reg_d
        if (a) begin
            b <= 1'b0;
        end else begin
            b <= 1'b1;
        end
    end
endmodule


module main;
    reg a;
    wire b;

  SimpleIfStatement2b DUT (
    .a(a),
    .b(b)
  );

  initial begin
    a = 1'bx;
    repeat(1) #10;
    a = 1'b0;
    repeat(1) #10;
    a = 1'b1;
    repeat(1) #10;
    a = 1'b0;
    repeat(1) #10;
    a = 1'bx;
    repeat(1) #10;
    a = 1'b1;
    repeat(1) #10;
    a = 1'bx;
    repeat(10) #10;

  end

  initial begin
    repeat(10) #10;
    $finish;
  end

  initial
    $monitor("At %t, a=%b, b=%b,", $time, a, b, ); 
endmodule

http://tpcg.io/nAY75e

стандартный вывод:

$iverilog -o main *.v
$vvp main
At                    0, a=x, b=x 
At                   10, a=0, b=1 
At                   20, a=1, b=0 
At                   30, a=0, b=1 
At                   40, a=x, b=1 
At                   50, a=1, b=0 
At                   60, a=x, b=1 

person Nic30g    schedule 25.02.2018    source источник
comment
в условных операторах «x» всегда преобразуется в «0» и является «ложным». Это стандартное поведение Verilog.   -  person Serge    schedule 25.02.2018
comment
Да, это дубликат, я не знал, что verilog добавляет сравнение с 1 и случайно выложил пример, где это сравнение явно добавлено.   -  person Nic30g    schedule 25.02.2018


Ответы (2)


Стандарт IEEE Раздел 9.4, Условное утверждение. Второй абзац:

введите здесь описание изображения

person Oldfart    schedule 25.02.2018

Это стандартное поведение.

Если условие «если» оценивается как False, то он продолжит выполнение раздела «Другое».

Подумайте об этом так:

Если я скажу вам:

«Если вам больше 100 лет, дайте пять! В противном случае совершите звездный прыжок».

Только если вам больше 100 лет, я дам вам пять. В противном случае (что похоже на раздел «Другое») я скажу вам совершить звездный прыжок. Вы не совершите звездный прыжок, если вам больше 100 лет, поскольку вы прошли условие «Если», но вы совершите звездный прыжок, если вам не больше 100 (т. е. условие «если» ложно).

person Adi219    schedule 25.02.2018
comment
Я случайно разместил неправильный пример, я спрашивал, где в стандарте написано, как оцениваются недопустимые условия. - person Nic30g; 25.02.2018