当前位置:首页 >> >>

eetop[1].cn_FPGA设计环境中加时序约束

在给 FPGA 做逻辑综合和布局布线时, 需要在工具 工具中设定时序 时序的约束。 通常, 工具 时序 在 FPGA 设计 设计工具中都包含有 4 种路径:从输入端口到寄存器,从寄存器到寄存 器,从寄存器到输出 输出,从输入到输出的纯组合逻辑。 通常,需要对这几种路径 输出 分别进行约束,以便使设计工具能够得到最优化的结果。下面对这几种路径分别 进行讨论 从输入端口到寄存器: 从输入端口到寄存器: 这种路径的约束是为了让 FPGA 设计工具能够尽可能的优化从输入端口到 第一级寄存器之间的路径延迟, 使其能够保证系统时钟可靠的采到从外部芯片到 FPGA 的信号。约束名称:input delay. 约束条件的影响主要有 4 个因素:外 Tco 的

部芯片的 Tco,电路板上信号延迟 Tpd,FPGA 的 Tsu, 时钟延迟 Tclk。

参 数 通 常 需 要 查 外 部 芯 片 的 数 据 手 册 。 计 算 公 式 : input delay = Tco+Tpd+Tsu-Tclk. FPGA 的 Tsu 也需要查 FPGA 芯片的手册。 FPGA 速度等级不

同,这个参数也不同。 Tpd 和 Tclk 需要根据电路板实际的参数来计算。通常, 每 10cm 的线长可以按照 1ns 来计算. 例如:系统时钟 100MHz, 电路板上最

大延迟 2ns, 时钟最大延迟 1.7ns, Tco 3ns,FPGA 的 Tsu 为 0.2ns. 那么输入延 迟的值: max Input delay = 2+3+0.2-1.7=3.5ns. 这个参数的含义是指 让

FPGA 的设计工具把 FPGA 的输入端口到第一级寄存器之间的路径延迟(包括门延 迟和线延迟)控制在 10ns-3.5ns=6.5ns 以内。 寄存器到寄存器: 寄存器到寄存器: 这种路径的约束是为了让 FPGA 设计工具能够优化 FPGA 内寄存器到寄存器 之间的路径, 使其延迟时间必须小于时钟周期, 这样才能确保信号被可靠的传递。 由于这种路径只存在于 FPGA 内部,通常通过设定时钟频率的方式就可以对其进 行约束。对于更深入的优化方法,还可以采用对寄存器的输入和寄存器的输出加 入适当的约束,来使逻辑综合器和布线器能够对某条路径进行特别的优化。 还 可以通过设定最大扇出数来迫使工具对其进行逻辑复制,减少扇出数量,提高性 能。

寄存器到输出: 寄存器到输出: 这种路径的约束是为了让 FPGA 设计工具能够优化 FPGA 内部从最后一级寄存 器到输出端口的路径,确保其输出的信号能够被下一级芯片正确的采到。 约束 的名称: output delay,约束条件的影响主要有 3 个因素:外部芯片的 Tsu,电 路板上信号延迟 Tpd,时钟延迟 Tclk. 手册。 计算公式:output delay = Tsu+Tpd-Tclk. 例如:系统时钟 100MHz, 电路板上最大延迟 2ns, 时钟最大延迟 1.7ns, 这个参数的 Tsu 的参数通常需要查外部芯片的数据

Tsu 1ns, 输出延迟的值: max output delay = 1+2-1.7=1.3ns .

含义是指 让 FPGA 的设计工具把最后一级寄存器到输出端口之间的路径延迟 (包 括门延迟和线延迟)控制在 10ns-1.3ns=8.7ns 以内。

从输入端口到输出端口: 从输入端口到输出端口: 这种路径是指组合逻辑的延迟,指信号从输入到输出没有经过任何寄存器。 给这种路径加约束条件,需要虚拟一个时钟,然后通过约束来指定哪些路径是要 受该虚拟时钟的约束。 在 Synplifypro 和 Precision 中都有相应的约束来处理 这种路径。 前面的帖子里讲述了关于输入输出延迟的一些参数的含义和计算方法。 如果 要把这些参数和 altera,xilinx 的软件结合起来,也不是一件容易的事情。以 前 altera 和 xilinx 的约束条件设定非常烦杂,各自都有一套。似乎大家也不太 看重约束条件的设定,大多时候都是无论如何先上板,然后通过 signaltap 和 Chipscope 来调。当 FPGA 规模大了之后,布线一次都需要很长时间,这种方法 的弊端就越来越严重。 实际上可以借鉴 ASIC 的设计方法:加比较完善的约束条 件,然后通过 RTL 仿真,时序分析,后仿真来解决问题,尽量避免在 FPGA 电路 板上来调试。 altera 最先意识到这一点,它采用了 Synopsys 的 SDC 格式。SDC 的格式也得到了逻辑综合器的支持。而且设定方法比较容易掌握。 这个帖子会 详细讨论一下这种格式的约束设定方法。 时钟的设定方法: 时钟要分成两种,一种是从端口上直接输入的时钟,另 一种是在 FPGA 内部产生的时钟。内部产生的时钟又要分成两种,从锁相环出来

