时序约束实例_第1页
时序约束实例_第2页
时序约束实例_第3页
时序约束实例_第4页
时序约束实例_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、用QuartusIITimequestTimingAnalyzer进行时序分析:实例讲解(一)(2012-06-2110:25:54)转载标签:杂谈一,概述用Altera的话来讲,timequesttiminganalyzer是一个功能强大的,ASIC-style的时序分析工具。采用工业标准-SDC(synopsysdesigncontraints)-的约束、分析和报告方法来验证你的设计是否满足时序设计的要求。在用户的角度,从我使用TimeQuest的经验看,它与IC设计中经常用到的比如primetime,timecraft等STA软件是比较类似的。用过primetime或timecraft的

2、朋友是非常容易上手的。在这一系列的文章里,我将会拿一个DAC7512控制器的verilog设计作为例子,详细讲解如何使用TimeQuest进行时序设计和分析。二,TimeQuest的基本操作流程做为alteraFPGA开发流程中的一个组成部分,TimeQuest执行从验证约束到时序仿真的所有工作。Altera推荐使用下面的流程来完成TimeQuest的操作。CreateQuirtusIIProjectvdSpecifyDmiFiesPerformInttalGomptladonSpeolyTrnngP«q加meritsPe?rmCumpiKMVerfyTiming1 .建立项目并加入

