时钟域交叉期间要避免的 10 个设计问题
扫描二维码
随时随地手机看文章
现代 ASIC 由数百万个门和数十亿个晶体管组成,它们通常可以在具有不同电压和时钟频率的多个域中运行。为了避免数据丢失,设计人员需要确保从一个域发送到另一域的信号不会导致目标域中寄存器的建立时间或保持时间违规。以下是跨时钟域时需要确保或避免的 10 件事。
目标域中的寄存器(通常是触发器)的建立或保持时间违规可能会导致触发器进入称为亚稳态的状态。您可以阅读 了解时钟域交叉问题来了解有关交叉时钟域问题以及它如何导致亚稳态的更多信息,但关键点是同步跨域信号在任何设计中都是绝对必须的。处理此任务的电路(称为同步器)可能会根据特定的域条件采用几种不同的同步方案之一。您可以在多时钟域 SoC 和 FPGA 的同步器技术一文中找到有关这些方案的更多详细信息。
然而,即使使用这些技术,您也需要做一些事情,而不要做一些事情,以避免同步设计问题。
使用多级同步
仅使用单个触发器来同步跨时钟域的信号会因传递亚稳态而面临很高的失败风险,特别是在域时钟频率差异很大的情况下。最好使二触发器同步器,甚至三触发器同步器。使用两个或三个触发器设计可以为跨域的信号在进入亚稳态后提供更多的时间来稳定。
避免合并早期同步阶段的信号
由于多级同步器中的第一个触发器可以进入亚稳态,因此切勿将第一个触发器的输出用作任何单元的逻辑输入。这样做可能会导致设计中亚稳态的传播。
同步前注册组合信号
如果跨越时钟域的信号直接来自组合逻辑,则其中可能存在故障。这些毛刺会减少双触发器同步器的平均故障前时间 (MTBF)。将穿过域的信号注册到源时钟可以消除毛刺。为了帮助保持同步器的 MTBF,请始终在跨域之前注册组合信号。
考虑亚稳态延迟
当使用多位同步器跨越多个位时,请始终考虑亚稳态延迟。当触发器时钟直到下一个时钟周期才完全同步时,任何经历亚稳态的位。由于这种延迟,无法保证数据同步的一致性或顺序。不使用双触发器同步器,而是使用另一种形式,例如数据多路复用器、异步FIFO等。然而,如果总线采用格雷码编码,那么我们可以使用多位同步器,因为一次只有一位发生变化。只需确保在跨域之前注册总线,因为格雷编码是完全组合逻辑。
确保足够的时钟速率
信号发送域的时钟周期至少应为接收域时钟周期的一倍半。发送时钟周期太短可能会导致信号不总是被采样。如果不能满足这个条件,那么最好使用请求-确认类型的机制来控制跨域信号的切换。
永远不要假设同步
当使用域中其他设计者的块的网络或总线时,不要假设该网络已为您同步。如有必要,请务必检查并使用同步器。
同步反馈信号
使用同步器中第一个触发器的输出来复位传输时钟域中的触发器时要小心。这可能会导致同步器外部的时序违规或者可能会导致亚稳态。当这种复位信号跨域时,最好也使用同步器。这将确保发送域中的触发器不违反任何时序规则。
避免同步阶段之间的逻辑
避免在同步器的触发器之间放置任何组合逻辑,因为这可能会降低同步器的 MTBF。组合逻辑的输出可能会出现故障并导致时序问题,最终导致亚稳态。
同步软件驱动信号
软件驱动的信号不应在没有同步的情况下用于接收域的逻辑。否则将导致时序违规并导致亚稳态。
同步后不要合并信号
接收域中不同同步器的输出无法组合并在其他地方使用,因为无法保证它们的同步顺序,因此有可能采样到错误的数据。如果必须组合两个信号以便在接收域中使用,那么最好在发送域中组合它们或使用其他一些方法来克服一致性问题。
在跨不同时钟域同步信号时遵循这些准则将大大有助于确保多域 SoC 和 FPGA 设计中不会出现亚稳态问题。