我读过的任何地方都说过,不要在always@(*)块中使用<=运算符,但我的教授在我们的一项作业中使用了他的解决方案,他也在该行业工作。如果可以做到这一点,他们的理由是什么?
发布于 2014-03-24 18:02:58
简而言之,只要理解调度的含义,在任何情况下,您都可以使用阻塞或非阻塞赋值。如果您了解调度模型,则可以使用NBAs (即<=,在这里不是“运算符”)在组合过程中,这是你的教授所做的。请注意,在组合代码中使用NBAs可能会潜在地降低模拟速度。
问题是,实际上没有人真正理解“对日程安排的影响”,所以大多数人使用指导方针。您应该阅读的使用NBAs的指南在this paper中。如果你不明白的话,可以问一问。这太复杂了,难以概括,但本文建议不要在组合代码中使用NBAs。
这些只是指导方针,许多(有知识的)人不喜欢它们。请记住,指南之所以存在,是因为语言的设计和定义都很糟糕。还要记住,编写指南的人往往不欣赏这一点,并喜欢认为他们的指南有很好的理由。
发布于 2014-03-23 21:50:21
在LRM中,它说
“隐式event_expression @*是一种方便的简写方式,它通过添加语句读取的所有网络和变量来消除这些问题。”
在Verilog中,当您使用<=非阻塞分配并希望引用触发器或锁存器时,您的always@(...)敏感列表必须包含边沿触发时钟和复位信号。
为了使语法更加明确和清晰,您应该对时钟和复位信号使用always_ff或always_latch,而不仅仅是always @*。
发布于 2014-03-24 14:57:50
通常=用于组合逻辑,<=用于顺序logic.however,但也有某些例外。时钟建模就是一个例子,如Verilog Blocking Assignment中所述。然而,对于你的问题,我相信101个gotchas中的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)
https://stackoverflow.com/questions/22585038
复制相似问题