01signal.com

选择 I/O 时序的策略

本页属于关于时序的系列文章之一。前面几页解释了时序计算背后的理论,展示了如何编写多条时序约束,并讨论了时序收敛(timing closure)的原则。本页开始讨论 I/O 时序约束(timing constraints)。

引言

到目前为止,整个关于时序约束的讨论都集中在 FPGA 内部的路径(path)上。现在是时候来谈谈那些控制 FPGA I/O 端口时序的约束了。

不过在讨论时序约束之前,必须先了解 FPGA 与外部器件之间有哪些不同的同步方式。如果对这个问题没有足够的认识,写出来的时序约束可能毫无价值。此外,负责 I/O 接口的逻辑也可能写得不够妥当。在极端情况下,PCB 上甚至会缺少必要的布线,导致无法实现有可靠保证的 I/O。

只有充分理解了与外部器件的同步方式,才能正确地选择合适的时序约束命令。这方面的具体操作将在下一页中介绍。

在本页中,我假设你已经了解IOB 寄存器

时钟的分配

只要路径位于 FPGA 内部,就不需要关心路径两侧之间的时钟偏斜(clock skew):时钟的分配由工具负责,时序计算也会把时钟偏斜考虑进去。

I/O 时序约束则不同:路径的一侧在 FPGA 外部,是一个外部器件。为了与数据信号同步,这个器件依赖它某个引脚上收到的时钟。那么,这个时钟又是与什么同步的呢?

通常有以下两种策略:

下面将详细讨论这两种策略。关于源同步时钟,当数据信号是输入还是输出时,情况会有很大的不同,因此这两种场景将分开讨论。

系统同步时钟

在 PCB 上让多个器件同步的最简单方法,是把所有器件接到同一个时钟上。这称为系统同步时钟(system synchronous clock),也叫公共时钟(common clock)。

System synchronous clocking

这种方法的优点是:所有器件的时序参数都相对于同一个时钟信号。因此,在进行时序计算时,路径两侧的时钟是同一个。对于一条在 PCB 两个器件之间传播的数据信号,其计算方式与 FPGA 内部路径类似:路径起点处有一个相对于第一个时钟边沿的时钟到输出延迟(clock-to-output);在路径终点,tsu 相对于第二个时钟边沿。系统同步方式意味着这两个时钟边沿来自同一个时钟。

所以,使用系统同步时钟比较简单,但这种方法只适合频率相对较低的场合。回想一下时序计算入门中的内容:最小时钟周期是几个时序参数之和,包括第一个触发器的时钟到输出延迟、传播延迟(propagation delay)和第二个触发器的 tsu。对于输出端口来说,时钟到输出延迟比较大,因为这是 PCB 上的导线把电平驱动到所需电压所需的时间。但事情还不止于此:还必须加上时钟偏斜以及其它与时钟有关的不确定性。把这些数值全部加在一起后,能够达到的最小时钟周期可能并不理想。

根据经验法则,系统同步时钟不适合数据速率高于 100 MHz 的 I/O。但这一点很大程度上取决于具体使用哪些器件。事实上,有些电子器件的时序要求,即使在远低于 100 MHz 的频率下,也极难用系统同步时钟来满足。这类器件正是为什么必须在制造 PCB 之前就规划好 I/O 时序的原因之一。

set_input_delay 和 set_output_delay(将在下一页中介绍)是与系统同步时钟配合使用的最合适的时序约束。

源同步时钟

在 PCB 上,两个器件之间的接口常常采用由其中一个器件提供的时钟。显然,这个时钟是由 FPGA 产生,还是由外部器件产生,会带来很大差别。

因此,共有四种相关场景:

异步输入

有些输入信号并不与任何时钟相关联。例如,按键、I2C、RS232 以及来自外部器件的各种状态信号,都不与时钟同步。这些信号通常比 FPGA 内部的时钟慢得多,所以常见的解决办法是用触发器对它们进行采样(最好是 IOB 寄存器),然后按常规逻辑设计技术继续处理。

这些输入与用于采样的时钟并不同步。因此,IOB 寄存器(或连接在端口上的触发器)扮演着亚稳态保护(metastability guard)的角色。所以,每个端口应使用第二个寄存器,就像无关时钟(unrelated clocks)之间的时钟域交叉那样。否则,即使输入信号很慢、设计目前看起来工作正常,也仍然存在不可预测的怪异行为的风险。

编写时序约束时,应保证行为是可重复的:即使触发器没有放在 IOB 内部,也应遵循与IOB 寄存器相同的注意事项。为了更加保险,还建议针对这些寄存器作为亚稳态保护的角色,添加一条专门的时序约束(这一点在另一页中说明)。

伪路径(false paths)

I/O 端口的伪路径在原理上与 FPGA 内部路径的伪路径相同:使用 set_false_path 命令,要求工具不对特定端口强制任何时序要求。

关于 FPGA 内部路径的伪路径,前面已经讨论过。基于同样的理由,为 I/O 端口设置伪路径,主要目的是保持无约束路径列表为空。这个列表应为空,这样当某个端口因失误而缺少时序约束时,更容易被发现。

只有当端口的时序完全没有意义时,才应使用伪路径。例如,LED 和拨码开关(DIP switch)就是这样的例子。

SDC 约束的示例:

set_false_path -to [get_ports led_0]
set_false_path -from [get_ports dip_switch_0]

小结

本页概述了 FPGA 与外部器件之间同步的几种策略。所选策略既会影响逻辑设计,也会影响时序约束。

有了这些认识,接下来就可以讨论如何编写I/O 时序约束了。

本页由机器从英文翻译而来。如有疑问,请参阅原文
Copyright © 2021-2026. All rights reserved. (dcc38493)