Verilog是否支持短路评估?

Verilog是否支持短路评估?,verilog,Verilog,如果我有一个If语句,比如: if(risingEdge && cnt == 3'b111) begin ... end 如果risingEdge不正确,它会检查cnt吗 这在HDL内部是否重要?对于模拟,短路表达式是否被计算还没有定义。在上面的示例中,这没有什么区别,但是如果您在右侧有一个函数调用,那么您可能会遇到带有未定义的副作用的问题 参见Stuart Sutherland和Don Mills的“Verilog和SystemVerilog Gotchas:101常见编

如果我有一个If语句,比如:

if(risingEdge && cnt == 3'b111)
begin
  ...
end
如果risingEdge不正确,它会检查cnt吗


这在HDL内部是否重要?

对于模拟,短路表达式是否被计算还没有定义。在上面的示例中,这没有什么区别,但是如果您在右侧有一个函数调用,那么您可能会遇到带有未定义的副作用的问题


参见Stuart Sutherland和Don Mills的“Verilog和SystemVerilog Gotchas:101常见编码错误及其避免方法”中的Gotcha#52。关于它在HDL中是否重要,我想你是在问合成时是否重要。简单的回答是它会的。例如,以下代码是可合成的SystemVerilog:

if(risingEdge && cnt++ == 3'b111)
begin
  ...
end
在Verilog(不是SV)中,post increment可以替换为Verilog函数,该函数具有模块变量的其他赋值,以显示相同的内容。是的,这是一个相关的问题

保罗R通常是正确的,而萨瑟兰的参考文献是一个伟大的参考文献(许多好的东西,如哥特恰斯所描述的)。不过,作为参考,至少就规范而言,SystemVerilog改变了这一点。虽然Verilog指定了短路操作可能执行或可能不执行,但SV通过指示实现不应评估短路操作数(类似于C++、java等)来消除这种情况。如果您感兴趣,请参阅IEEE-1800-2009第11.3.5节。虽然这很好,但遵守SV规范的记录在所有工具供应商中都不是一流的,因此在SV中依赖它时要小心