在给FPGA作逻辑综合和布局布线时,须要在工具中设定时序的约束。一般,在FPGA设计工具中都FPGA中包含有4种路径:从输入端口到寄存器,从寄存器到寄存器,从寄存器到输出,从输入到输出的纯组合逻辑。一般,须要对这几种路径分别进行约束,以便使设计工具可以获得最优化的结果。下面对这几种路径分别进行讨论。 工具
(1)从输入端口到寄存器:
这种路径的约束是为了让FPGA设计工具可以尽量的优化从输入端口到第一级寄存器之间的路径延迟,使其可以保证系统时钟可靠的采到从外部芯片到FPGA的信号。约束名称:input delay. 约束条件的影响主要有4个因素:外部芯片的Tco,电路板上信号延迟Tpd,FPGA的Tsu, 时钟延迟Tclk. Tco的参数一般须要查外部芯片的数据手册。计算公式: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 之内。布局
(2)寄存器到寄存器:
这种路径的约束是为了让FPGA设计工具可以优化FPGA内寄存器到寄存器之间的路径,使其延迟时间必须小于时钟周期,这样才能确保信号被可靠的传递。因为这种路径只存在于FPGA内部,一般经过设定时钟频率的方式就能够对其进行约束。对于更深刻的优化方法,还能够采用对寄存器的输入和寄存器的输出加入适当的约束,来使逻辑综合器和布线器可以对某条路径进行特别的优化。还能够经过设定最大扇出数来迫使工具对其进行逻辑复制,减小扇出数量,提升性能。性能
(3)寄存器到输出:
这种路径的约束是为了让FPGA设计工具可以优化FPGA内部从最后一级寄存器到输出端口的路径,确保其输出的信号可以被下一级芯片正确的采到。 约束的名称:output delay,约束条件的影响主要有3个因素:外部芯片的Tsu,电路板上信号延迟Tpd,时钟延迟Tclk.Tsu的参数一般须要查外部芯片的数据手册。计算公式:output delay = Tsu+Tpd-Tclk.例如:系统时钟100MHz,电路板上最大延迟2ns, 时钟最大延迟 1.7ns, Tsu 1ns, 输出延迟的值:max output delay = 1+2-1.7=1.3ns . 这个参数的含义是指让FPGA的设计工具把最后一级寄存器到输出端口之间的路径延迟(包括门延迟和线延迟)控制在 10ns-1.3ns=8.7ns 之内。
(4)从输入端口到输出端口:
这种路径是指组合逻辑的延迟,指信号从输入到输出没有通过任何寄存器。给这种路径加约束条件,须要虚拟一个时钟,而后经过约束来指定哪些路径是要受该虚拟时钟的约束。在Synplifypro和Precision中都有相应的约束来处理这种路径。优化
关于输入输出延迟的一些参数,若是要把这些参数和altera,xilinx的软件结合起来,也不是一件容易的事情。之前altera和xilinx的约束条件设定很是烦杂,各自都有一套。彷佛你们也不太看重约束条件的设定,大多时候都是不管如何先上板,而后经过signaltap和Chipscope来调。当FPGA规模大了以后,布线一次都须要很长时间,这种方法的弊端就愈来愈严重。实际上能够借鉴ASIC的设计方法:加比较完善的约束条件,而后经过RTL仿真,时序分析,后仿真来解决问题,尽可能避免在FPGA电路板上来调试。altera最早意识到这一点,它采用了Synopsys的SDC格式。SDC的格式也获得了逻辑综合器的支持。并且设定方法比较容易掌握。这个帖子会详细讨论一下这种格式的约束设定方法。
设计
时钟的设定方法:时钟要分红两种,一种是从端口上直接输入的时钟,另外一种是在FPGA内部产生的时钟。内部产生的时钟又要分红两种,从锁相环出来的(包括altera的PLL和Xilinx的DLL)和从逻辑单元出来的,例如通常的计数器分频就是这种状况。从锁相环出来的时钟能够经过端口直接加,由于通常的综合工具和布线工具都可以自动的把端口的时钟约束传递到锁相环,而且根据锁相环的倍频关系自动施加到下一级。而从逻辑单元出来的就须要单独对其进行约束。
3d
在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的延时计算的概念须要作更多的说明。orm
对于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 [get_ports IN]
set_input_delay -clock CLK -min 1.600 [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的设定方法差很少。
为了让逻辑综合器和布局布线器可以根据时序的约束条件找到真正须要优化的路径,咱们还须要对时序报告进行分析,结合逻辑综合器的时序报告,布线器的时序报告,经过分析,能够看出是否芯片的潜能已经被彻底挖掘出来。blog
########################################################################################################
时序约束目的:1、提升设计的工做频率2、得到正确的时序分析报告(STA:静态时序分析)
经常使用的时序概念:周期,最大时钟频率、时钟创建时间、时钟保持时间、时钟到输出延时、管脚到管脚延时、Slack和时钟偏斜(Skew).
周期:如图1是周期示意图,当计算出Tperiod,那么固然fmax=1/Tperiod,fmax是显示设计最重要的性能指标之一。
时钟创建时间:如图3所示是时钟创建时间的计算方法
时钟保持时间:一样利用图3的模型计算Th=clkdelay-datadelay+Microhold
注意:前两个公式中提到的Microsetup 和Microhold通常均是一个小于1ns的常量。
时钟输出延迟:他是指在时钟有效到数据有效的最大时钟间隔如图4所示Tco=clkdelay+datadelay+Microco
slack:表示设计是否知足时序的一个称谓:正的slack表示知足时序,负的slack表示不知足时序。保持时间slack是一个重要的概念,引发不知足的主要缘由是时钟偏斜大于数据路径的偏斜。
Quartus2时序分析工具和优化向导:
经常使用的三种时序约束设置方法:1 经过Assignment/timing settings 2 Assignment/timing wiard
tool 3 Assignment/Assignment editor选择在图形界面下完成对设计的时序约束。通常状况下前两种是作全局的时序约束,后一种是作局部的时序约束,另外还能够经过修改.qsf文件来实现。
时序约束思想:时序约束通常都是先全局后个别,若是冲突则个别的优先级更高。
1、将编绎器设置为时序驱动编绎,便是指让编绎过程尽可能向着知足时序约束方向努力!assignment/settings/fitter setting.
2、全局时钟设置若是在设计中只有一个全局时钟,或者全部的时钟同频,能够在Quartus2中只设置一个全局时钟约束。 Assignment/timing settings
3、时序向导在用记对时序约束设置不熟悉的状况下,能够选择使用向导。 Assignment/classic timing analyser wizards.
4、能够设置独立时钟与衍生时钟,衍生时钟是由独立时钟变化而来的,他是由独立时钟分频,倍频,移相等变化而来的,能够在设置中肯定两者的关系 Assignment/settings/timing analyse setting/classic timing analyse setting/individual clock。
5、经过assignment editor 设置个别时钟约束
Tperiod的计算公式
逻辑延时与互连延时
时钟创建时间计算
时钟到输出计算方法