【问题标题】:Does Verilog support short circuit evaluation?Verilog 是否支持短路评估?
【发布时间】:2010-10-03 22:41:14
【问题描述】:

如果我有这样的 if 语句:

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

如果risingEdge 不为真,它会检查cnt 吗?

这在 HDL 内部是否重要?

【问题讨论】:

    标签: verilog


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      关于它在 HDL 中是否重要,我想您是在问综合时它是否重要。简短的回答是它会。例如,下面的代码是可合成的 SystemVerilog :

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

      在 Verilog(不是 SV)中,后增量可以替换为对模块变量进行其他分配以显示相同内容的 verilog 函数。所以是的,这是一个相关的问题。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-09-23
        • 2013-10-18
        • 2017-02-03
        • 1970-01-01
        相关资源
        最近更新 更多