时序约束实例.pdf

上传人:赵** 文档编号:38701039 上传时间:2022-09-04 格式:PDF 页数:21 大小:1.71MB
返回 下载 相关 举报
时序约束实例.pdf_第1页
第1页 / 共21页
时序约束实例.pdf_第2页
第2页 / 共21页
点击查看更多>>
资源描述

《时序约束实例.pdf》由会员分享,可在线阅读,更多相关《时序约束实例.pdf(21页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、用 Quartus II Timequest Timing Analyzer进行时序分析 :实例讲解 (一)(2012-06-21 10:25:54)转载标签:杂谈一,概述一,概述用 Altera 的话来讲,timequest timing analyzer 是一个功能强大的,ASIC-style 的时序分析工具。采用工业标准-SDCsynopsys designcontraints-的约束、分析和报告方法来验证你的设计是否满足时序设计的要求。在用户的角度,从我使用TimeQuest 的经验看,它与 IC 设计中经常用到的比方 prime time,time craft 等 STA 软件是比较

2、类似的。用过 prime time 或 time craft 的朋友是非常容易上手的。在这一系列的文章里, 我将会拿一个 DAC7512 控制器的 verilog 设计作为例子,详细讲解如何使用 TimeQuest 进行时序设计和分析。二,二,TimeQuestTimeQuest 的基本操作流程的基本操作流程做为 altera FPGA 开发流程中的一个组成部分, TimeQuest 执行从验证约束到时序仿真的所有工作。 Altera推荐使用下面的流程来完成TimeQuest的操作。1. 1. 建立项目并加入相关设计文件建立项目并加入相关设计文件不管做什么事情,都需要有一个目标或者说对象。我们

3、用TimeQuest做时序分析,当然也需要一个对象,这个对象实际上就是我们的设计。所以首先是要建立一个 Quartus II 的项目,并把所有需要的设计文件都加入到项目中去。需要注意的一点是,这里的设计文件,不仅仅包含逻辑设计相关的文件,也包含已经存在的时序约束文件,当然,需要以synopsys Design Constraints(.sdc)的格式存在的。2. 2. 对项目进行预编译对项目进行预编译initial compilationinitial compilation项目建立以后, 如果从来没有对项目进行过编译的话, 就需要对项目进行预编译。 这里的预编译是对应于全编译 full co

4、mpilation 来讲的,我们可以理解为预编译是对项目进行部分的编译, 而全编译是对项目进行完整的编译。做预编译的目的是为了生成一个initial design database,然后我们可以根据这个 database 用 Timequest 采用交互的模式生成时序约束。实际上,对于小的设计,编译时间并不是很长的话,完全可以不去区分预编译和全编译,需要编译的时候,直接做全编译就可以了,做全编译的话,可以生成一个post-fit 的 database,完全可以给 TimeQuest使用。3.3. 向设计中添加时序约束向设计中添加时序约束在用 TimeQuest 做时序分析之前,必须要指定出对时

5、序的要求,也就是我们通常所说的时序约束。这些约束包括时钟,时序例外timingexceptions和输入/输出延时等。默认情况下,Quartus II 软件会给所有没有被下约束的时钟都设定为1GHz。没有任何的时序例外,也就是说所有的timing path 都按 1T 去check。所有的输入/输出的延迟都按 0 来计算。这显然不符合绝大多数设计的时序要求,所以有必要根据设计的特性,添加必要的时序约束。如上所述,时序约束主要包括三类:时钟,时序例外和输入/输出延迟。其中时钟和输入/输出延迟可以认为是在某种程度上增强时序设计的要求。而时序例外可以认为是在某种程度上降低时序设计的要求。比方说,仅仅

6、设定一个时钟的频率为100MHz 的话,这个时钟域里所有timing path 都需要能工作在 100MHz 下。这显然是增强了时序设计的要求。可是如果在这个时钟域下面,有部分timing path 是不需要做 1T 的check 的, 那么就可以通过添加时序例外来防止对这些timing path 做 1T的 check,即降低了时序设计的要求。在用 TimeQuest 做时序分析时, 如果非常熟悉设计的构架和对时序的要求,又比较熟悉 sdc 的相关命令,那么可以直接在sdc 文件里输入时序约束的命令。而通常情况下,可以利用TimeQuest GUI 提供的设定时序约束的向导添加时序约束。 不

7、过要注意的是, 用向导生成的时序约束,并不会被直接写到 sdc 文件里,所以如果要保存这些时序约束,必须在TimeQuest 用 write sdc 的命令来保存所生成的时序约束。4. 4. 执行完整的编译执行完整的编译在设定好时序约束以后, 就需要对整个设计进行完整的编译。 在编译过程中,软件会优化设计的逻辑、布局布线等来尽可能满足所有的时序约束。如果没有添加时序约束, 那么软件在编译的时候, 会按照默认的时序约束对设计进行优化,对于绝大多数的设计,都会报出来时序的问题,但因为默认的时序约束与设计本身的要求在绝大多数情况下, 都是不同的,所以这些时序的问题也并不是设计本身的问题,并没有太多的

8、参考价值,而且很多初学者也不会注意到这个问题。这样就把设计中很多潜在的时序问题给隐藏起来了,最终带来的可能就是系统运行的不稳定,甚至是完全不能运行。5. 5. 验证时序验证时序当完成编译以后, 我们就可以用 TimeQuest 来验证时序了。 在时序分析的过程中,TimeQuest 会分析设计中所有的 timing path,计算每一条timing path 的延时,检查每一条timing path 是否满足时序约束,最后按照 positive slack 或 negative slack 来报告时序分析的结果。其中negativeslack 就表示对应的 timing path 不满足时序约

9、束的要求 timing violation 。如果遇到有不满足时序要求的情况, 则可以根据对应的时序报告分析设计, 确定如何优化设计使之满足时序约束。 时序约束有任何变化的话,都需要重新编译设计。 这个反复的过程可以让我们解决设计中的时序问题。三,三,DAC7512DAC7512控制器控制器DAC7512 是一个具有三线串行接口的DAC。我们基于 FPGA 用Verilog 语言实现了一个简单的 DAC7512 的控制器。下面是控制器的结构图:DAC7512 控制器由三个模块组成,PLL 用来生成控制器所要的时钟C0 25MHz 和 C1 50MHz , 其 lock 信号用来做为控制器的异步

10、 reset。da_data 模块生成要送往 DAC7512 的数据,其中 DA_DATA 为数据,DA_DATA_EN 为数据有效信号,该模块使用 C0 时钟,整个属于 C0时钟域。 DAC7512 模块用于将 DA_DATA 转换成符合 DAC7512 接口标准的串行数据并送给 DAC7512, 要用到 C1 50MHz 和 DA_SCLK C1二分频,25MHz两个时钟。DAC7512 控制器一共有四个输入输出端口。CLK_IN 为 PLL 的基准时钟,为 25MHz。DA_DIN,DA_SCLK 和 DA_SYNC 为三线串口,都为输出端口。由于 C0,C1 是由同一个 PLL 输出的

11、,DA_SCLK 是由 C1 经二分频得到的,三者之间是同步的,处于同一个clock group 中。DAC7512 模块的详细设计资料可参照本博客中 “FPGA 设计中DAC7512 控制的 Verilog 实现” 的文章。不过要注意一点的是,在串行总线上, DA_DIN 是在 DA_SCLK 的下降沿有效的。 把 DA_DIN 设计为C1 时钟域的信号,并控制其值只在DA_SCLK 为高电平的时候发生变化。 这样可以把 DA_DIN 与 DA_SCLK 之间的时序要求转换为 DA_DIN在 C1 时钟域的时序要求,细节我们会在下面介绍。四,用四,用TimeQuestTimeQuest 对对

12、 DAC7512DAC7512 控制器进行时序分析控制器进行时序分析在对某个对象下时序约束的时候,首先要能正确识别它,TimeQuest会对设计中各组成部分根据属性进行归类,我们在下时序约束的时候,可以通过命令查找对应类别的某个对象。TimeQuest对设计中各组成部分的归类主要有cells, pins, nets和ports几种。寄存器,门电路等为 cells;设计的输入输出端口为 ports;寄存器,门电路等的输入输出引脚为pins;ports 和 pins 之间的连线为 nets。具体可以参照下列图此图出自Altera Time Quest 的使用说明。下面我们按照本文第二部分用 Tim

13、eQuest 做时序分析的基本操作流程所描述的流程对 DAC7512 控制器进行时序分析。建立和预编译项目的部分相对简单,涉及到的也只是QuartusII 的一些基本操作,这里我们就不再做具体的表达。主要介绍如何向项目中添加时序约束和如何进行时序验证。首先建立一个名称与项目top 层名字一致的 sdc 文件,然后按照下面的步骤添加时序约束。1. 创建时钟添加时序约束的第一步就是创建时钟。 为了确保STA结果的准确性,必须定义设计中所有的时钟,并指定时钟所有相关参数。TimeQuest 支持下面的时钟类型:a) 基准时钟Base clocksb) 虚拟时钟Virtual clocksc) 多频率

