verilog总是@(*)非阻塞赋值

时间:2014-03-22 23:27:48

标签: verilog nonblocking

我读过的所有地方都说过,不要在@(*)块中使用< =运算符,但是我的教授在我们的一个作业中做了他的解决方案,他也在这个行业工作。如果可以这样做,他们的理由是什么?

3 个答案:

答案 0 :(得分:1)

简短的回答是,只要您了解调度的含义,您就可以在任何情况下始终使用阻止或非阻止分配。如果你理解了调度模型,你可以在组合过程中使用NBAs(即<=,在这个上下文中不是'运算符'),这是你的教授所做的。请注意,在组合代码中使用NBAs可能会降低模拟速度。

问题在于,实际上没有人真正理解“对调度的影响”,因此大多数人都使用指南。您应该阅读使用NBAs的指南在this paper中。问你是否理解它。总结起来太复杂了,但是文章建议在组合代码中使用NBAs。

这些只是指导方针,很多(知识渊博)的人​​不喜欢它们。请记住,指南仅存在,因为语言设计和定义不当。还要记住,编写指南的人往往不会理解这一点,并且认为他们的指导方针有充分的理由。

答案 1 :(得分:0)

在LRM中,它说

  

“隐式event_expression,@ *是一种方便的简写   通过添加所有网络和变量来消除这些问题   阅读声明。“

在Verilog中,当您使用<=非阻塞分配并想要参考触发器或锁存器时,您的always@(...)敏感列表必须包含边沿触发的时钟和复位信号。

为了使语法更清晰明确,您应该将always_ffalways_latch与时钟和重置信号一起使用,而不仅仅是always @*

答案 2 :(得分:0)

通常使用=表示组合逻辑,&lt; =表示顺序逻辑。但是,有一些例外。一个例子是时钟建模,如Verilog Blocking Assignment中所述。但是,特别针对你的问题,我相信101个陷阱中的Gotcha 30(组合逻辑中的非阻塞任务)可以解释它(http://books.google.com/books?id=_VGghBpoK6cC&printsec=frontcover&dq=Verilog+and+SystemVerilog+Gotchas&hl=en&sa=X&ei=F9cvU_WhJYzdoASLoYHwBw&ved=0CCwQ6AEwAA#v=onepage&q=Verilog%20and%20SystemVerilog%20Gotchas&f=false