Verilog是否支持短路评估?

时间:2010-07-11 20:38:37

标签: verilog

如果我有if语句:

if(risingEdge && cnt == 3'b111)
begin
  ...
end

如果risingEdge不正确,它会检查cnt吗?

这在HDL内部是否重要?

2 个答案:

答案 0 :(得分:6)

对于模拟,未定义是否评估短路表达式。在上面的例子中它没有区别,但是如果你在右侧有一个函数调用,那么你可能会遇到未定义副作用的问题。

请参阅Stuart Sutherland和Don Mills的“Verilog和SystemVerilog陷阱:101常见编码错误以及如何避免它们”中的 Gotcha#52

答案 1 :(得分:2)

就HDL是否重要而言,我认为你在问合成时是否重要。简短的回答是,它会。例如,以下代码是可综合的SystemVerilog:

if(risingEdge && cnt++ == 3'b111)
begin
  ...
end

在Verilog(不是SV)中,后增量可以用verilog函数替换,该函数具有对模块变量的其他赋值以显示相同的内容。所以是的,这是一个相关的问题。

保罗R一般是正确的,萨瑟兰的参考是一个很好的参考(许多好东西,如那些陷阱中描述的那样)。但是作为参考,至少就规范而言,这已经随SystemVerilog而改变。虽然Verilog指定可能会或可能不会执行短路操作,但SV通过指示实现不应评估短路操作数(类似于C ++,Java等)来消除歧义。如果您有兴趣,请参阅IEEE-1800-2009第11.3.5节。虽然这很好,但是遵守SV规范的记录在所有工具提供商中都不是很好,所以在SV中依赖它时要小心。