47 TimeQuest的使用
TimeQuest对设计中各组成部分的归类主要有cells,pins,nets和ports几种。寄存器,门电路等为cells;设计的输入输出端口为ports;寄存器,门电路等的输入输出引脚为pins;ports和pins之间的连线为nets。
时钟约束
添加时序约束的第一步就是创建时钟。这是因为后面其他的时许约束都要参考相关的时钟的。
时钟分类:
1.基准时钟,FPGA原是始终,如我的Cyclone 50M;
约束语法结构:(新建sdc文件,然后打开timequest analysis 中report clock选项)
create_clock -name CLK -period 20 -waveform {0 10} [get_ports {CLK}]
建立 名称 周期 占空比 50% 连接到port CLK
2.虚拟时钟
3.多频率时钟
4.生成时钟
PLL约束
当我们使用到PLL的时候,我们需要约束输出时钟:
使用一句:derive_pll_clocks 会看到report clock选项中增加两个或几个时钟;
也可以使用:
create_generated_clock -name CLK25M -source CLK_IN -duty_cycle 50.000 -multiply_by 1 -master_clock {CLK_IN} [get_pins {PLL1|altpll_component|auto_generated|pll1|clk[0]}]
在TimeQuest的Tasks窗口里,选择Report Unconstrained Paths命令,TimeQuest会报告出所有需要下约束但实际并没有约束的情况。在Report里的Unconstrained Path列表下,我们可以查看这个报告。双击Clock Status Summary,就可以在主窗口看到所有时钟的情况;
时钟关系约束
当设计中有多个时钟时,时钟之间可能存在三种关系,分别是同步,异步和互斥。
语法约束:
set_clock_groups -asynchronous -group {CLK} -group {CLK1 CLK2}
可以看到两组都是false Path 说明是异步时钟
没约束之前,软件默认三个时钟都是同步时钟,所以会分析并报告出三个时钟之间所有
Timing path:
互斥时钟约束:
set_clock_groups -exlusive -group {CLK} -group {CLK1}
接着第四章:http://blog.sina.com.cn/s/blog_72c14a3d01016966.html
设定输入/输出延迟 约束
在我们对FPGA做时序分析的时候,软件只知道FPGA内部的时序信息,对External Device的情况并不清楚。所以我们必须要添加额外的约束来反映FPGA外部的时序信息。一般情况下,我们用input delay来表示输入信号相对于CLK的延迟。即上图我们用红线表示出来的部分。为了便于讨论,我们把FPGA内部蓝色走线的部分称为chip delay。如果我们能给出input delay的大小,那么软件就可以计算出chip delay的大小,从而保证该条timing path符合设计要求。
一般情况下,External Device的spec会给出input delay的大小。我们在做FPGA时序分析的时候,只需要用命令将input delay加入到约束中就可以了:
set_input_delay -clock clk 1.5 [all_inputs]
set_input_delay -clock clk -clock_fall 1.5 [get_ports myin*]
同理 output delay:
set_output_delay -clock clk 0.5 [all_outputs]
set_output_delay -clock clk -clock_fall 0.5 [get_ports myout*]
Timing exception约束
常用的设定timing exception的方式有两种:false path和Multicycle path。先来讨论false path。
False path就是不需要关注其时序的timing path。如果将一条timing path设为false path,软件在做时序分析时,会自动忽略掉这条timing path,不做分析;
set_false_path -from [get_pins {DAC7512|DACSM[2]|clk}] -to [get_ports {DA_DIN}]
但实际上并不是说上面的这条timing path的时序变得没有问题,原来的问题依然存在,甚至会更糟糕,只是我们把它设定为false path了,软件不会再去分析它而已。这就要求对于set_false_path的使用,一定要慎重。只有肯定不用关注某条timing path的时序时,才能使用这个命令,否则软件不会对它做任何的分析,出问题的概率会比较大
multicycle path。一般情况下,信号在timing path的起点(亦即第一个时钟沿)发生变化,Terminate会在timing path的终点(亦即第二个时钟沿)采集该信号。这种情况,做时序检查就需要按1T来做,这也是设计中最常见的一种情况。但如果信号在第一个时钟沿发生变化,terminate端在第三个时钟沿时采集该信号,那么就不需要保证信号在第二个时钟沿传递到终点,也就是说,不需要做1T的检查而是做2T的检查,即保证信号在第三个时钟沿之前到达终点。依次类推,可以对timing path进行nT(n > 1)的检查,这时统称该timing path为multicycle path。
set_multicycle_path -setup 2 -from [get_pins {DAC7512|DACSM[2]|clk}] -to [get_ports {DA_DIN}]
set_multicycle_path -hold 1 -from [get_pins {DAC7512|DACSM[2]|clk}] -to [get_ports {DA_DIN}]
<转载>http://blog.sina.com.cn/s/articlelist_1925270077_0_1.html