14、时钟Multifrequency clocksd) 生成时钟Generated clocks我们在添加时序约束的时候, 首先创建时钟的原因是后面其它的时序约束都要参考相关的时钟的。基准时钟:基准时钟是输入到 FPGA 中的原始输入时钟。 与 PLLs 输出的时钟不同,基准时钟一般是由片外晶振产生的。定义基准时钟的原因是其他生成时钟和时序约束通常都以基准时钟为参照。很明显,在 DAC7512 控制器中,CLK_IN 是基准时钟。我们用下面的命令来创建这个基准时钟:create_clock -name CLK_IN -period 40 -waveform 0 20 get_portsCLK_IN

15、其中,create_clock 是创建时钟的命令,后面是命令的各种选项。其中-name CLK_IN 选项给出了时钟的名字,即 CLK_IN。-period 40 给出了时钟的周期, 即 40ns。 -waveform 0 20给出了时钟的占空比, 即 50/50。最后的get_ports CLK_IN 是嵌套的 tcl 命令, 给出了 CLK_IN 对应的port,实际上也就是 CLK_IN 的输入引脚。在sdc文件里添加上述命令后, 在quartusII里编译设计, 然后通过tools TimeQuest Time Aanlyzer命令打开TimeQuest。 在 TimeQuest的 T

