【问题标题】:Do not mix blocking and non-blocking assignments in the same block?不要在同一个块中混合阻塞和非阻塞分配?
【发布时间】:2026-01-12 11:20:06
【问题描述】:

在 Verilog 中是真还是假? 我不明白混合是什么意思。如果它有效,它会直接改变输出吗?

【问题讨论】:

  • this SO 问题的可能重复项。
  • 它甚至无法合成,尽管它可以在模拟中工作。
  • 是的,我认为它可能仅与可合成性有关,与模拟无关

标签: verilog


【解决方案1】:

规则需要澄清。

不要在同一块中同时使用阻塞和非阻塞赋值来分配相同的变量。该问题通常在描述异步重置时表现出来。

always @(posedge clk or negedge rst)
  if (!reset)
    q = 0;
  else
    q < = d;

如果这两个事件同时发生,但q&lt;= dq=0 之前得到处理,那么在设置为 0 之后对 q 有一个挂起的更新,因此会丢失。还有许多其他情况。

【讨论】:

  • 你能说得清楚一点吗?当两个事件(我猜你在谈论 posedge clk 和 negedge rst)同时发生时,只有 q = 0 会被执行。 q
  • 是的,这是两个事件。 q&lt;=d 可能会被执行,因为 rst 仍然是 1,negedge rst 还没有发生。