到目前为止,我读过的所有书中提到的一般经验法则是,你必须在由时钟上升或下降沿驱动的块中使用非阻塞赋值。相反,组合逻辑描述必须使用分块赋值。这条规则对我来说很有意义,示例的作者完全遵循它。
但是,我在其中一个生产代码中发现了以下Verilog片段:
always @* begin
in_ready <= out_ready || ~out_valid;
end请注意,正在使用非阻塞赋值<=。我不认为在这种情况下有什么不同,因为没有多个赋值。然而,我似乎找不到任何对此的解释。所以问题是-无论是在给定的always块的范围内还是作为更大的设计的一部分,它是否有任何不同?
发布于 2012-06-21 23:31:15
无关紧要,但实践很糟糕。
我怀疑单一的赋值是否会造成任何副作用。always块将触发右侧的任何更改,更新in_ready。没有什么需要阻塞的,所以非阻塞不会引起问题。
如果一个更大的设计有:
always @* begin
in_ready <= out_ready || ~out_valid ;
other_ready <= in_ready || other_ready ;
end我不太确定,因为它是组合的,它可能只需要一个额外的增量步骤来解决。
发布于 2012-06-28 05:58:18
当然,这违反了我的编码准则#3:http://www.sunburst-design.com/papers/CummingsSNUG2000SJ_NBA.pdf),但它可以工作。
避免使用非阻塞赋值来编码组合逻辑的原因是仿真性能。在Munkymorgy的示例中,在always块触发器之后,您将计算所有方程式的右侧( RHS ),返回always块的顶部,更新方程式的LHS,这将再次触发always块,这将再次强制模拟器计算方程式的RHS,转到always块的顶部,然后更新方程式的LHS。对于较大的块,这可能导致通过always块的多次迭代,以及相应的模拟惩罚。
在您的简单单行示例中,没有内部模拟惩罚,但在其他地方可能存在交叉赋值惩罚。
优秀的程序员使用始终如一的良好编码习惯。我会修改代码。如果更改代码破坏了模拟结果,那么在代码中的其他地方还隐藏着其他糟糕的编码习惯。代码不应该那么脆弱。
发布于 2014-09-30 19:36:59
这不坏,这是你的选择,如果你了解电路的运行方式,它会非常好,例如
always @* begin b<=a+c;a=b;end
所以在这个示例代码中,在块内部开发的完整电路将被激活,当灵敏度列表中的任何东西,即所有输入都将上升或下降时,它将改变其当前状态
中出现
https://stackoverflow.com/questions/11138318
复制相似问题