16、asks窗口,找到 Report Clocks,双击之,TimeQuest 就会在右边主窗口给出设计中已成功添加的时钟信息。如下列图所示,可以看到CLK_IN,其类型为基准时钟,周期为 40ns,频率为 25MHz,targets 项为 CLK_IN,即表示这个时钟是连接在 CLK_IN 端口上的。这说明上面 create_clock的命令已经在设计中正确创建了时钟CLK_IN。实际上对于 create_clock 命令,我们可以通过 quartus II 的帮助系统/current/,查找它的语法。在 QuartusII 的帮助里,可以查找到:SyntaxSyntaxc create_clo

17、ckreate_clock -h | -help -long_help -add-name-period -waveform 另外, 帮助系统里有很详尽的关于该命令的描述, 并且给出了各种使用的范例。 不仅仅是这一个命令, 所有的命令都可以在帮助系统里找到。如果看到一个陌生的命令,或者不知道命令该如何使用,那么最好的方法就是在帮助系统里查找该命令。PLLPLL 时钟:时钟:上面我们创建了基准时钟。下面我们创建PLL 输出的时钟。在 Altera 的 FPGA 中, PLL 电路是通过 ALTPLL 的 IP 库被添加到设计中的。下列图是一个典型的ALTPLL 的结构图。从图上可以看到, 当我们

18、选定了基准时钟和 PLL 的参数以后, PLL的输出 c0 和 c1 的参数就随之确定了。 所以在 QuartusII 环境下, 可以通过一个简单的命令让软件自动生成PLL 输出的时钟的时序约束。derive_pll_clocks这个命令会自动创建PLL输出的C0和C1的相关时序约束。 同样的,在 sdc 文件里添加该命令,然后编译,在 TimeQuest 里查看时钟信息。如下列图所示,derive_pll_clocks 在系统里添加了两个时钟,PLL1|altpll_component|auto_generated|pll1|clk0和PLL1|altpll_component|auto_g

19、enerated|pll1|clk1。可以看出,时钟是按“PLL 层次结构+时钟端口名字”的规则命名的。时钟的类型为createdclock, 周期频率是在 PLL 里设定好的。 duty_cycle 为 50/50。 Clock source为 PLL1|altpll_component|auto_generated|pll1|inclk0, 实际上就是我们之前定义的 CLK_IN。用 derive_pll_clocks 命令创建 PLL 相关的时钟很是方便,但不好的地方就是,时钟的命名太过复杂, 我们在添加与此时钟相关的时序约束时,就必须用这种名字很长的时钟,容易出错,且可读性也差。所以建

20、议还是采用 create_generated_clock 命令来创建 PLL 的时钟。create_generated_clock 命令的语法如下,可以从quartusII 的帮助系统里找到每个参数的详细解释。SyntaxSyntaxc create_generated_clockreate_generated_clock -h | -help -long_help-add -divide_by -duty_cycle -edge_shift-edges -invert-master_clock -multiply_by -name -offset-phase -source 可以用下面的命令

