在以下情况下应该输出什么?

时间:2018-07-30 08:01:58

标签: verilog system-verilog iverilog

在以下情况下的o / p应该是多少?我已经在不同的编译器上运行它,每个编译器都有不同的结果。

module top;
    reg a,b;
    function int  f(string s);
        $display("%s", s);
        return 1;
    endfunction

    initial begin
        $display(" Experiment 1 ");
        if (  f("hello") & (1==0))  begin
            $display(" 1 : if 1 is true");
        end

        $display(" Experiment 2 ");
        if ( (1==0) & f("hello"))  begin
            $display(" 2 : if 2 is true");
        end
        $display(" Experiment 3 ");
        if (  f("hello") && (1==0))  begin
            $display(" 3 : if 3 is true");
        end
        $display(" Experiment 4 ");
        if ( (1==0) && f("hello"))  begin
            $display(" 4 : if 4 is true");
        end
    end
endmodule

1 个答案:

答案 0 :(得分:1)

来自lrm 11.4.7逻辑运算符

  

&&和||操作员应按以下方式使用短路评估:

     
      
  • 第一个操作数表达式应始终被求值。
  •   
  • 对于&&,如果第一个操作数的值在逻辑上为假,则不应计算第二个操作数。
  •   
  • 对于||,如果第一个操作数在逻辑上为true,则不应计算第二个操作数。
  •   

因此,hello不应 打印为'4'。但是应该打印为'3'。

情况1和2可能易于优化。我在标准中找不到任何东西可以阻止功能在那里进行优化。因此,我认为,抗性和Reviera的行为均正确。

看起来好像synopsys违反了标准。我的猜测是他们对案例“ 3”进行了过度优化。