一乐电子

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

微信扫码登录

手机号码,快捷登录

手机号码,快捷登录

搜索
查看: 11001|回复: 3

Xilinx时序约束培训教材

[复制链接]
发表于 2010-5-1 16:07 | 显示全部楼层 |阅读模式
Xilinx时序约束培训教材.pdf (1.42 MB, 下载次数: 3107)
 楼主| 发表于 2010-5-3 09:51 | 显示全部楼层
xilinx 官方 contraints Guide
* B% @6 O3 K9 k
+ a" N3 g, G+ N4 y/ q Constraints Guide.pdf (3.17 MB, 下载次数: 1961) , B' S9 z7 L( u+ G8 P. `# p

$ T8 ?0 M1 D' b( D) b* b4 i5 m7 }7 a0 o( {2 f. W
timing_constraints_ug.pdf (1.01 MB, 下载次数: 1691)
回复

使用道具 举报

 楼主| 发表于 2010-5-3 10:00 | 显示全部楼层
本帖最后由 kenson 于 2010-5-3 10:03 编辑
) e: T" x& h* d9 W  {; C* M$ p, ~% j; q  r
(转) 电子工程世界
$ W1 L# D$ }. l6 s. m& C! ^
- [/ P" x; C$ L6 _7 f) l如何在FPGA设计环境中加时序约束(一)" O+ U, B* `5 w! o# N4 z( s4 g' p7 i
在给FPGA做逻辑综合和布局布线时,需要在工具中设定时序的约束。 通常,在FPGA设计工具中都FPGA中包含有4种路径:从输入端口到寄存器,从寄存器到寄存器,从寄存器到输出,从输入到输出的纯组合逻辑。 通常,需要对这几种路径分别进行约束,以便使设计工具能够得到最优化的结果。下面对这几种路径分别进行讨论。 ; o0 O' t) A* Y- Y: ^1 z
        从输入端口到寄存器:: O  S) c( k- l* h% Q0 r
              这种路径的约束是为了让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 以内。 ) \5 y# r& N' T0 {- b
- m2 h2 ?$ ^) [6 p# l" o* [
如何在FPGA设计环境中加时序约束(二)' e6 r+ P5 B$ a( p3 N+ v
寄存器到寄存器: & [$ D/ ~8 q6 p; Z$ v4 u
     这种路径的约束是为了让FPGA设计工具能够优化FPGA内寄存器到寄存器之间的路径,使其延迟时间必须小于时钟周期,这样才能确保信号被可靠的传递。 由于这种路径只存在于FPGA内部,通常通过设定时钟频率的方式就可以对其进行约束。对于更深入的优化方法,还可以采用对寄存器的输入和寄存器的输出加入适当的约束,来使逻辑综合器和布线器能够对某条路径进行特别的优化。 还可以通过设定最大扇出数来迫使工具对其进行逻辑复制,减少扇出数量,提高性能。
6 O6 y& f2 F0 x& Y/ e$ H5 `3 E/ N+ I  C; V0 @

8 @7 Q- n" s0 l  `0 H  B如何在FPGA设计环境中加时序约束(三)7 z/ |5 Z; V3 H9 |& x- @& |1 ]9 T
寄存器到输出:
4 L; {5 k: D, A) U; g2 i      这种路径的约束是为了让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 以内。
% x- ~) J' C& R3 |8 r. e' J1 E3 u; G& n& D
从输入端口到输出端口: , L8 I! a) h  d; s9 c
    这种路径是指组合逻辑的延迟,指信号从输入到输出没有经过任何寄存器。给这种路径加约束条件,需要虚拟一个时钟,然后通过约束来指定哪些路径是要受该虚拟时钟的约束。 在Synplifypro和Precision中都有相应的约束来处理这种路径。 ! Y* g; t' r5 C7 c

! ]/ I# O; Y$ L  b7 l! h
. v& Y$ h% ?; h4 `& F$ m如何在FPGA设计环境中加时序约束(四)% L0 {5 z- d8 W* Y4 [+ S  ^
前面的帖子里讲述了关于输入输出延迟的一些参数的含义和计算方法。如果要把这些参数和altera,xilinx的软件结合起来,也不是一件容易的事情。以前altera和xilinx的约束条件设定非常烦杂,各自都有一套。似乎大家也不太看重约束条件的设定,大多时候都是无论如何先上板,然后通过signaltap和Chipscope来调。当FPGA规模大了之后,布线一次都需要很长时间,这种方法的弊端就越来越严重。 实际上可以借鉴ASIC的设计方法:加比较完善的约束条件,然后通过RTL仿真,时序分析,后仿真来解决问题,尽量避免在FPGA电路板上来调试。 altera最先意识到这一点,它采用了Synopsys的SDC格式。SDC的格式也得到了逻辑综合器的支持。而且设定方法比较容易掌握。 这个帖子会详细讨论一下这种格式的约束设定方法。 - z" M( g* n& @! O7 {% l5 g
     时钟的设定方法: 时钟要分成两种,一种是从端口上直接输入的时钟,另一种是在FPGA内部产生的时钟。内部产生的时钟又要分成两种,从锁相环出来的(包括altera的PLL和Xilinx的DLL)和从逻辑单元出来的,例如一般的计数器分频就是这种情况。 从锁相环出来的时钟可以通过端口直接加,因为一般的综合工具和布线工具都能够自动的把端口的时钟约束传递到锁相环,并且根据锁相环的倍频关系自动施加到下一级。 而从逻辑单元出来的就需要单独对其进行约束。 ; K) w, _4 x* D( e7 t5 q' {$ f

9 R* C, D! o8 C1 Z5 a3 X1 b( ^& Y! _& Z
如何在FPGA设计环境中加时序约束(五)
9 v; Y0 R9 n- f- x, @' }& }在SDC格式中,创建时钟的命令 create_clock, 后面要带3个参数:name ,period, waveform.  name的含义是指创建这个时钟约束的名字,而不是时钟本身的名字。 要把这个约束和时钟信号关联起来,还需要在后面加些东西。 period的单位缺省是ns. waveform是用来指定占空比。 除了这三个参数以外,常常还要加 get_ports的命令,来指定时钟的输入端口。 下面的例子是一个较为完整的设定时钟的例子:
7 R9 q2 O: M0 Q: h5 |8 o            create_clock  -name clk1  -period 10.000 –waveform { 2.000 8.000 } [get_ports sysclk]. S) F0 D& H' ^4 p/ w/ W5 u
                这个例子表示,有一个clk1的约束,在这个约束中设定了时钟的周期为10ns, 占空比为2ns低电平,8ns高电平。 这个叫做clk1的约束是针对sysclk这个端口的。
5 ?7 Z# ]% V$ M& q  g& Y   如果是利用内部锁相环分频出来很多其他时钟的约束,可以不再另外施加其他约束,逻辑综合器和布线器都能根据锁相环的参数自动计算。  如果是利用内部的逻辑单元分频出来的信号,则必须利用get_registers指定分频的寄存器名。 例如上例:. }5 n) L' g' F6 l0 X9 O
         create_clock  -name clk1  -period 10.000 –waveform { 2.000 8.000 } [get_registers cnt_clk].
9 a% H* B, g' i' A) Y( S/ V          对于逻辑单元分频的时钟信号,也可以采用命令create_generated_clock会更加精确。举例如下: 4 v1 u4 g5 q8 z4 m4 b) Z7 c( F
         create_generated_clk -name clk2 -source [getports sysclk] -div 4 [get_registers  cnt_clk]
* s- I/ F& \/ j" |/ n7 n            这个约束命令描述了 一个clk2的约束,约束的对象是由sysclk分频4次得到的时钟,这个时钟是由cnt_clk这个寄存器产生的。 3 R* i- \4 n4 M+ g# d; k: ?$ D% c# J

- g& J+ x) ^- s. R7 @2 C
9 G1 ~" O, [- y: b" s5 _# m( Y如何在FPGA设计环境中加时序约束(六). g* T8 z6 a& @4 _
在高速的系统中,对时钟的描述可能会要求的更多,更加细致。 例如,会要求对时钟的抖动和时钟的延迟进行描述。 在SDC的文件格式中,可以通过两个命令来描述:set_clock_uncertainty 和 set_clock_latency 来设定。 & M4 \. W8 b, r( @  {$ t& l
    时钟的延迟相对来讲比较简单。延迟一般分为外部延迟和内部时钟线网的延迟。 通常在约束时只对外部延迟做约束,在set_clock_latency的命令后带 -source的参数就可以了。 例如:
+ Z( {! t& J  J! H  L5 H# ?       set_clock_latency -source 2  [get_clocks {clk_in} ] 0 `# \3 H& W9 I& g# b' P; y
    时钟的抖动要稍微复杂一些。因为这个值不但会影响到对Tsu的分析,也会影响到对Thold的分析。 因此,采用set_clock_uncertainty的参数要多一些。 如果要理解这个命令对系统时序分析的影响,就需要对altera的延时计算的概念需要做更多的说明。
; k! D% k5 Z0 D8 Y% y" Z9 }   明天出差,有可能要下周再做更新。
/ B' Q; L" \$ O
. [" K- Z' J9 m* T  G  m" u. ~2 }! ]- i! ~2 G7 I, e. c& J5 e; }
如何在FPGA设计环境中加时序约束(七)9 ^& G9 t8 c& A4 {  }
书接上回。
) |# X4 {* R7 k" C- o7 ?    对于set_clock_uncertainty的情况,就稍微复杂一些。 因为set_clock_uncertainty的值既影响建立时间的计算,也影响保持时间的计算,因此,需要在设定时分别指明:* o7 S# k( E$ _9 u; ~. t" A/ e- R  X
           set_clock_undertainty –setup 0.500 –from clkA –to clkA9 `- x0 N8 g* J% \' Q- w. n( l$ S0 C0 e* y
        set_clock_uncertainty –hold 0.300 –from clkA –to clkA
  \: x, f0 P' Y' c! T, K# n- J# m0 v- f
     前面的内容里面提供了计算输入输出延迟的计算方法。输出延迟的命令是set_output_delay. 有几个参数要加:参考时钟,最大最小值,和端口的名称。如下面的例子中描述。   
6 z3 m# u, H- q    set_output_delay -clock CLK -max 1.200  [get_ports OUT]
5 u2 y9 u: W$ a        set_output_delay -clock CLK -min 0.800 [get_ports OUT]
1 `! S& m/ \& e4 z" Y; J( V  输入延迟的命令很类似: . ~( H8 Z' y8 w: i; M
    set_input_delay -clock CLK -max 2.000         [get_ports IN]; N! P1 {2 @9 r1 V  E2 w3 ?
       set_input_delay -clock CLK -min 1.600         [get_ports IN]
: m3 P4 S5 r, {2 m4 n6 G! F
* x& b# B0 P% O1 M# `- I! f( l/ G+ u; C1 w) K/ @
如何在FPGA设计环境中加时序约束(八)
! L9 e9 x+ f: w! C3 L对一些特殊的设计要求,例如不关心的数据传递路径和多拍的路径,还需要增加false path 和 Multicycle的设定。
0 d% S) L  V5 p4 w这两个约束比较简单,容易设定,但是非常关键。 如果设定的不好,系统性能会大打折扣。6 V6 i2 V' T# N9 J! |1 g7 N8 u  i
   false path是指在时序分析中不考虑其延迟计算的路径。例如有些跨越时钟域的电路等。 设定的方法:
2 t5 J5 y" ?- h/ Y0 R8 d* `0 ~" Y. k4 J        set_false_path -from [get_clocks clkA] -to [get_clocks clkB]
3 s. z, U( o& P5 N% A$ Z% E9 Z' O  S                set_false_path -from  regA -to  regB3 ?1 e: O( `/ v9 ?; a! a) ?
     第一条命令是设定了从时钟域clkA到时钟域clkB的所有路径都为false path.
  @% N; s6 [- k5 h/ K   第二条命令设定了从 regA到regB的路径为false path.  这两种路径在做时序分析时都会被忽略。
* s+ |3 z0 H1 l& K, I9 Z9 A  O# r; D$ X6 K% T7 j% D% Y) @
multicycle的设定和false path的设定方法差不多。
7 |& O7 V8 C9 V9 @1 C% U2 M6 u/ l, x! K% O3 n6 C
    为了让逻辑综合器和布局布线器能够根据时序的约束条件找到真正需要优化的路径,我们还需要对时序报告进行分析,结合逻辑综合器的时序报告,布线器的时序报告,通过分析,可以看出是否芯片的潜能已经被完全挖掘出来。 关于如何看时序分析报告,如果有机会,也可以专门搞个讲座进行详细的讲解。 0 u+ i6 x, H2 m3 g, d
   时序分析的讲座就先到这里告为段落。 谢谢各位关注。水平有限,难免有错漏之处,请大家多多包涵。  如果有问题可以在后面跟帖,大家再详细讨论。
回复

使用道具 举报

 楼主| 发表于 2010-5-3 10:11 | 显示全部楼层
不管怎么样转过来再说0 a& H- n0 B- k* G4 ~
//////////////////////////////////
5 w, Z& t4 T* c2 N# j说说Timing这回事儿 http://www.fpganotes.com/template/chouce/images/others/unstarred.gif http://www.fpganotes.com/images/weather/blank.gif ' z/ T) j: t" |+ F
2 s( y( X  T+ ^0 p
问:一个FPGA设计项目需要用哪些评判标准来检验?  u5 m7 ~9 u5 K) x+ a5 K
一曰功能正确;
: K! s' ]& M) q$ }0 H% ]; [二曰时序收敛;
) ^9 K- e, q% n! k) p& I三曰资源消耗少。
& U' F& L" n2 s7 A$ A0 x* }3 Y7 w# @( p! i7 ?3 u* T( x
时序收敛,即Timing Closure,意思是使设计的各项时序指标能满足设计前所制定要求。因此,整个过程分为两部分:8 k: X; ^: B2 O) Z0 U/ i( N! K
1. 制定时序要求
- |1 g4 c+ `  b: a# l2. 满足时序要求
( `6 y2 ?& A" q5 p1 L: D' h9 {: Y! `! d  o' c1 E! Q, E
制定时序要求通常是由整个系统电路的外部环境来决定的,比如:
, o& f% I: Z3 Q0 `# Q- 整个电路系统提供给FPGA的时钟速度为多快/ s5 q2 T% N! _# {% Z* k
- FPGA输入数据是同步信号还是异步信号以及它的频率
. ~; {) N$ Z/ ~0 L9 E) i- FPGA输出数据所需的频率6 E1 W" u3 T! o; v
- 输入/输出数据与时钟的相位关系
3 e+ T; d3 p, Q
7 g9 j3 A$ k. V5 x$ l/ A总结以上各种需求情况,得出FPGA芯片对外的三种时序约束:
/ c! n) e; @$ }9 a$ V% K- Period(时钟周期约束):约束用同一时钟驱动的寄存器(或同步器件)所能使用的最低时钟频率来保证FPGA内部同步信号的采样时间与保持时间。4 ^. ~6 }  W: D: n: M- h# s
- Offset:约束用时钟采样数据(offset in)或用时钟打出数据(offset out)时时钟与数据的相位差来保证FPGA采样数据的建立时间与下一级芯片得到数据的采样时间。 # f0 Q0 L/ x" W4 F- s0 y; o5 M
- Pad to Pad:当输入数据进入FPGA后没有经过任何同步器件(即由时钟驱动的器件如寄存器、BRAM等),只经过组合逻辑后就输出片外时,Pad to Pad的From...To..约束用以保证内部的延迟时间。. @; `6 R7 L, A5 M5 x

8 r  C3 }' X! Q, \; x有了以上三种约束类型,就可以描述外界的任何可能条件,并清楚的对最终设计需要满足的时序要求作出说明,FPGA实现工具就会依据此要求进行布局布线,并试图满足要求。Xilinx有许多文档对怎样书写时序约束进行了说明。在此要强调的一点是:时序约束首先是对外界环境的一个反映,其次才是对布局布线工具的要求。时序约束向工具说明上游器件所给的信号是怎样的,下游器件又要求怎样的输入,FPGA实现工具才好依照此标准来综合、布局、布线,时序收敛的设计才可能在真正的电路环境中正常工作。5 A# I% \2 G" O* L, Z( b+ A: \
% l* [0 z. J3 M4 D3 O, U
这里有一个误区需要澄清:多数人认为Timing约束是写在UCF文件中的,其实UCF中的Timing约束只有在布局布线过程中才起作用。为了达到最好的时序性能,我们应该从综合开始就使用约束。不管是Xilinx XST,还是Synplify或者其他综合工具都可以添加时序约束。在综合过程就添加时序约束可以使综合器努力综合出合适的网表,这样在布局布线时就更容易满足时序要求了。; C& Z) ?+ r( {& B- F0 O8 c

# w, F/ N& B2 `( t8 }) N# \设计时序不收敛通常有以下的现象:
* m% c- n: x$ P* p- par报告布线完成,但是有timing error;/ ?: K8 _1 u$ }9 @( B
- par报告由于不可能达到时序收敛而停止布局布线;8 X6 o: j' Q* \' q# d- c3 i
- Timing Analyzer报告显示设计的timing score不为0;
. L  [& k/ C! {) r- 实际电路板上给定时钟速率FPGA工作不正常,降低时钟速率FPGA工作正常6 A' p0 W9 l. z* E# I

. ?5 K! Z! \$ W如果降低时钟速率能让FPGA工作正常,而Timing报告又没有显示时序错误,那么有足够的理由怀疑时序约束没有完全约束到所有片内路径,需要仔细研究并完整约束整个设计。3 r0 I! b$ C5 z% D/ j
- }3 }; d9 s1 I& C" L9 r- X; v
那么设计中的Timing Error我们该怎么解决呢?1 w0 n! k! w) Q7 f5 u' {3 K! Y% F6 i
最简单的,两眼一抹黑,让工具解决:把map, par等工具的effor level提到最高,但通常情况下对结果的提升是不明显的。我们需要有选择地针对不同的情况使用不同的方法。以下来分析几种常见的情况:
6 v1 H' A4 h- a; k0 }3 T# a! |& _# {) e* m) ~
- Timing报告显示某一段net走线延时特别长:' k, u( i7 m- ~5 R5 _, y, i
通过在FPGA Cross Probing中找到这根net。如果输入输出距离的确比较长,那么是由于Place问题造成的,要解决Place问题,需要检查为什么工具会把两个LUT/FF放得那么远,是相关的逻辑布局问题,还是因为引脚锁定导致无法移动逻辑的问题。$ U* }4 A0 d1 j! l' h* z. n% b
常用的解决方法可以对前级寄存器做复制寄存器的操作。参考Xilinx AR94101 X2 X7 y: H, p  ^* |
如果是因为输入/输出端连接的寄存器被Pack到IOB中导致寄存器无法移动,那么可以使用IOB=false约束将寄存器放在Slice Logic中。
0 H" F, h* P" s# l: p. B
% I4 l) q+ X* M# |+ |/ W+ s- Timing报告显示逻辑层次比较多,而这些层次中没有延时特别长的:1 X. p1 y% C2 d; D& T
如果是LUT到LUT的层次太多,那么可以先使用XST的register balancing功能。如果还是无法满足,可能需要手动调整组合逻辑,在中间插一级寄存器,并修改其他相关的代码,使得相关数据的latency一致。其他方法参考Xilinx AR9417。如果是进位链太长,那么就要考虑使用两个小一点的计数器/加法器级联。当考虑到进位逻辑是纵向排列的,当超出一列时,进位会导致延时变长很多时,更需要注意进位链的长度。参考Xilinx AR94129 O  J, k- G6 _( _5 }* S* i