21、来创建 PLL 的两个时钟 C0 和 C1。 我们把时钟命名为 CLK25M 和 CLK50M,source clock 为 CLK_IN。create_generated_clock -name CLK25M -source CLK_IN -duty_cycle50.000 -multiply_by 1 -master_clock CLK_IN get_pinsPLL1|altpll_component|auto_generated|pll1|clk0create_generated_clock -name CLK50M -source CLK_IN -duty_cycle50.000 -m

22、ultiply_by 2 -master_clock CLK_IN get_pinsPLL1|altpll_component|auto_generated|pll1|clk1用这两个命令创建的时钟与 derive_pll_clocks 命令创建的时钟的本质是一样的,只是给时钟定义了不同的名字。当然我们也可以用derive_pll_clocks 中对时钟的命名方式来使用 create_generated_clock 命令。同样的, 可以按照上面的方法, 在 TimeQuest 里查看创建时钟的结果,如下列图所示。到此为止,我们创建了 PLL 的基准时钟以及 PLL 输出的两个时钟CLK25M

23、和 CLK50M。DA_SCLKDA_SCLK时钟:时钟:在 TimeQuest 的 Tasks 窗口里,选择 Report Unconstrained Paths 命令,TimeQuest 会报告出所有需要下约束但实际并没有约束的情况。在Report 里的 Unconstrained Path 列表下,我们可以查看这个报告。双击Clock Status Summary, 就可以在主窗口看到所有时钟的情况。 见下列图,很明显,软件辨识出 DAC7512 模块下的 DA_SCLK 为时钟信号,但是我们并没有对该时钟添加约束,所以用红色将这个时钟显示了出来。下一步我们就来创建这个时钟。DA_SCL

24、K 是用 CLK50M 通过二分频电路得到的。所以其sourceclock 为 CLK50M。但是,我们在使用 create_generated_clock 命令创建该时钟的时候,在-source 的参数里,却不能直接使用 CLK50M,而必须使用 CLK50M 所对应的 pin,即PLL1|altpll_component|auto_generated|pll1|clk1。 这主要是因为-source参数只支持 pins,ports 和 registers。DA_SCLK 是由 CLK50M 通过二分频电路生成的,其代码如下:reg DA_SCLK;always (posedge CLK50

25、M or negedge RESET)beginif(RESET)DA_SCLK = 1b0;elseDA_SCLK = DA_SCLK;end可以看到,本质上 DA_SCLK 为一个寄存器的输出,所以使用get_registers 命令获取 DA_SCLK。 DA_SCLK 是由 CLK50M 经二分频电路生成的,所以-divide_by 的参数应该是 2。综上所述,用下面的命令创建DA_SCLK:create_generated_clock -name DA_SCLK -divide_by 2 -source get_pinsPLL1|altpll_component|auto_gener

26、ated|pll1|clk1 get_registersDAC7512:DAC7512|DA_SCLK 到此为止,DAC7512 控制器中所有 4 个时钟都创建好了。如下列图所示:我们再看TimeQuest中Unconstrained Paths中clock Status Summary,就会发现,所有的时钟都已经被添加了约束。用 Quartus II Timequest Timing Analyzer进行时序分析 :实例讲解 (三)(2012-06-26 10:28:46)转载标签:杂谈上面已经把 DAC7512 控制器中所有的时钟都创建好了。下面我们再额外讨论一下关于时钟属性方面的一些问题

27、和在做时序分析时的处理方法。对于具有单一时钟的系统,设计和时序分析都相对简单。但是现在很多设计都有多个甚至几十个时钟乃至更多的时钟。比方说DAC7512控制器,在设计中用到的时钟实际上是有3 个,CLK25M,CLK50M 和DA_SCLK。在对多时钟设计进行时序分析的时候,我们首先要搞清楚各时钟之间的关系。当设计中有多个时钟时, 时钟之间可能存在三种关系, 分别是同步,异步和互斥。如果两个或者多个时钟具有相同的source 和固定的相位差,那么这些时钟是同步时钟。在 DAC7512 的控制器里,CLK25M,CLK50M 和DA_SCLK 的 source 都是 CLK_IN,所以可以认为他

