我读过的所有地方都说过,不要在@(*)块中使用< =运算符,但是我的教授在我们的一个作业中做了他的解决方案,他也在这个行业工作。如果可以这样做,他们的理由是什么?
答案 0 :(得分:1)
简短的回答是,只要您了解调度的含义,您就可以在任何情况下始终使用阻止或非阻止分配。如果你理解了调度模型,你可以在组合过程中使用NBAs(即<=
,在这个上下文中不是'运算符'),这是你的教授所做的。请注意,在组合代码中使用NBAs可能会降低模拟速度。
问题在于,实际上没有人真正理解“对调度的影响”,因此大多数人都使用指南。您应该阅读使用NBAs的指南在this paper中。问你是否理解它。总结起来太复杂了,但是文章建议不在组合代码中使用NBAs。
这些只是指导方针,很多(知识渊博)的人不喜欢它们。请记住,指南仅存在,因为语言设计和定义不当。还要记住,编写指南的人往往不会理解这一点,并且认为他们的指导方针有充分的理由。
答案 1 :(得分:0)
在LRM中,它说
“隐式event_expression,@ *是一种方便的简写 通过添加所有网络和变量来消除这些问题 阅读声明。“
在Verilog中,当您使用<=
非阻塞分配并想要参考触发器或锁存器时,您的always@(...)
敏感列表必须包含边沿触发的时钟和复位信号。
为了使语法更清晰明确,您应该将always_ff
或always_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)