在以下情况下的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
答案 0 :(得分:1)
来自lrm 11.4.7逻辑运算符
&&和||操作员应按以下方式使用短路评估:
- 第一个操作数表达式应始终被求值。
- 对于&&,如果第一个操作数的值在逻辑上为假,则不应计算第二个操作数。
- 对于||,如果第一个操作数在逻辑上为true,则不应计算第二个操作数。
因此,hello
不应 打印为'4'。但是应该打印为'3'。
情况1和2可能易于优化。我在标准中找不到任何东西可以阻止功能在那里进行优化。因此,我认为,抗性和Reviera的行为均正确。
看起来好像synopsys违反了标准。我的猜测是他们对案例“ 3”进行了过度优化。