0

在以下情况下,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
4

1 回答 1

1

从 lrm 11.4.7 逻辑运算符

&& 和 || 运营商应使用以下短路评估:

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

据此,hello不应打印在'4'中应该打印在'3'中。

案例 1 和 2 可能易于优化。我在标准中找不到任何会阻止功能在那里优化的东西。所以,我相信,强烈的和里维埃拉的行为都是正确的。

看起来 synopsys 违反了标准。我的猜测是他们过度优化了案例'3'。

于 2018-07-30T20:46:05.390 回答