28、们三个是同步的。如果两个或者多个时钟之间没有任何关系,则称之为异步时钟。比方说 CLKA 来源于晶振 A,而 CLKB 来源于其他系统的输入,CLKA和 CLKB 就为异步时钟。 对于异步时钟来讲, 两个时钟域的时钟沿有可能在任意时刻出现,相互之间不会有任何关系。 如果一条 timing path 的起始点是在 CLKA,而终点在CLKB,即这条timing path 跨越了 CLKA和CLKB两个时钟域, 那么STA软件是不会对该timing path做分析的。实际上这等同于在这两个时钟之间设定了一条false path。如果两个时钟不会相互作用,那么称这两个时钟为互斥的。举个例子来讲,PC

29、IE GEN2 可以工作在 GEN1 和 GEN2 两种模式,在 GEN1模式下,时钟为 125MHz,在 GEN2 的模式下,时钟为 250MHz,但在某一个特定时间里,时钟只可能为125MHz 或者 250MHz,这两个频率的时钟不会共存,相互之间也不会有相互作用。下列图给出了时钟的三种关系的例子。做时序分析时,在创建好所有的时钟后,需要定义这些时钟之间的关系。我们可以把同步时钟放到一个group 中,然后在定义时钟之间的关系时,可以使用 group 来定义。在默认情况下,TimeQuest 认为设计中所有的时钟都是同步的,并把所有的时钟都放在同一个group 里。如果设计中有异步时钟,就

30、需要用命令把异步时钟分组并定义出来。在 TimeQuest 里,我们用 set_clock_groups 来定义时钟的 group。下面是命令的语法,更详细的说明请参照quartusII 的帮助系统。SyntaxSyntaxs set_clock_groupset_clock_groups -h | -help -long_help-asynchronous -exclusive-group -logically_exclusive-physically_exclusive在 DAC7512 控制器里, CLK25M,CLK50M 和 DA_SCLK 三个时钟是同步时钟。默认情况下,它们已经被

31、软件放到了同一个group 里,所以我们不需要对其做任何的处理。但假设 CLK25M 属于一个 group,而 CLK50M 和 DA_SCLK 属于另外一个 group,我们就要用 set_clock_groups 命令把二者设为异步时钟,命令如下:set_clock_groups -asynchronous -group CLK25M -group CLK50MDA_SCLK我们比照一下把 CLK25M 设定为 CLK50M 的异步时钟前后TimeQuest 对时序分析的处理情况来看这个命令的作用。下面是在添加这个命令前后 TimeQuest 中 Report clock transfer

32、 的结果。在没有添加这个命令前,软件默认三个时钟都是同步时钟,所以会分析并报告出三个时钟之间所有的 timing path。在添加这个命令以后,软件认为 CLK25M 和 CLK50M/DA_SCLK是异步时钟,所以就直接将 CLK25M 和 CLK50M/DA_SCLK 之间的timing path 设为 false path。不再做更多的分析。那如果我们假设 CLK25M 和 CLK50M 是互斥时钟的话, 又会是什么情况呢?用下面的命令将 CLK25M 和 CLK50M 设为互斥时钟:set_clock_groups -exclusive -group CLK25M -group CLK

33、50M还是看 TimeQuest 中 Report clock transfer 的结果,可以发现CLK25M 和 CLK50M 之间的 timing path 都被设定为 false path 了。再看一下关于 Clock uncertainty 的知识简单的说,Clock uncertainty 是指时钟边沿实际到达时间与理论到达时间之间的差异和变化。在做时序分析的时候,是需要加上clockuncertainty 来计算 timing path 的延时的。 Clock uncertainty 的大小是比较难确定的,在ASIC 设计中,clock uncertainty 的值往往要根据所使用

34、的工艺,以往项目的经验等各种因素来决定。但在FPGA 的设计中,我们能参考的资料不多,特别是对于PLL 输出的时钟,因为我们对 PLL 本身的参数并不是非常的了解,所以很难给出合适的clock uncertainty 的值。在 FPGA 设计中定义 PLL 的时候,我们要定义参考时钟的精度,这会直接影响到 PLL 输出时钟的 clock uncertainty 的值。如下列图所示,即为输入基准时钟的精度。有了输入时钟的精度,TimeQuest 会根据 PLL 本身的属性,自动计算出各输出时钟的 uncertainty 值。如果要在设计中由软件加入clockuncertainty 的值,可以使用下面的命令:derive_clock_uncertainty除非你对系统的时钟有充分的理解并确切知道时钟的属性,否则不建议使用 set_clock_uncertainty 命令直接定义 FPGA 中各时钟的uncertainty 属性。推荐使用 derive_clock_uncertainty 命令由软件自动计算并添加。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com