TimeQuest是Quartus II中内嵌的时序分析与约束工具。我们之后的分析约束都是使用这款软件。
具体使用流程,强烈推荐一份Quartus II的官方文档,TimeQuest Timing Analyzer Quick Start Tutorial。
官方手把手教学,且采用的是Quartus II安装目录下的例程,非常友好。
需要的朋友,请 关注公号FPGA里的那些事儿,后台回复003获取。
这篇文章主要来谈谈TimeQuest进行时序分析与优化背后的基本逻辑。
希望大家从一个比较宏观的视角去看待它。一旦理解,那么之后的操作并不复杂。
01
我们之前的文章提到,[原创]谈谈FPGA设计的实现过程,在布局布线之后,会生成一个LUT级网表,这个网表存储了FPGA内部资源的连线信息。
在做时序分析的时候,我们也要创建一个网表,这个网表存储了之前LUT级网表里的节点信息与各条路径的时延信息,这个网表叫时序网表(Timing Netlist)。
TimeQuest进行时序分析的对象就是Timing Netlist。
因此在使用TimeQuest时,首先需要创建一个时序网表Timing Netlist。
比如对于下面这个图:
其时序网表是这样的:
时序网表把原来图中的节点都做了标记,比如Cells、Port、Pin、Net等
这些标记的意思是:
- Cells:LUT、寄存器、DSP块、RAM块、IO块等
- Pins:Cells的输入输出
- Nets:Pins之间的连线
- Ports:输入输出的物理引脚
TimeQuest就是根据这些节点进行分析的。
02
有了时序网表,就可以开始时序分析了吗?
其实还不行。因为时序分析器可不知道时序网表要在什么样的环境下被使用。比如电路中哪些端口是时钟?时钟频率是多少?IO口的延时是多少?是不是网表中的每一条路径都要被分析?
这些就是所谓的时序约束信息。我们要把这些约束告诉TimeQuest。
因此,第二步就是为网表施加约束。
其实在初次编译的时候,Quartus已经自动添加了相应的约束,我们只需点击读取即可。
当然,往往自动添加的约束并非我们想要,所以之后会对约束进行更改和添加。具体有哪些约束,我们之后会详细展开聊。
施加约束之后,还需要对网表进行更新(Update timing netlist)。
好啦,有了网表,有了约束,这时就可以查看时序报告了。
查看报告之后,发现时序情况不满意,那么可以改变约束,再更新时序网表,再查看报告。
我们总结一下,使用TimeQuest进行时序分析需要按照以下步骤:
- 创建一个时序网表Timing Netlist
- 为网表施加约束
- 对网表进行更新
- 查看时序报告
03
上面通过时序约束,完成了时序分析,也就是之前文章时序约束作用中提到的时序约束的第1个作用。
时序约束怎么优化综合、布局布线呢?
其实很简单,我们首先要将上面用作时序分析时,建立的时序约束信息全部导出,导出后缀为.sdc的文件。
这个文件中保存了所有的时序约束信息。
接下来,将这个sdc文件添加到现有的工程中。
全编译工程,sdc文件内的时序约束信息,就会影响到工程的综合、布局布线。
需要大家理解的是,对综合和布局布线进行约束的是sdc文件。
如果只在TimeQuest内施加了约束,但是没用生成sdc文件,那么这些约束仅可以用作时序分析,但是无法对工程的综合与布局布线起到作用。
我们在做时序约束的时候,借助TimeQuest生成sdc文件。
其实事实上,sdc文件也可以自己编写,因为sdc中的时序约束都是同样的语法格式,比如
create_clock -name {clk_50m} -period 20.000 -waveform { 0.000 10.000 } [get_ports {clk_50m}]
这样就创建了一个频率为50M的方波。
如果理解了常用的时序约束语法格式,那么我们直接修改sdc文件也是可以的。
这次先说这么多,下次见!