' C: y( }9 Z- k. K6 ^- Hold Violation3 D& w5 Q% Y2 ~
Hold Violation通常都是由Gated Clock引起。检查设计中没有使用门控时钟。门控时钟通常会由计数器分频产生。尽量都使用FPGA提供的时钟资源,尽量使用DCM做deskew。
( h- E/ t' G* A# M  h) g# m2 h# U8 Q1 B! i& M8 h/ Q
- Offset约束不满足
! Q7 E' T- L. Y5 u首先必须保证offset写得是正确的。6 ^( k: T+ G& j0 W. C+ u& B: k
然后保证输入/输出数据一进FPGA就用寄存器打一拍,中间不要加组合逻辑。寄存器Pack到IOB中能最大限度得保证Offset约束被满足。(同理,如上所述,不把寄存器放在IOB中将有利于Period约束。)  N4 S: y3 R1 l8 i9 g
如果还是满足不了,可能需要调整一下时钟和数据的相位。可以使用DCM Phase Shift调整时钟相位或IDELAY调整数据相位。
# a7 t  q5 c& m7 s( q5 `在制定Pinout时可以有意地将一组总线按内部IOB的位置排列,低有效位在下方,高有效位在上方,而不是按外部Pinout的位置排列。
9 b3 `4 C  K8 g* W4 k8 [' b  Y8 M, Q4 S' A% h" x
如果以上方法都已经使用并且离目标还差一点点,那么可以试图使用工具的某些属性,比如:. j7 N: S+ H: V1 y$ j/ p) {
map -- Timing Driven Packing, Effort Level, Extra Effort, Global Optimization, Allow Logic Optimize Across Hierarchy, Combinational Logic Optimization, Cost Table
+ R& s' W7 `0 T9 x( z% e  \0 Rpar --  Effort Level, Extra Effort* h: `4 U4 H; K2 H" Y
也可以使用MPPR或Xplorer跑多次实现挑最好的结果。1 `& \4 r3 N$ q7 c% k

6 {& R" w' U& p如果所有的尝试都无法满足先前制定的时序目标,那么可能是时候重新考虑一下目标是否合理了。
回复

使用道具 举报

本版积分规则

QQ|一淘宝店|手机版|商店|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2026-4-19 20:22 , Processed in 0.035526 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表