在学习ISE的路上,逐渐感觉到了吃力,有各种的问题困绕着自己。幸好网的资料还是很丰富的,但是一点就是很杂,很乱,不系统。当你学到一定阶段的时候,当你自己明确的知道自己需要哪个方面的资料的时候,网络简直太强大了。这是我在学习FPGA路上的第一个比较强烈的感觉。下面还是进入正题吧。
学到现在这个阶段,虽然说对整个FPGA设计的流程有那么一点的认识,但是很多地方都还是模糊的。以后就会专门学习研究自己还在困惑着的一些地方。这里的约束就是第一到障碍吧。今天突然发现一博客专门写了关于约束的文章,比较详细也比较全面,希望自己可以通读深读吧。
前面的帖子里讲述了关于输入输出延迟的一些参数的含义和计算方法。如果要把这些参数和altera,xilinx的软件结合起来,也不是一件容易的事情。以前altera和xilinx的约束条件设定非常复杂,各自都有一套。似乎大家也不太看重约束条件的设定,大多时候都是无论如何先上板,然后通过signaltap和Chipscope来调。当FPGA规模大了之后,布线一次都需要很长时间,这种方法的弊端就越来越严重。 实际上可以借鉴ASIC的设计方法:加比较完善的约束条件,然后通过RTL仿真,时序分析,后仿真来解决问题,尽量避免在FPGA电路板上来调试。 altera最先意识到这一点,它采用了Synopsys的SDC格式。SDC的格式也得到了逻辑综合器的支持。而且设定方法比较容易掌握。 这个帖子会详细讨论一下这种格式的约束设定方法。
时钟的设定方法:
时钟要分成两种,一种是从端口上直接输入的时钟,另一种是在FPGA内部产生的时钟。内部产生的时钟又要分成两种,从锁相环出来的(包括altera的PLL和Xilinx的DLL)和从逻辑单元出来的,例如一般的计数器分频就是这种情况。
从锁相环出来的时钟可以通过端口直接加,因为一般的综合工具和布线工具都能够自动的把端口的时钟约束传递到锁相环,并且根据锁相环的倍频关系自动施加到下一级。
而从逻辑单元出来的就需要单独对其进行约束。
在高速的系统中,对时钟的描述可能会要求的更多,更加细致。 例如,会要求对时钟的抖动和时钟的延迟进行描述。
在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
[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的设定方法差不多。
为了让逻辑综合器和布局布线器能够根据时序的约束条件找到真正需要优化的路径,我们还需要对时序报告进行分析,结合逻辑综合器的时序报告,布线器的时序报告,通过分析,可以看出是否芯片的潜能已经被完全挖掘出来。
关于如何看时序分析报告,如果有机会,也可以专门搞个讲座进行详细的讲解。
以上是在某个论坛上转过来的,只是感觉对约束中路径的解释比较好一点,至于后面的关于SDC我自己也没有接触过了,暂时看看。