阻止和非阻止分配Verilog之间的区别


15

遇到以下情况时,我正在阅读此页面http://www.asic-world.com/verilog/verilog_one_day3.html

通常,我们必须重置触发器,因此,每当时钟从0过渡到1(摆位)时,我们都会检查是否声明了重置(同步重置),然后继续执行正常逻辑。如果仔细观察,我们会发现在组合逻辑的情况下,分配时使用“ =”,对于顺序块,则使用“ <=”运算符。好吧,“ =”是阻止分配,而“ <=”是非阻止分配。“ =”在开始/结尾内顺序执行代码,而非阻塞“ <=”并行执行。

我相当确定非阻塞分配是顺序的,而阻塞分配是并行的。毕竟,您可以使用always块之外的assign语句进行块分配,并且所有块并行运行。这是一个错误,还是Always块内部的行为不同?而且,如果在始终阻止块内的行为不同,是否可以在始终阻止块外进行非阻止分配?

Answers:


21

相当确定非阻塞分配是顺序的,而阻塞分配是并行的。

阻塞分配“连续” 执行,因为阻塞分配会阻塞下一条语句的执行,直到完成为止。因此,下一条语句的结果可能取决于第一个语句的完成情况。

非阻塞分配并行执行,因为它描述了所有分配都同时发生。第二行的语句结果将不依赖于第一行的语句结果。而是执行第二行,就像第一行尚未发生一样。


那assign语句呢?他们只是自己一堂课吗?
空星

4
是的,assign语句出现在Always块之外,通常用于描述组合(非闩锁)逻辑(而Always块(除某些例外,描述了顺序逻辑))。AFAIK,assign只要LHS的值发生更改,语句就始终“并行”执行。
Photon

好的,我开始感到Verilog并不是设计最优雅的语言。这就像学习C一样。
虚空之星

1
Verilog旨在“描述”已经存在的硬件。用它作为设计(综合)硬件的语言是一个hack。
Photon

4
如果Verilog“喜欢学习C”有问题,请看一下VHDL。有些人偏爱其中一种。对某些人来说,VHDL太冗长了。对我来说,最好考虑一下。(例如,信号/变量分配的语义比阻塞/非的要清晰得多)。stackoverflow.com/questions/13954193/…sigasi.com/content/vhdls-crown-jewel您可能会喜欢它或讨厌它。但这值得一看。
Brian Drummond 2013年

6

Assign语句既不是“阻塞”也不是“非阻塞”,它们是“连续”的。一个assign语句的输出始终等于其输入的指定函数。“阻塞”和“非阻塞”分配仅存在于始终块中。

阻塞分配在处理后立即生效。无阻塞分配发生在处理当前“时间增量”的末尾。

always块可用于对组合逻辑或顺序逻辑进行建模(systemverilog具有always_comb和always_ff可以使之明确)。在对组合逻辑进行建模时,通常使用=更为有效,但实际上并不重要。

在对顺序逻辑进行建模时(例如,总是@(posedge clk)),通常使用非阻塞分配。这使您可以根据“时钟沿之前的状态”来确定“时钟沿之后的状态”。

在顺序始终块中将块分配用作“变量”有时会很有用。如果执行此操作,则需要牢记两个关键规则。

  1. 请勿从分配了其的Always块之外访问在顺序Always块内使用阻止分配设置的reg。
  2. 请勿将阻止分配和非阻止分配分配给同一注册表。

违反这些规则可能会导致综合失败和/或模拟与综合之间的行为差​​异。


““不要从其分配的Always块之外访问在顺序Always块内设置有阻止分配的reg。””您能解释一下吗?
user125575 '16

不同的顺序总是块没有定义的顺序。因此,从一个总是块中读取一个带有阻塞分配的“ reg”集会与另一个“总是”块中的读取有关,会导致不可预测的行为。
彼得·格林

即使它看起来可以在模拟中工作,综合工具也应该对此进行观察并说“不”。我对这些中间变量使用本地寄存器,并确保在读取每个时钟之前始终将它们分配给它们,以免隐含“存储”。
greggo

至少在Quartus中,IIRC仅被视为警告而非错误。
格林

5

阻塞分配一词使人们感到困惑,因为阻塞一词似乎暗示了时间顺序逻辑。但是在综合逻辑中,这并不意味着这样做,因为所有事物都是并行运行的

也许一个不太混淆的术语是立即分配,它仍将组合逻辑的中间结果与输入到非透明存储元件(例如时钟寄存器)的输入区分开,后者可能会延迟分配

从法制的角度来看,这一切都非常顺利。实际上,即使在序列中,您也可以=将其视为阻塞(时间顺序)操作always_comb。但是,在这种情况下,时间顺序和并行之间的区别绝对没有区别,因为将always_comb块定义为重复执行,直到指令序列收敛到稳定状态为止-这正是硬件电路将执行的操作(如果满足时序)要求)。

一旦您知道必要的习惯用法,Verilog(尤其是SystemVerilog)的可合成子集就非常简单易用。您只需要巧妙地使用与语言中所谓的行为元素相关的术语即可。


行为编码样式中(与RTL相比),阻塞和非阻塞之间的区别可能是相关的。在某些情况下,综合工具可能能够从行为组件设计中推断出功能上等效的RTL。
nobar

当然,SystemVerilog 的过程模式(尤其适用initialprogram块内的语句)仅使用(时间顺序)块分配。这对于测试平台设计很有用,但通常对于RTL规范没有用。
nobar
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.