在FPGA设计环境下添加时序约束的方法
- 格式:doc
- 大小:45.00 KB
- 文档页数:5
如何在FPGA设计环境中加时序约束SDC在给FPGA做逻辑综合和布局布线时,需要在工具中设定时序的约束。
通常,在FPGA设计工具中都FPGA中包含有4种路径:从输入端口到寄存器,从寄存器到寄存器,从寄存器到输出,从输入到输出的纯组合逻辑。
通常,需要对这几种路径分别进行约束,以便使设计工具能够得到最优化的结果。
下面对这几种路径分别进行讨论:从输入端口到寄存器:这种路径的约束是为了让FPGA设计工具能够尽可能的优化从输入端口到第一级寄存器之间的路径延迟,使其能够保证系统时钟可靠的采到从外部芯片到FPGA的信号。
约束名称:input delay。
约束条件的影响主要有4个因素:外部芯片的Tco,电路板上信号延迟Tpd,FPGA的Tsu/Th,时钟延迟Tclk。
Tco的参数通常需要查外部芯片的数据手册。
计算公式:input delay = Tco+Tpd+Tsu-Tclk。
FPGA的Tsu也需要查FPGA芯片的手册,FPGA速度等级不同,这个参数也不同。
Tpd和Tclk需要根据电路板实际的参数来计算。
通常,每10 cm的线长可以按照1ns来计算. 例如:系统时钟100MHz,电路板上最大延迟2 ns,时钟最大延迟为1.7 ns,Tco为3 ns,FPGA的Tsu为0.2 ns。
那么输入延迟的值:max input delay = 2+3+0.2-1.7=3.5 ns。
这个参数的含义是指让FPGA 的设计工具把FPGA的输入端口到第一级寄存器之间的路径延迟(包括门延迟和线延迟)控制在10 ns - 3.5 ns = 6.5 ns 以内。
对于min input delay,则类似考虑FPGA寄存器的Th参数等。
寄存器到寄存器:这种路径的约束是为了让FPGA设计工具能够优化FPGA内寄存器到寄存器之间的路径(register-to-register),使其延迟时间必须小于时钟周期,这样才能确保信号被可靠的传递。
由于这种路径只存在于FPGA内部,通常通过设定时钟频率的方式就可以对其进行约束。
对于更深入的优化方法,还可以采用对寄存器的输入和寄存器的输出加入适当的约束,来使逻辑综合器和布线器能够对某条路径进行特别的优化。
还可以通过设定最大扇出数来迫使工具对其进行逻辑复制,减少扇出数量,提高性能。
寄存器到输出:这种路径的约束是为了让FPGA设计工具能够优化FPGA内部从最后一级寄存器到输出端口的路径(register-to-pin),确保其输出的信号能够被下一级芯片正确的采到。
约束的名称:output delay,约束条件的影响主要有3个因素:外部芯片的Tsu/Th,电路板上信号延迟Tpd,时钟延迟Tclk。
Tsu/Th的参数通常需要查外部芯片的数据手册。
计算公式:output delay = Tsu + Tpd - Tclk。
例如:系统时钟100MHz,电路板上最大延迟2 ns,时钟最大延迟为1.7 ns,Tsu为1 ns,输出延迟的值:max output delay = 1+2-1.7=1.3 ns。
这个参数的含义是指让FPGA 的设计工具把最后一级寄存器到输出端口之间的路径延迟(包括门延迟和线延迟)控制在10 ns - 1.3 ns = 8.7 ns 以内。
从输入端口到输出端口:这种路径是指组合逻辑的延迟,指信号从输入到输出没有经过任何寄存器。
给这种路径加约束条件,需要虚拟一个时钟(Virtual Clock),然后通过约束来指定哪些路径是要受该虚拟时钟的约束。
在Synplifypro和Precision中都有相应的约束来处理这种路径。
一. 约束时钟1. 时钟周期的约束时钟的设定方法:时钟要分成两种,一种是从端口上直接输入的时钟,另一种是在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,占空比为2 ns低电平,8 ns高电平。
这个叫做clk1的约束是针对sysclk这个端口的。
如果是利用内部锁相环分频出来很多其他时钟的约束,可以不再另外施加其他约束,逻辑综合器和布线器都能根据锁相环的参数自动计算;如果是利用内部的逻辑单元分频出来的信号,则必须利用get_registers指定分频的寄存器名。
例:create_clock-name clk1 -period10.000 -waveform{2.000 8.000} [get_registers cnt_clk]此外,对于逻辑单元分频的时钟信号,也可以采用命令create_generated_clock 会更加精确:例:create_generated_clk–name clk2 -source[get_ports sysclk] -div 4 [get_registers cnt_clk]这个约束命令描述了一个clk2的约束,约束的对象是由sysclk分频4次得到的时钟,这个时钟是由cnt_clk这个寄存器产生的。
2. 时钟延迟、抖动等约束在高速的系统中,对时钟的描述可能会要求的更多,更加细致。
例如,会要求对时钟的抖动和时钟的延迟进行描述。
在SDC的文件格式中,可以通过两个命令来描述:set_clock_uncertainty和set_clock_latency来设定。
时钟的延迟一般分为外部延迟和内部时钟线网的延迟。
通常在约束时只对外部延迟做约束,在set_clock_latency的命令后带-source的参数就可以了。
例:set_clock_latency-source 2 [get_clocks {clk_in}] 时钟的抖动要稍微复杂一些。
因为这个值不但会影响到对Tsu的分析,也会影响到对Th的分析。
因此,采用set_clock_uncertainty的参数要多一些。
如果要理解这个命令对系统时序分析的影响,就需要对altera的延时计算的概念需要做更多的说明。
set_clock_uncertainty的值既影响建立时间的计算,也影响保持时间的计算,因此,需要在设定时分别指明:set_clock_undertainty -setup 0.500 -from clkA -to clkBset_clock_uncertainty -hold 0.300 -from clkA -to clkB总结:时钟约束的完成,意味着FPGA内部的reg-to-reg路径约束已经确定,其余路径需要另外再加约束。
二. I/O端口1. 输出延迟的命令是set_output_delay. 有几个参数要加:参考时钟,最大最小值,和端口的名称。
如下面的例子中描述:set_output_delay -clock CLK -max 1.200 [get_ports OUT],相当于在考虑FPGA外部芯片中寄存器的建立时间要求;set_output_delay -clock CLK -min 0.800 [get_ports OUT],相当于在考虑FPGA外部芯片中寄存器的保持时间要求;输入延迟的命令很类似:set_input_delay -clock CLK -max 2.000 [get_ports IN]set_input_delay -clock CLK -min 1.600 [get_ports IN]注意:I/O分析时的参考时钟必须使用Virtual Clock,即创建一个和主时钟同周期的虚拟时钟,用来分析外部器件和FPGA内部寄存器之间的Timing Path。
三. 特殊路径或设计的要求对一些特殊的设计要求,例如不关心的数据传递路径和多拍的路径,还需要增加false path和multicycle的设定。
这两个约束比较简单,容易设定,但是非常关键。
如果设定的不好,系统性能会大打折扣。
1. false path是指在时序分析中不考虑其延迟计算的路径。
例如有些跨越时钟域的电路等。
设定的方法:set_false_path -from[get_clocks clkA] -to[get_clocks clkB],该命令是设定了从时钟域clkA到时钟域clkB的所有路径都为false path.set_false_path-from regA -to regB,该命令设定了从regA到regB 的路径为false path.上述两种路径在做时序分析时都会被自动忽略。
2. multicycle path的设定在同步逻辑设计中,往往存在这样的情况:一些数据不需要在下一个时钟周期就稳定下来,可能在数据发送后几个时钟周期才起作用;一些数据经过的路径太复杂,延迟太大,不可能在下一个时钟周期稳定下来,必须要在数据发送后的数个时钟周期才能被采用。
针对这两种情况,设计者的意图都是:数据的有效期在以launch edge为起始的数个时钟周期之后的latch edge,即设计者要在约束中去指定setup/hold time的检查时钟沿(如:向后推迟2个周期)例:set_multicycle_path–from [get_clocks {clk_x1}] –to [get_clocks {clk_x2}] –setup –end 2为了让逻辑综合器和布局布线器能够根据时序的约束条件找到真正需要优化的路径,我们还需要对时序报告进行分析,结合逻辑综合器的时序报告,布线器的时序报告,通过分析,可以看出是否芯片的潜能已经被完全挖掘出来。