【发布时间】:2010-10-03 22:41:14
【问题描述】:
如果我有这样的 if 语句:
if(risingEdge && cnt == 3'b111)
begin
...
end
如果risingEdge 不为真,它会检查cnt 吗?
这在 HDL 内部是否重要?
【问题讨论】:
标签: verilog
如果我有这样的 if 语句:
if(risingEdge && cnt == 3'b111)
begin
...
end
如果risingEdge 不为真,它会检查cnt 吗?
这在 HDL 内部是否重要?
【问题讨论】:
标签: verilog
对于模拟,是否评估短路表达式是未定义的。在上面的例子中没有区别,但是如果你在右手边有一个函数调用,那么你可能会遇到未定义副作用的问题。
请参阅 Stuart Sutherland 和 Don Mills 的“Verilog 和 SystemVerilog 陷阱:101 个常见编码错误以及如何避免它们”中的Gotcha #52。
【讨论】:
关于它在 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 中依赖它时要小心。
【讨论】: