手把手课堂:Xilinx FPGA设计时序约束指南
扫描二维码
随时随地手机看文章
作为赛灵思用户论坛的定期访客,我注意到新用户往往对时序收敛以及如何使用时序约束来达到时序收敛感到困惑。为帮助 FPGA设计新手实现时序收敛,让我们来深入了解时序约束以及如何利用时序约束实现FPGA 设计的最优结果。
何为时序约束?
为保证设计的成功,设计人员必须确保设计能在特定时限内完成指定任务。要实现这个目的,我们可将时序约束应用于连线中——从某 FPGA 元件到 FPGA 内部或 FPGA 所在 PCB 上后续元件输入的一条或多条路径。
在 FPGA 设计中主要有四种类型的时序约束:PERIOD、OFFSET IN、OFFSET OUT 以及 FROM: TO(多周期)约束。
PERIOD 约束与建组
每个同步设计要有至少一个PERIOD 约束(时钟周期规格),这是最基本的约束类型,指定了时钟周期及其占空比。若设计中有不止一个时钟,则每个时钟都有自己的 PERIOD 约束。PERIOD约束决定了我们如何进行布线,来满足设计正常工作的时序要求。
为简化时序约束应用过程,常常可将具有类似属性的连线分组为一组总线或一组控制线。这样做有助于完成正确为设计约束定义优先级这一关键步骤。
设计约束优先次序排列
若设计有多重约束,则需进行优先次序排列。一般来说,约束的一般性越强,其优先级越低。相反,约束的针对性越强,其优先级越高。举例来说,时钟网络上的某个一般性 PERIOD 约束将被特定网络的具有更高优先级的 FROM: TO 约束所覆盖。
特定 FROM: TO(或 FROM: THRU:TO)约束在时钟域内任意网络中的重要性均高于一般性约束。
为便于进行约束的优先级排列,可运行赛灵思时序分析器(ISE® Design Suite中的静态时序分析工具),并生成时序规格迭代报告,即常说的 .tsi 报告。该报告说明了各约束间是如何迭代的,以及该工具如何为各约束设置默认优先级。
采用 PRIORITY 约束关键词可手动设置任一时序约束的优先级并使其优先于默认的或预先设定的优先级。这对同一路径上的两个或多个时序约束发生冲突时尤为有用。这里的优先级指的是同一路径上有两个或多个时序约束时,该应用哪一个。其余的低优先级约束则被忽略。优先级可在 -10 ~ +10 的范围内设置。
PRIORITY 值越低,优先级越高。注意该值不会影响到哪些路径应率先布局和走线,只有当优先级相同的两个约束出现在同一路径上时,它才会影响由哪个约束控制该路径。
下面将以 PERIOD 只控制从同步元件到同步元件之间的网络,如 FFS 到FFS 为例来进一步介绍(约束以蓝色显示如下):
创建名为 tnm_clk20 的 TIMEGRP(时序分组),包含网络 clk20 驱动的所有下游同步组件。这些同步元件间的所有路径均受时序规格“TS_clk20: 20ns”(同步元件到同步元件 20 纳秒的时间要求)的约束。“HIGH 50%”指 clk20 的占空比为50/50。
在第二个例子中,我们使用 FROM:TO 约束来定义对两个分组间路径的要求,即:
该命令的作用是告知工具,确保数据从时序分组“my_from_grp”包含的元件到“my_to_grp”的元件所用时间为 40纳秒。时序分析器仍将计算从源分组到目标分组的时钟偏移,不过若时钟关联,则优先级较低。也可使用如下预定义分组:
若不选定时间单位(纳秒、皮秒等),则工具将自动默认为纳秒。例如,可这样写约束:
也可只写From 或 只写To ,以使其更具一般性:
如前所述,工具将自动默认上文所述所有 FROM: TO 约束的优先级高于PERIOD 约束,除非另有规定。
详细查看 .tsi 报告
除帮助查看时序约束迭代外,.tsi 报告还就如何改进通用约束文件 (UCF) 中的约束提供方法建议。该报告还会告知是否有路径受多重时钟域的约束。下面是约束迭代报告的例子:
在本例中,高优先级的 FROM: TO约束(仅一个)将优先于 PERIOD 约束应用。
建立和保持
在实际的同步数字系统中,数据必须先于进行采样的时钟脉冲边沿到达。达到这一目标所需的最短时间称为“建立时间”。除了先于时钟脉冲边沿到达外,数据必须在时钟脉冲边沿保持一定时间,这一时间称为“保持时间”。保持时间可
以为负,此时数据在时钟脉冲边沿到达前便已结束;可以为零,此时数据保持到时钟脉冲边沿采样;也可为正,此时数据保持到时钟脉冲边沿采样完毕后一段时间。
根据设计,在 FPGA 架构中,对所有速度等级,保持时间均不为正(或零或负)。这样可简化布局和布线,因数据只
需先于时钟脉冲边沿到达,并可在时钟脉冲边沿采样发生后即刻发生变化。数据超出最小建立时间的值称为时序裕量。时序裕量应总是为正。若报告上出现时序裕量负值,则说明建立时序尚未得到充分满足,数据到达太迟。
时钟路径本身也有延迟或偏移。因此,要分析时序,工具需计算出数据和时钟到达所分析触发器的时间。
约束违例的简便补救办法
重申一下:PERIOD 约束定义的是触发器等同步元件的时钟周期。可使用时序分析器来验证同步元件之间的所有路径是否满足设计的建立和保持时序要求。PERIOD 约束违例将以负的时序裕量显示在在时序报告,并说明到底是建立时间还是保持时间要求出现违例。所以若报告显示发生了建立时间违例时该作何处理?应找出两个所分析的同步元件间一条较快路径,或至少是某种方法来确保数据在合适时间内到达并保持足够长的时间,以便时钟脉冲边沿能够正确采样。若布局布线软件无法找到更快的路径,则可从 FPGA Editor 工具中手动进行布线。
不过这是最后的手段。在弄清楚不用它如何解决问题之前,请尽量不要使用这种方法。只使用 FPGA Editor 查看底层结构“知其所以然”,了解工具对设计的所做的处理,以达到让设计恰当的使用FPGA 资源来实现的目的。首先试试重构电路来满足设计的时序要求。一个比较简单的方法就是在路径上及早布置一个触发器。该技术即为流水线,它会增加信号的延迟,不过也可使信号值得到正确地采样。
若出现保持时间违例(数据在时钟脉冲边沿到来之前便已结束),则往往说明存在设计问题(架构不良)。数值只能
在时钟脉冲边沿发生变化,而不是之前。
若外部信号值在时钟脉冲边沿之前发生变化,则需使用 DCM 或 PLL 延迟时钟脉冲边沿,这样数据才能由新的延迟时钟正确采样。
有一种替代方法,就是在输入/ 输出模块中使用 IDELAY 元件,将数据移到时钟有效的位置上。
数据有效窗口与亚稳态时钟脉冲边沿之前的时间(建立)加上时钟脉冲边沿之后的时间(保持)即为“数据有效窗口”,也就是数据保持稳定,以进行正常采样的时间。若数据在此期间没有保持有效,则结果存在不确定性,或不可知。
不过,数据的有效时间未达到规定的长度,并不意味着触发器输出为亚稳态。亚稳态不同于不确定。若不能满足时序要求,则输出可能为随机的 1 或 0。亚稳态是指时钟脉冲边沿“几乎”能进行状态采集,而触发器输出则在时钟脉冲边沿之后的一段时间内处于某种中间状态(非 1 非 0)。亚稳态无法避免,因其为时钟脉冲边沿和数据几乎完全“错过”时的电路物理状态。
在设计合理的同步系统中,亚稳态不是什么问题。当出现异步情况(如敲击键盘上的一个键)或当两个同步时钟彼此异步时,亚稳态就会成为问题。一般而言,若出现异步情况,则需进行同步处理。
关于如何处理亚稳态的情况,这里有篇不错的专题文章: http://www.stanford.edu/class/ee183/handouts_
spr2003/synchronization_pres.pdf 。(要深入了解亚稳态,请查看本期第二篇文章 FPGA101)
传输时间与 OFFSET 约束
信号从 A 点到达 B 点所用的时间称为传输时间。它取决于传输介质中光传播的速度。例如,PCB 电路板上的走线以 6~7 皮秒/ 毫米来传输信号。可采用多种方法来确定这一时间值,例如进行仿真,或在材料介电常数与走线几何结构已知的情况下,列方程求解。在芯片内,信号的行为方式也很类似,不过也会因通过缓存器、反相器、逻辑和互联等有
源电路而发生延迟。
传输时间是可测量的,通常用示波器来测量。当路径上无有源元件时,传输时间一般不会有太大变化。若路径在芯片内,则晶体管的作用会使路径延迟在最大值与最小值之间变化。设计需同时满足二者的时序要求。
为告诉工具数据何时到达特定位置,需使用另一种名为“OFFSET_IN”的约束。“OFFSET_IN”约束在时钟和数据进入器件时,对其关系进行了定义。以如下约束为例:
该约束告知工具,数据将在 clk20 脉冲上升沿之前 2 纳秒建立在 PAD 上,并在到达后 16 纳秒内保持有效。该约束只对那些进入由 clk20 或其衍生(衍生约束)提供时钟的寄存器的 PAD 有效。
OFFSET 要求在 clk20 上有一个PERIOD 约束,这样才能理解时钟结构。如下这样也可接受:
不过,该约束不会检查保持时间,因不清楚数据何时会从 FPGA 的引脚结束。若数据在时钟脉冲边沿 2 纳秒之后才建立,则使用如下方案:
OFFSET_IN 适用于进入器件的时钟与数据之间的关系,另一种常见的OFFSET_OUT 约束定义时钟在 FPGA 输入处发生跳变后数据离开器件所需的时间。以下为常见的 OFFSET_OUT 用法:
该约束告知工具,需确保输入时钟在 FPGA 输入跳变后 3 纳秒时长后,数据出现在 FPGA 的输出引脚上。该约束仅应用于由 clk20 或其衍生(衍生约束)提供时钟的寄存器驱动的 PAD。OFFSET 要求在 clk20 上有 PERIOD 约束,这样才能理解时钟结构。保持时间不受 OFFSET_OUT 的约束。
若需要数据在时钟脉冲边沿前 2 纳秒到达FPGA 输出,则使用:
分组与分组名称
时间分组是用来识别对于同步元件间的路径集或连线集的约束的一种方式。向时序分组添加组件,应使用 TNM、TNM_NET 或 TIMEGRP。
通过定义分组并给定分组之间的时序要求,可对路径进行约束。部分约束不需要时序分组,如 NET MAXDELAY。这一最大延迟 (MAXDELAY) 属性定义了一条连线上允许的最大延迟。
时序名称
向用户定义的分组添加组件,可这样处理:
在此,“TNM”为保留字,用于定义时序分组的名称。
在这种情况下,object_name 为带分组元件或信号的名称,predefined_group 为可选关键词,标示符可以是字母、数字和下划线的任意组合。不能使用诸如 FFS、LATCHES 或RAMS 这样的保留字。该变量对大小写敏感。(TNM=abc 不等于 TNM=ABC)。
可将 TNM 应用于任何连线、元件引脚、原语或宏。组件可加入一个以上的分组。例如,my_ffs_group TNM 中可含有 my_ff组件。同样,my_ffs_group2 TNM 也可包含 my_ff 组件。要创建分组,请使用:
为时序目的,可在分组中包含任何关键词元件。在本例中,NET CLOCK可追溯到触发器 (FFS)。这些触发器使用名称 clk_group 进行时序命名 (TNM)。然后,clk_group 就可以在TIMESPECS中使用了。也可使用实例创建分组,如:
在 macro1 宏中的所有 LATCHES都放在名为 latchgroup 的分组中。类似的,在约束“INST mymac TNM=RAMS memories”中,所有 mymac 宏中的RAMS 都将放在称为 memories 的分组中。且在以下约束中:
所有在 t e s t e r 宏中的 PADS、LATCHES、RAMS 及 FFS 都将放在名为 coverall 的分组中。相关的约束指南将包含完整的预定义分组列表。
简洁至上
一般而言,约束的数量越少越好。复杂的约束引发的问题往往比解决的要多。另外,部分路径或网络是非关键性的,可对这些网络不使用约束。TIG(时序忽略)约束用于清除对无需关注的路径,或从虚假路径上移除约束。以下为常见 TIG:
这条约束告知工具无需约束该路径。这条的作用很重要,它可使工具不必在不关注的路径上花费精力去满足时序要求。在时序约束时忽略此路径可缩短工具运行时间,提升所关注的路径上的时序质量。也可搭配“FROM: TO”约束来使用“TIG”,如下所示:
赛灵思有大量宝贵的关于时序约束的资源,其中最值得一读的,我已在以下参考文献中列出。若您有更深入的问题,请随时与我联系。我邀请您参加赛灵思社区论坛,该论坛可为 您的一些FPGA 设计中最棘手的问题提供充分的解答。
参考文献:
《约束指南》:UCF、PCF、HDL 约束语法, http://www.xilinx.com/support/documentation/sw_manuals/xilinx11/
cgd.pdf 。
《时序约束用户指南》:如何约束设计的概念信息, http://www.xilinx.com/support/documentation/sw_manuals/xilinx11/ug612.pdf 。