的(包括 altera 的 PLL 和 Xilinx 的 DLL)和从逻辑单元出来的,例如一般的计 数器分频就是这种情况。 从锁相环出来的时钟可以通过端口直接加,因为一般 的综合工具和布线工具都能够自动的把端口的时钟约束传递到锁相环, 并且根据 锁相环的倍频关系自动施加到下一级。 而从逻辑单元出来的就需要单独对其进 行约束。 在 SDC 格式中,创建时钟的命令 create_clock, 后面要带 3 个参数: name ,period, waveform. name 的含义是指创建这个时钟约束的名字,而不是

时钟本身的名字。 要把这个约束和时钟信号关联起来,还需要在后面加些东西。 period 的单位缺省是 ns. waveform 是用来指定占空比。 除了这三个参数以外, 常常还要加 get_ports 的命令,来指定时钟的输入端口。 下面的例子是一个较 为完整的设定时钟的例子:
create_clock -name clk1 -period 10.000 –waveform. { 2.000 8.000 } [get_ports sysclk]

这个例子表示, 有一个 clk1 的约束, 在这个约束中设定了时钟的周期为 10ns, 占空比为 2ns 低电平,8ns 高电平。 这个叫做 clk1 的约束是针对 sysclk 这个 端口的。 如果是利用内部锁相环分频出来很多其他时钟的约束, 可以不再另外施加其 他约束,逻辑综合器和布线器都能根据锁相环的参数自动计算。 如果是利用内 部的逻辑单元分频出来的信号,则必须利用 get_registers 指定分频的寄存器 名。 例如上例:
create_clock -name clk1 -period 10.000 –waveform. { 2.000 8.000 } [get_registers cnt_clk].

对于逻辑单元分频的时钟信号,也可以采用命令 create_generated_clock 会更加精确。举例如下:
create_generated_clk -name clk2 -source [getports sysclk] -div 4 [get_registers cnt_clk]

这个约束命令描述了 一个 clk2 的约束, 约束的对象是由 sysclk 分频 4 次得 到的时钟,这个时钟是由 cnt_clk 这个寄存器产生的。 在高速的系统中,对时钟的描述可能会要求的更多,更加细致。 例如,会 要求对时钟的抖动和时钟的延迟进行描述。 在 SDC 的文件格式中,可以通过两 个命令来描述:set_clock_uncertainty 和 set_clock_latency 来设定。 时钟的延迟相对来讲比较简单。 延迟一般分为外部延迟和内部时钟线网的延

迟。 通常在约束时只对外部延迟做约束,在 set_clock_latency 的命令后带 -source 的参数就可以了。 例如:set_clock_latency -source 2 [get_clocks {clk_in} ] 时钟的抖动要稍微复杂一些。因为这个值不但会影响到对 Tsu 的分析,也会 影响到对 Thold 的分析。 因此,采用 set_clock_uncertainty 的参数要多一些。 如果要理解这个命令对系统时序分析的影响,就需要对 altera 的延时计算的概 念需要做更多的说明。 对 于 set_clock_uncertainty 的 情 况 , 就 稍 微 复 杂 一 些 。 因为

set_clock_uncertainty 的值既影响建立时间的计算,也影响保持时间的计算, 因此,需要在设定时分别指明: set_clock_undertainty –setup 0.500 –from clkA –to clkA set_clock_uncertainty –hold 0.300 –from clkA –to clkA 前面的内容里面提供了计算输入输出延迟的计算方法。输出延迟的命令是 set_output_delay. 有几个参数要加:参考时钟,最大最小值,和端口的名称。 如下面的例子中描述。 set_output_delay -clock CLK -max 1.200 [get_ports OUT]

set_output_delay -clock CLK -min 0.800 [get_ports OUT] 输入延迟的命令很类似: set_input_delay -clock CLK -max 2.000 set_input_delay -clock CLK -min 1.600 [get_ports IN] [get_ports IN]

对一些特殊的设计要求,例如不关心的数据传递路径和多拍的路径,还需要 增加 false path 和 Multicycle 的设定。 这两个约束比较简单,容易设定,但是非常关键。 如果设定的不好,系统 性能会大打折扣。 false path 是指在时序分析中不考虑其延迟计算的路径。例如有些跨越时 钟域的电路等。 设定的方法: set_false_path -from [get_clocks clkA] -to [get_clocks clkB] set_false_path -from regA -to regB

第一条命令是设定了从时钟域 clkA 到时钟域 clkB 的所有路径都为 false path.

第二条命令设定了从 regA 到 regB 的路径为 false path. 序分析时都会被忽略。 multicycle 的设定和 false path 的设定方法差不多。

这两种路径在做时

为了让逻辑综合器和布局布线器能够根据时序的约束条件找到真正需要优 化的路径,我们还需要对时序报告进行分析,结合逻辑综合器的时序报告,布线 器的时序报告,通过分析,可以看出是否芯片的潜能已经被完全挖掘出来