3、相关设计文件不管做什么事情,都需要有一个目标或者说对象。我们用TimeQuest做时序分析,当然也需要一个对象,这个对象实际上就是我们的设计。所以首先是要建立一个QuartusII的项目,并把所有需要的设计文件都加入到项目中去。需要注意的一点是,这里的设计文件,不仅仅包含逻辑设计相关的文件,也包含已经存在的时序约束文件,当然,需要以synopsysDesignConstraints(.sdc的格式存在的。2 .对项目进行预编译(initialcompilation)项目建立以后,如果从来没有对项目进行过编译的话,就需要对项目进行预编译。这里的预编译是对应于全编译(fullcompilation

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

5、timingexceptions;)和输入/输出延时等。默认情况下,QuartusII软件会给所有没有被下约束的时钟都设定为1GHz。没有任何的时序例外,也就是说所有的timingpath都按1T去check。所有白输入/输出的延迟都按0来计算。这显然不符合绝大多数设计的时序要求,所以有必要根据设计的特性,添加必要的时序约束。如上所述,时序约束主要包括三类:时钟,时序例外和输入/输出延迟。其中时钟和输入/俞出延迟可以认为是在某种程度上增强时序设计的要求。而时序例外可以认为是在某种程度上降低时序设计的要求。比如说,仅仅设定一个时钟的频率为100MHz的话,这个时钟域里所有timingpath都需

6、要能工作在100MHz下。这显然是增强了时序设计的要求。可是如果在这个时钟域下面,有部分timingpath是不需要做1T的check的,那么就可以通过添加时序例外来避免对这些timingpath做1T的check,即降低了时序设计的要求。在用TimeQuest做时序分析时,如果非常熟悉设计的构架和对时序的要求,又比较熟悉sdc的相关命令,那么可以直接在sdc文件里输入时序约束的命令。而通常情况下,可以利用TimeQuestGUI提供的设定时序约束的向导添加时序约束。不过要注意的是,用向导生成的时序约束,并不会被直接写到sdc文件里,所以如果要保存这些时序约束,必须在TimeQuest用wri

7、tesdc的命令来保存所生成的时序约束。4 .执行完整的编译在设定好时序约束以后,就需要对整个设计进行完整的编译。在编译过程中,软件会优化设计的逻辑、布局布线等来尽可能满足所有的时序约束。如果没有添加时序约束,那么软件在编译的时候,会按照默认的时序约束对设计进行优化,对于绝大多数的设计,都会报出来时序的问题,但因为默认的时序约束与设计本身的要求在绝大多数情况下,都是不同的,所以这些时序的问题也并不是设计本身的问题,并没有太多的参考价值,而且很多初学者也不会注意到这个问题。这样就把设计中很多潜在的时序问题给隐藏起来了,最终带来的可能就是系统运行的不稳定,甚至是完全不能运行。5 .验证时序当完成编

8、译以后,我们就可以用TimeQuest来验证时序了。在时序分析的过程中,TimeQuest会分析设计中所有的timingpath,计算每一条timingpath的延时,检查每一条timingpath是否满足时序约束,最后按照positiveslack或negativeslack来报告时序分析的结果。其中negativeslack就表示对应的timingpath不满足时序约束的要求(timingviolation)。如果遇到有不满足时序要求的情况,则可以根据对应的时序报告分析设计,确定如何优化设计使之满足时序约束。时序约束有任何变化的话,都需要重新编译设计。这个反复的过程可以让我们解决设计中的时

9、序问题。三,DAC7512控制器DAC7512是一个具有三线串行接口的DAC。我们基于FPGA用Verilog语言实现了一个简单的DAC7512的控制器。下面是控制器的结构图:DAC7512控制器由三个模块组成,PLL用来生成控制器所要的时钟C0(25MHz)和C1(50MHz),其lock信号用来做为控制器的异步reset。da_data模块生成要送往DAC7512的数据,其中DA_DATA为数据,DA_DATA_EN为数据有效信号,该模块使用C0时钟,整个属于C0时钟域。DAC7512模块用于将DA_DATA转换成符合DAC7512接口标准的串行数据并送给DAC7512,要用至(JC1(5

10、0MHz)和DA_SCLK(C1二分频,25MHz)两个时钟。DAC7512控制器一共有四个输入输出端口。CLK_IN为PLL的基准时钟,为25MHz。DA_DIN,DA_SCLK和DA_SYNC为三线串口,者B为输出端口。由于C0,C1是由同一个PLL输出的,DA_SCLK是由C1经二分频得到的,三者之间是同步的,处于同一个clockgroup中。DAC7512模块的详细设计资料可参照本博客中“FPGAS计中DAC7512控制的Verilog实现”的文章。不过要注意一点的是,在串行总线上,DA_DIN是在DA_SCLK的下降沿有效的。把DA_DIN设计为C1时钟域的信号,并控制其值只在DA_

11、SCLK为高电平的时候发生变化。这样可以把DA_DIN与DA_SCLK之间的时序要求转换为DA_DIN在C1时钟域的时序要求,细节我们会在下面介绍。四,用TimeQuest对DAC7512控制器进行时序分析在对某个对象下时序约束的时候,首先要能正确识别它,TimeQuest会对设计中各组成部分根据属性进行归类,我们在下时序约束的时候,可以通过命令查找对应类别的某个对象。TimeQuest对设计中各组成部分的归类主要有cells,pins,nets和ports几种。寄存器,门电路等为cells;设计的输入输出端口为ports;寄存器,门电路等的输入输出引脚为pins;ports和pins之间的连

12、线为nets。具体可以参照下图(此图出自AlteraTimeQuest的使用说明)。下面我们按照本文第二部分用TimeQuest做时序分析的基本操作流程所描述的流程对DAC7512控制器进行时序分析。建立和预编译项目的部分相又t简单,涉及到的也只是QuartusII的一些基本操作,这里我们就不再做具体的叙述。主要介绍如何向项目中添加时序约束和如何进行时序验证。首先建立一个名称与项目top层名字一致的sdc文件,然后按照下面的步骤添加时序约束。1.创建时钟添加时序约束的第一步就是创建时钟。为了确保STA结果的准确性,必须定义设计中所有的时钟,并指定时钟所有相关参数。TimeQuest支持下面的时

13、钟类型:a)基准时钟(Baseclocks)b)虚拟时钟(Virtualclocks)c)多频率时钟(Multifrequencyclocks)d)生成时钟(Generatedclock'我们在添加时序约束的时候,首先创建时钟的原因是后面其它的时序约束都要参考相关的时钟的。基准时钟:基准时钟是输入到FPGA中的原始输入时钟。与PLLs输出的时钟不同,基准时钟一般是由片外晶振产生的。定义基准时钟的原因是其他生成时钟和时序约束通常都以基准时钟为参照。很明显,在DAC7512控制器中,CLK_IN是基准时钟。我们用下面的命令来创建这个基准时钟:create_clock-nameCLK_IN-

14、period40-waveform020get_portsCLK_N一一其中,create_clock是仓ij建时钟的命令,后面是命令的各种选项。其中-nameCLK_IN选项给出了时钟的名字,即CLK_IN。-period40给出了时钟的周期,即40ns。-waveform020给出了时钟的占空比,即50/50最后的get_portsCLK_IN是嵌套的tcl命令,给出了CLK_IN对应的port,实际上也就是CLK_IN的输入引脚。在sdc文件里添加上述命令后,在quartusII里编译设计,然后通过,TimeQuestTimeAanlyzer命令才T开TimeQuest。在TimeQue

15、st的窗口,找到ReportClocks,双击之,TimeQuest就会在右边主窗口给出设计中已成功添加的时钟信息。如下图所示,可以看到CLK_IN,其类型为基准时钟,周期为40ns,频率为25MHz,targets项为CLK_IN,即表示这个时钟是连接在CLK_IN端口上的。这说明上面create_clock的命令已经在设计中正确创建了时钟CLK_IN。I二一ii4sLwe三二二JI实际上对于create_clock命令,我们可以通过quartusII的帮助系统(Syntaxcreate_clock-h|-help-long_help-add-name<clock_name>-p

16、eriod<value>-waveform<edge_list><targets>另外,帮助系统里有很详尽的关于该命令的描述,并且给出了各种使用的范例。不仅仅是这一个命令,所有的命令都可以在帮助系统里找到。如果看到一个陌生的命令,或者不知道命令该如何使用,那么最好的办法就是在帮助系统里查找该命令。PLL时钟:上面我们创建了基准时钟。下面我们创建PLL输出的时钟。在Altera的FPGA中,PLL电路是通过ALTPLL的IP库被添加到设dkl.计中的。下图是一个典型的ALTPLL的结构图。indkOfrequency:100000MHzOperaaonMode

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

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

19、enerated_cloc腌令来创建PLL的时钟。create_generated_cloc喻令的语法如下,可以从quartusII的帮助系统里找到每个参数的详细解释。Syntaxcreate_generated_clock-h|-help-long_help-add-divide_by<factor>-duty_cycle<percent>-edge_shift<shift_list>-edges<edge_list>-invert-master_clock<clock>-multiply_by<factor>-name

20、<clock_name>-offset<time>-phase<degrees>-source<clock_source><targets>可以用下面的命令来创建PLL的两个时钟C0和C1。我们把时钟命名为CLK25M和CLK50M,sourceclock为CLK_IN。create_generated_clock-nameCLK25M-sourceCLK_IN-duty_cycle50.000-multiply_by1-master_clockCLK_INget_pinsPLL1|altpll_component|auto_gene

21、rated|pll1|clk0create_generated_clock-nameCLK50M-sourceCLK_IN-duty_cycle50.000-multiply_by2-master_clockCLK_INget_pinsPLL1|altpll_component|auto_generated|pll1|clk1用这两个命令创建的时钟与derive_pll_clocks命令创建的时钟的本质是一样的,只是给时钟定义了不同的名字。当然我们也可以用derive_pll_clocks中对时钟的命名方式来使用create_generated_cloc腌令。同样的,可以按照上面的方法,在Ti

22、meQuest里查看创建时钟的结果,如下图所示。到此为止,我们创建了PLL的基准时钟以及PLL输出的两个时钟CLK25M和CLK50M。在TimeQuest的Tasks窗口里,选择ReportUnconstrainedPathsp令,TimeQuest会报告出所有需要下约束但实际并没有约束的情况。在Report里的UnconstrainedPath列表下,我们可以查看这个报告。双击ClockStatusSummary,就可以在主窗口看到所有时钟的情况。见下图,很明显,软件辨识出DAC7512模块下的DA_SCLK为时钟信号,但是我们并没有对该时钟添加约束,所以用红色将这个时钟显示了出来。下一步

23、我们就来创建这个时钟。V*11M-1>IOC"FJhRK,<HuriLUHMviSMTloriHOIIiiKL.KTI«irMtiTUErt“M/ran.«»TmAnUKO.rPol»PMWIfl-lfU11414Hriill4A4|IfWlrUMl-UHIHlTWrtmrtfri-jw*rifUCtEairf1rFhBrnn%ririwa*112slDA_SCLK是用CLK50M通过二分频电路得到的。所以其sourceclock为CLK50M。但是,我们在使用create_generated_cloc婿令创建该时钟的时候,在-so

24、urce的参数里,却不能直接使用CLK50M,而必须使用CLK50M所对应的pin,即PLL1|altpll_component|auto_generated|pll1|clk1。这主要是因为-source参数只支持pins,ports和registersDA_SCLK是由CLK50M通过二分频电路生成的,其代码如下:regDA_SCLK;always(posedgeCLK50MornegedgeRESET)beginif(RESET)DA_SCLK<=1'b0;elseDA_SCLK<=DA_SCLK;end可以看到,本质上DA_SCLK为一个寄存器的输出,所以使用get

25、_registers命令获取DA_SCLK°DA_SCLK是由CLK50M经二分频电路生成的,所以-divide_by的参数应该是2。综上所述,用下面的命令创建DA_SCLK:create_generated_clock-nameDA_SCLK-divide_by2-sourceget_pinsPLL1|altpll_component|auto_generated|pll1|clk1get_registersDAC7512:DAC7512|DA_SCLK一到此为止,DAC7512控制器中所有4个时钟都创建好了。如下图所示:我们再看TimeQuest中UnconstrainedPat

26、hs中clockStatusSummary,就会发现,所有的时钟都已经被添加了约束。用QuartusIITimequestTimingAnalyzer进行时序分析:实例讲解(2012-06-2610:28:46)转载标签:杂谈上面已经把DAC7512控制器中所有的时钟都创建好了。下面我们再额外讨论一下关于时钟属性方面的一些问题和在做时序分析时的处理方法。对于具有单一时钟的系统,设计和时序分析都相对简单。但是现在很多设计都有多个甚至几十个时钟乃至更多的时钟。比如说DAC7512控制器,在设计中用到的时钟实际上是有3个,CLK25M,CLK50M和DA_SCLK。在对多时钟设计进行时序分析的时候,

27、我们首先要搞清楚各时钟之间的关系。当设计中有多个时钟时,时钟之间可能存在三种关系,分别是同步,异步和互斥。如果两个或者多个时钟具有相同的source和固定的相位差,那么这些时钟是同步时钟。在DAC7512的控制器里,CLK25M,CLK50M和DA_SCLK的source都是CLK_IN,所以可以认为他们三个是同步的。如果两个或者多个时钟之间没有任何关系,则称之为异步时钟。比如说CLKA来源于晶振A,而CLKB来源于其他系统的输入,CLKA和CLKB就为异步时钟。对于异步时钟来讲,两个时钟域的时钟沿有可能在任意时刻出现,相互之间不会有任何关系。如果一条timingpath的起始点是在CLKA,

28、而终点在CLKB,即这条timingpath跨越了CLKA和CLKB两个时钟域,那么STA软件是不会对该timingpath做分析的。实际上这等同于在这两个时钟之间设定了一条falsepath。如果两个时钟不会相互作用,那么称这两个时钟为互斥的。举个例子来讲,PCIEGEN2可以工作在GEN1和GEN2两种模式,在GEN1模式下,时钟为125MHz,在GEN2的模式下,时钟为250MHz,但在某一个特定时间里,时钟只可能为125MHz或者250MHz,这两个频率的时钟不会共存,相互之间也不会有相互作用。下图给出了时钟的三种关系的例子。On-ctvpOMHMqT+飞软异步时钟CK1W-q'

29、;CK2w>-i,互斥时钟血做时序分析时,在创建好所有的时钟后,需要定义这些时钟之间的关系。我们可以把同步时钟放到一个group中,然后在定义时钟之间的关系时,可以使用group来定义。在默认情况下,TimeQuest认为设计中所有的时钟都是同步的,并把所有的时钟都放在同一个group里。如果设计中有异步时钟,就需要用命令把异步时钟分组并定义出来。在TimeQuest里,我们用set_clock_groups来定义时钟的group。下面是命令的语法,更详细的说明请参照quartusll的帮助系统。Syntaxset_clock_groups-h|-help-long_help-async

30、hronous-exclusive-group<names>-logically_exclusive-physically_exclusive在DAC7512控制器里,CLK25M,CLK50M和DA_SCLK三个时钟是同步时钟。默认情况下,它们已经被软件放到了同一个group里,所以我们不需要对其做任何的处理。但假设CLK25M属于一个group,而CLK50M和DA_SCLK属于另外一个group,我们就要用set_clock_groups命令把二者设为异步时钟,命令如下:set_clock_groups-asynchronous-groupCLK25M-groupCLK50M

31、da_sclK我们对比一下把CLK25M设定为CLK50M的异步时钟前后TimeQuest对时序分析的处理情况来看这个命令的作用。下面是在添加这个命令前后TimeQuest中Reportclocktransfer的结果。在没有添加这个命令前,软件默认三个时钟都是同步时钟,所以会分析并报告出三个时钟之间所有的timingpathReport-1TcmfQwntIwryU国孙HrIrtt,ClockItanJMiFurtdTroWtrs!SrtkipI«13曰SlwtOJV*gwCLK'XJrtDASC1Kme洌CLK30MCU.GKQJ&QMCimOMOJC5CMSOX

32、OXOJI_5C1JCNRM5*1ggUMedpdh*onhrjeumWfordoA-dsAfjfewpJBtiandnetbMtdtJk«pMhkjAduJpith(CurtlffWEbwHOwiitporiEupda匕。timingnet*istorivinciCiocunrtreportclocktransferspanelnan*clockTranaters-_IF在添加这个命令以后,软件认为CLK25M和CLK50M/DA_SCLK是异步时钟,所以就直接将CLK25M和CLK50M/DA_SCLK之间的timingpath设为falsepath。不再做更多的分析。甘*BTWnHjutMTinnaAnrfywrS*QMapqMWTtwg5$K*Ut*Ckx>txdfnCTSrt甲TtVKhts曰Holdhan4fgFromQodtToQAdlRRPWhiOJG5MCLKHM2tij

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论