首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >总是使用一个非阻塞赋值的@* block -好的,坏的还是不相关的?

总是使用一个非阻塞赋值的@* block -好的,坏的还是不相关的?
EN

Stack Overflow用户
提问于 2012-06-21 20:37:20
回答 4查看 7.4K关注 0票数 9

到目前为止,我读过的所有书中提到的一般经验法则是,你必须在由时钟上升或下降沿驱动的块中使用非阻塞赋值。相反,组合逻辑描述必须使用分块赋值。这条规则对我来说很有意义,示例的作者完全遵循它。

但是,我在其中一个生产代码中发现了以下Verilog片段:

代码语言:javascript
复制
always @* begin
   in_ready <= out_ready || ~out_valid;
end

请注意,正在使用非阻塞赋值<=。我不认为在这种情况下有什么不同,因为没有多个赋值。然而,我似乎找不到任何对此的解释。所以问题是-无论是在给定的always块的范围内还是作为更大的设计的一部分,它是否有任何不同?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-06-21 23:31:15

无关紧要,但实践很糟糕。

我怀疑单一的赋值是否会造成任何副作用。always块将触发右侧的任何更改,更新in_ready。没有什么需要阻塞的,所以非阻塞不会引起问题。

如果一个更大的设计有:

代码语言:javascript
复制
always @* begin 
  in_ready    <= out_ready || ~out_valid  ;
  other_ready <= in_ready  || other_ready ;
end

我不太确定,因为它是组合的,它可能只需要一个额外的增量步骤来解决。

票数 5
EN

Stack Overflow用户

发布于 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块的多次迭代,以及相应的模拟惩罚。

在您的简单单行示例中,没有内部模拟惩罚,但在其他地方可能存在交叉赋值惩罚。

优秀的程序员使用始终如一的良好编码习惯。我会修改代码。如果更改代码破坏了模拟结果,那么在代码中的其他地方还隐藏着其他糟糕的编码习惯。代码不应该那么脆弱。

票数 8
EN

Stack Overflow用户

发布于 2014-09-30 19:36:59

这不坏,这是你的选择,如果你了解电路的运行方式,它会非常好,例如

always @* begin b<=a+c;a=b;end

所以在这个示例代码中,在块内部开发的完整电路将被激活,当灵敏度列表中的任何东西,即所有输入都将上升或下降时,它将改变其当前状态

  1. now b <=a+c现在这里将创建一个全加器,输入为'a‘和'c’,但
  2. 现在设计已经完成,或者编译器合成电路的方式使得下一条语句a=b从旧值中取出,而不是从更新后的b中取出,并被提供给a;所以简单的
  3. ,如果你想要同样的事情发生,欢迎你去做,没有问题会在可合成的

中出现

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11138318

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档