为什么 verilog 教程通常将复位设为异步?

Why do verilog tutorials commonly make reset asynchronous?

如果这有什么不同的话,这个问题是在 FPGA 综合的上下文中。数据sheet (iCE40UP) 指出每个逻辑单元都有一个带异步复位和时钟使能输入的 D 型触发器。

许多 verilog 教程介绍时序逻辑,例如:

always @(posedge clk)
  begin
    some_reg <= [...]
  end

我熟悉时钟逻辑,这对我来说很直观。

接下来介绍的概念通常是:

我在维基百科上阅读了 scary statements like "if the system has a dependence on any continuous inputs then these are likely to be vulnerable to metastable states. [...] If the inputs to an arbiter or flip-flop arrive almost simultaneously, the circuit most likely will traverse a point of metastability."

冒着我的问题因格式不正确而被关闭的风险......我错过了什么?

谢谢!

看似相关的问题: - -

同步与异步复位与 CPU 的大端与小端之争有一些相似之处。 在许多情况下,这两种类型都同样有效。 但在某些情况下,任何一种类型都比另一种类型具有优势。 在上电或断电等情况下,您可能没有有效的时钟,但您仍然需要重置才能使系统处于已知的被动状态,并避免危险的 I/O 故障。 只有异步复位可以做到这一点。

如果您的设计包含缺少复位功能的寄存器,例如 RAM 块,那么在向 RAM 提供 adr、数据和控制信号的寄存器上使用异步复位可能会在发生复位时导致 RAM 内容损坏。因此,如果您需要能够在必须保留 RAM 内容的地方执行热复位:对最接近 RAM 的逻辑使用同步热复位。

Altera 和 Xilinx 推荐他们的客户只使用同步复位,这加剧了混乱。 只使用同步复位可以在 Altera 和 Xilinx 上很好地工作,因为它们都是基于 SRAM 的 FPGA 架构,所以上电毛刺从来都不是问题。

但如果您想让您的设计可移植到其他架构,例如 ASIC 或闪存 FPGA,那么异步复位可能是更好的默认选择。

关于您关于异步复位引起的亚稳态的问题。那是对的。完全异步的复位信号会导致亚稳态。 这就是为什么您必须始终同步低电平有效异步复位信号的上升沿。 只有复位的下降沿可以完全异步。

仅同步上升沿由两个触发器完成。

锁存器:不,您几乎从不想在时钟设计中使用锁存器。 好的做法是让 DRC 在发现锁存器时触发错误。