5

如果我有这样的 if 语句:

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

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

这在 HDL 内部是否重要?

4

2 回答 2

6

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

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

于 2010-07-11T21:27:15.017 回答
3

至于它在 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 中依赖它时要小心。

于 2010-10-03T14:41:14.483 回答