这个手册是国外坛子http://www.alteraforum.com 上一个比较好的时序约束的使用指导手册。
Section 1: Getting Started
Core Timing
在编译工程以后,调用Timequest。如果SDC文件没有创建,那么可以到 File->New 选项创建一个新的SDC文件。
Constraining the Core with Four Commands
每个 .sdc文件都应当以下面四个命令作为开头:
-
- create_clock
-
- derive_pll_clocks
-
- derive_clock_uncertainty
-
- set_clock_group
前三个命令是重要的。命令的细节描述可以通过-long_help帮助显示出来:
-
create_clock -long_help
-
derive_pll_clocks -long_help
-
derive_clock_uncertainty -long_help
-
set_clock_groups -long_help
create_clock
当我们创建一个新的SDC文件,首先要做的就是约束输入FPGA端口的时钟信号,通过使用create_clock命令。基本的格式如下:
create_clock -name sys_clk -period 8.0 [get_ports fpga_clk]
注意:
1.上面的命令创建了一个周期为8ns的系统时钟sys_clk,并将该时钟连接到我们FPGA的时钟输入端口 fpga_clk;
2.Tcl和SDC是 case-sensitive的,所以请确认fpga_clk 和我们设计的时钟参数相符合;
3.该时钟在0ns时刻产生一个上升沿,具有50%的占空比,因而其下降沿在4ns处。如果我们想产生不同占空比,或者添加一个时钟偏移offset,可以使用-waveform选项。 但很少需要这么做。
4.我们经常会去创建一个与端口port同名的时钟信号,这种做法是不合法的。下面的例子:
create_clock -name fpga_clk -period 8.0 [get_ports fpga_clk]
现在有两个单元都有name叫做fpga_clk,一个是端口,一个我们定义的时钟。
5.在Tcl 语法中,方括号[ ] 将会执行在其内部的命令,所以[ get_ports fpga_clk ] 会执行搜索命令,找到一个名交fpga_clk的端口,并return其值。这部分在章节Tcl syntax section部分有详细的讨论。虽然该命令经常被使用,但仍有一部分设计人员只是简单的把端口名字写在命令后面:
create_clock -name sys_clk -period 8.0 fpga_clk (Wrong)
6.重复上面的步骤,添加设计中所有的时钟信号。(如果你不确定有哪些时钟,那么就把所有你知道的时钟输入进来,之后我们将会展示Report Unconstrained Paths 是怎样指定一个没有约束的时钟的。)
建议:除了可以输入约束命令,我们还可以通过GUI的方式输入约束。在打开Timequest之后,再打开,sdc文件,将光标定位在需要加入约束命令的地方,然后使用Edit->Insert Constraint,选择相对应的约束。
需要注意的是,不要通过TimeQuest GUI的 Constraint下拉菜单添加约束。
虽然二者看起来是一样的,但是上面方式添加的约束,将会直接作用到timing database中,而不会写入到.sdc 文件中,有经验的users可能会用上面的方式,但是初学者不推荐。还是安心的使用Edit->Insert Constraint命令。
derive_pll_clocks
接下来,在我们的 .sdc文件中添加如下命令:
derive_pll_clocks
就这样,加上这句话就好了!
注意:
1. 每一个PLL输出信号都需要被 create_generated_clock 约束。
2. 当PLL信号被创建的时候,设计者会指定每个PLL输出是怎样配置的。所以,TImequest 能够自动的去对它们创建约束,这就是derive_pll_clocks 命令做的事情。
3. 这个命令同时还做了其他的工作:它会约束 transceiver clocks(这个是什么时钟),同时会在LVDS SERDES和user logic之间添加多周期。
4. 想要查看 derive_pll_clocks 命令在底层的具体实现,可以看TimeQuest 的messages窗口,它会单独的列出derive_pll_clocks 实现的每一条命令
5. 新手经常不会去添加derive_pll_clocks 命令,而是一条条的将 create_generated_clock 命令输入 .sdc文件中。理论上来说,这并没有错,但问题是,一旦我们PLL设计修改了,那么 相应的 .sdc文件和PLL 相关的命令就需要重新编辑。所以还是建议使用derive_pll_clocks命令去自动创建pll约束。
derive_clock_uncertainty
在.sdc文件中添加如下命令:
derive_clock_uncertainty
先不用管为什么,加上去就好了。
注意:
1. 这个命令应当在所有的 SDC文件中都存在。
2. 它的存在不会影响早期的设计,顶多不起作用。
3. 这个命令会计算FPGA里面时钟之间的uncertainties,根据各种参数(诸如PLL 波动,时钟树抖动.etc)
4. 如果用户不添加该命令,则会有一个报警。
以上就是时序约束要先完成的三个步骤。对于一个有两个时钟输入的简单设计,它的 SDC文件如下:
文章评论(0条评论)
登录后参与讨论