




已阅读5页,还剩38页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
JAQLEUNGTimeQuest用户手册原文:TimeQuest User Guide(By: Ryan Scoville)秋哥小刀2017/5/11本译文包括原文的大部分内容,由于翻译水平有限,建议在阅读本译文后能够研读原文。目录第一章 译文说明1第二章 入门21.片内时序22.I/O 时序93.时序分析结果17第三章 时序分析基础191.Setup、Hold、Recoverry和Removal概念基础192.默认时序关系233.多周期304.最大和最小延时305.Recovery和Removal30第四章 SDC约束30第五章 TimeQuest界面31第六章 时序模型31第七章 Quartus II与时序约束31第八章 SDC与分析脚本的TCL语法31第九章 常用结构与电路31第十章 实例31第十一章 杂谈31第一章 译文说明在翻译过程中,很多专业术语使用直译的方式往往不易理解,但选择的中文词汇又怕引起歧异,所以在这里罗列了这些词汇的准确英文拼写。在阅读过程中,若是出现难以理解的语句,请首先对照相关词汇的英文词组以读者的思维重新理解,或是直接阅读英文原文的相关章节。第二章 入门本章的编写目的是为了让用户可以更快速地上手操作时序约束。以下内容将涉及到多个主题,以帮助用户快速理解和应用时序约束技术,关于这些主题的详细内容将在后续章节中讲解。建议所有用户通读本章并确认已完全理解本章内容。本章的最后一节为时序分析结果,理解时序分析结果是进行时序约束不可或缺的一部分。如果不能读懂时序分析报告,将不具备对片上时序和I/O时序约束的能力。所以,推荐在本章学习过程中能够始终结合时序分析结果进行阅读。1. 片内时序编译项目成功并启动TimeQuest,然后就可以输入时序约束命令了。如果项目中尚未添加SDC文件,可通过菜单File-New来新建一个.sdc文件。SDC文件推荐使用项目名称进行存储,且通常存储在项目文件夹中。几乎每个.sdc文件都是以下面4条命令开始:1) create_clock2) derive_pll_clocks3) derive_clock_uncertainty4) set_clock_groups其中,前3条命令可以让用户在几分钟内分析完设计中的大部分时序问题。当我们学习这些命令的过程中,一定要搭配阅读迭代方法。迭代方法章节会讲述如何快速修改一个.sdc文件、如何重新运行分析、如何进行迭代分析。关于这4条命令的详细信息,可以在TimeQuest中输入-long_help进行查看:create_clock long_helpderive_pll_clocks long_helpderive_clock_uncertainty long_helpset_clock_groups long_help1) create_clock新建一个.sdc文件后,首先要做的就是使用create_clock命令对输入FPGA的时钟进行约束。该命令的基本语法为:create_clock name sys_clk period 8.0 get_ports fpga_clk注:n 上述命令创建了一个名为sys_clk的时钟,这个时钟具有8ns的时钟周期,且这个时钟被应用到了设计端口fpga_clk上。n TCL和SDC语法是大小写敏感的,所以要保证fpga_clk与设计中时序端口的名称大小写一致。n 如果未作说明,sys_clk时钟默认在0ns时具有上升沿,4ns时具有下降沿,即默认为50%占空比。如果用户需要一个不同的占空比或者需要一个移相,请使用-waveform选项。但是实际设计中很少会有这种必要。n 用户通常会创建一个与所应用端口名称一致的时钟,这是完全合法的。上述例句可改写为:create_clock name fpga_clk period 8.0 get_ports fpga_clk现在将有两个独立的个体被叫做fpga_clk:一个是用户设计的端口,一个是源自该端口的时钟。n 在TCL语法中,方括号会执行其内部的语句(关于语法,会在TCL语法章节有更多的讨论)。所以get_ports fpga_clk会在设计的所有端口中查找匹配fpga_clk的端口并返回。更多的设计者习惯像下面这样以更简洁的方式编写上述语句:create_clock name sys_clk period 8.0 fpga_clkn 用这条命令为每一个已知的输入时钟端口创建时钟约束。(如果用户不确信是否已为所有输入时钟创建了约束,只需先约束暂时已知的,剩下的可以在Report Uncontrained Paths中查看到。)提示:用户可以直接在SDC文件中直接输入约束命令,也可以使用可视化图形界面来添加约束。启动TimeQuest后,用TimeQuest或Quartus II打开.sdc文件,从菜单Edit-Insert Constraint添加约束:千万不要像下图这样从TimeQuest窗口的Constraints下拉菜单来添加约束:虽然两种操作很像,但是后者是直接将约束应用到时序数据库,而不是添加到.sdc文件。高级设计人员可能有时需要使用后者,但对初学者来说,请务必使用前者:通过操作.sdc文件来控制时序约束。2) derive_pll_clocks添加下面的命令到你的.sdc文件:derive_pll_clocks注:n PLL的所有输出都需要使用create_generated_clock进行约束。n 用户创建PLL的过程中要配置其输出,所以PLL创建完毕后TimeQuest有足够的信息来自动约束其输出时钟。而这就是derive_pll_clocks所要做的。n 这条命令还会执行其他一些操作,如:约束收发器时钟,在LVDS SERDES(并行转换器)和用户逻辑之间添加倍数周期。n 如果想知道derive_pll_clocks到底做了些什么,可以在TimeQuest的消息窗口中Derive PLL Clocks下查看:n 初学者一般不喜欢使用derive_pll_clocks,更倾向于create_generated_clock(看起来更底层些,可以让理解更扎实)。从技术上这没有问题,因为二者的最终效果是一致的。但是如果用户在设计过程中修改了PLL,他们必须要记得修改.sdc文件中相应的约束条件。因此存在太多忘记修改.sdc文件,又花费大量时间去调试的例子,所以还是使用derive_pll_clocks比较靠谱。直接把PLL的约束丢给TimeQuest吧。3) derive_clock_uncertainty添加下面的命令到你的.sdc文件:derive_clock_uncertainty注:n 在65nm以下工艺水平的设计中,需要在.sdc文件中使用该命令。n 在早期工艺水平的设计中,这条语句没有任何影响,也不会做任何事。n 这条命令会计算FPGA内部时钟之间的不确定因素,像PLL抖动、时钟树抖动等。n 如果用户的.sdc文件中不包含该命令,会出现警告提示。到此,前3条命令就介绍结束了。对于一个设计文件,如果包含2路输入时钟,它的.sdc文件将如下所示:4) set_clock_groups通过上面的操作,设计中大部分或者全部的时钟都得到了约束。在TimeQuest中,除非用户特别说明,默认所有的时钟都是相关的。例如,在一个8ns时钟和10ns时钟之间有若干条路径,即使这两个时钟是完全异步的,但是对TimeQuest来说,这些路径存在2ns的建立时间关系,而且TimeQuest会以此尝试对这些路径进行约束。相比其他工具那样假设所有时钟都是不相关的,TimeQuest选择了一种更保守的分析方式:存在的就是要分析的。所以,需要用户主动告诉TimeQuest哪些时钟是不相关的,这样TimeQuest就不会去分析不相关时钟之间的路径。set_clock_groups命令的语法如下:set_clock_groups asynchronous group group group注:n 每个-group选项是一组相关时钟的列表n 对-group选项的数目没有限制。如果是通过菜单Edit-Insert输入约束,最多只支持2个分组,这是操作界面的输入限制,可通过.sdc文本编辑来扩展分组数目。n 这条命令看起来像是在给时钟分组。其实TimeQuest假定所有时钟都是相关的,默认将它们分在了一个更大的分组中。所以,这条命令其实是在切断不相关时钟间的关联。n 任何未被分组的时钟会保持与所有时钟相关。所以如果你忘记将一个时钟分组,那么它会被保守分析:TimeQuest尝试约束该时钟与其他时钟之间的异步路径。n 一个时钟不能同时存在多个分组中。n 用户可以使用多条set_clock_groups语句。n 这条命令通常会分行编写,以提高其可读性。通常“空格”意味着一行结束,继续下一行。稍后会展示该语法结构。(注意:后不能跟任何其他符号,包括空格)n 对于包括复杂时钟的设计,编写这条约束命令可能会是一个迭代的过程。比如,一个包含两个DDR3核心和高速收发器的设计至少含有30多个时钟。这种情况下,首先仅对创建的时钟进行分组,未被分组的时钟仍然与所有时钟相关。如果通过约束,不相关的时钟之间仍然有失败的路径,那么就继续向命令中添加新的时钟。仍然有很大一部分时钟不会出现在set_clock_groups命令中,因为它们已经在IP核的.sdc文件中切断关联了,或者它们只和相关的时钟之间有路径连接。n 我通常不会将用于I/O时序分析的虚拟时钟添加到此约束中。因为它们不会和片上时钟之间有路径连接,所以无须考虑它们。n set_clock_groups后面的选项可以是-asynchronous或-exclusive。-asynchronous表示时钟是都会触发,但是不能同步传递数据。-exclusive表示时钟不会同时触发,因此相互独立。一个很贴切的例子就是时钟复用器,其输出会连接到两个时钟。因为同一时刻只会有一个时钟可以触发,所以它们是相互独立的。不过,TimeQuest不会关心这两种标志,它会做同样的分析。这个选项其实是用作ASIC的时序分析中。n 切断时钟之间关联的另一种方法是使用set_false_path。比如切断sys_clk和dsp_clk之间的关联:set_false_path from get_clocks sys_clk to get_clocks dsp_clk set_false_path from get_clocks dsp_clk to sys_clk当时钟数目有限时,set_false_path用起来很方便。但是当时钟数目大量增加时,其可读性就大打折扣。在一个拥有3个多路输出PLL的简单的设计中,set_clock_groups命令可以在10行内清楚地显示哪些时钟是相关的。而set_false_path命令可能要超过50行,而且很难看出哪些时钟之间的关联是被切断的。编写set_clock_groups约束的快捷提示1) 因为derive_pll_clocks会根据设计自动创建很多时钟,而设计人员可能并不是很清楚这些时钟的确切名称。一种快速添加set_clock_groups约束的方式就是先完成上面的3条约束:为外部输入时钟添加create_clock约束;添加derive_pll_clocks约束;添加derive_clock_uncertainty约束。2) 双击TimeQuest界面左侧Task面板中的Report Clocks。软件会自动读取你的.sdc文件然后应用到设计中,进而为所有时钟出具分析报告。从报告上,选中第一列的时钟名称并拷贝,像下图所示:然后粘贴到你的.sdc文件中。3) 现在你的.sdc文件中就有了一列时钟(设计中的所有时钟),将这些时钟名称按照格式填入到set_clock_groups命令就行了。比如,我会先写出一个空的命令:Set_clock_groups asynchronous group -group -group 然后根据时钟之间的关系,将它们填入到上面的空命令中。当然,可根据实际需要增加或者删除分组。4) 最后,重新编辑一下命令的格式来增强其可读性。下图是一个.sdc文件的快照: 3 / 43你可能注意到了,我将sys_clk和the_system_pll的c0、c1输出时钟放在了一个分组,而将the_system_pll的c2输出时钟单独放在了另一个分组。这是因为c2的频率不能和其他时钟进行关联,必须被看成和其他时钟是异步的。通常情况下PLL的大多数输出都是相互关联的,所以会在同一个分组中,但这不是绝对的,取决于用户本身的设计。好了,对于很多设计来说,上面就是要对片上时序进行约束所要做的全部内容。还有一些常用的片上时序约束命令在上面没有涉及:n 在寄存器间添加倍数周期可以让时序分析以一个更低的速率进行,即:开窗。比如,一个10ns的时钟会有一个10ns的建立时间关系。如果数据以一个更低的速率在变化,或是由于时钟使能的控制导致寄存器以一个更低的速率触发,用户就想要在数据的传输路径间开辟一个窗口,一个数据传递的窗口。这个窗口会使建立时间变成时钟周期的倍数,比如20ns,40ns等等,而保持时间仍为0ns。n 倍数周期的第二种使用形式是移窗。比如,用户设计的PLL输出了一个10ns的时钟,同时还输出一个10ns并移相0.5ns的时钟。所以常规时钟到移相时钟的默认建立时间关系就是0.5ns,而保持时间关系是-9.5ns。0.5ns的建立时间,噢天哪,这几乎是不可能的。所以用户此时希望数据可以传递到下一个窗口(下一个时钟周期)。通过在常规时钟和移相时钟之间添加一个倍数周期,建立时间关系就变成了10.5ns,保持时间关系变成了0.5ns。每当用户要约束一个常规时钟和一个移相时钟之间的路径时,就要考虑到应用这种移窗操作。n 如果对关于默认建立时间和保持时间关系的讨论感到困惑,请阅读建立与保持时间基础和确定默认建立和保持时间关系。n 为脉动时钟添加create_generated_clock命令。一个寄存器的输出驱动了下一个寄存器的clk引脚,这就是一个脉动时钟。时钟一般不会通过寄存器传播,所以所有的脉动时钟都需要应用create_generated_clock来纠正对它们的时序分析。未约束的脉动时钟将在TimeQuest的Report Unconstrained Paths中罗列出来,所以很容易被分辨出来。推荐使用控制时钟使能的方式,而不是脉动时钟。n 为时钟复用器输出添加create_generated_clock命令。如果没有添加,所有经过时钟复用器的时钟都将被关联。TimeQuest会做这样一种分析:复用器前端一个时钟驱动了源寄存器,而复用器后端另一个时钟驱动了目标寄存器,反之亦然。但这往往不是设计者想要的。所以为时钟复用器输出时钟添加create_generated_clock约束,可以使它们和复用器的输入关联以纠正时钟的分组,让TimeQuest在做时序分析时,时钟复用器两端的时钟一致。2. I/O 时序(注:本章内容不涵盖源同步接口,尽管分析原则是一致的。)关于I/O时序的约束,SDC命令中只有set_input_delay和set_output_delay。刚开始可能很难理解它们执行约束的原理。这时要树立一个观念:这2条约束是为了描述FPGA外部的时序要求,然后TimeQuest为了达到这种要求而算出FPGA内部的一些约束条件。我把I/O时序约束的过程分为5个步骤,这有利于建立时序约束的直觉:1) 使用create_clock命令为I/O接口创建虚拟时钟。2) 使用set_input_delay或set_output_delay为I/O端口添加约束。分为两次进行:一次使用-min选项,一次使用-max选项。延时值都使用0ns(步骤5中会修改该值)。3) 确定FPGA时钟和虚拟时钟之间的建立时间关系和保持时间关系。4) 如果默认时序关系不正确,使用倍数周期进行约束。5) 根据外部延时来修改-max和-min参数。这里需要指出的是,set_input_delay和set_output_delay的延时参数是最后指定的,而新手往往都是最先确定的。看完下面步骤1就会明白为什么要这样做了。同时注意,双向I/O端口会既被当做输入端口又被当做输出端口进行分析,所以需要同时用set_input_delay和set_output_delay进行约束。步骤 1) 使用create_clock为I/O接口添加虚拟时钟如果FPGA与一个工作在66MHz的PCI设备和一个工作在200MHz的DAC通讯,需要添加下面的命令道.sdc文件中:create_clock period 12.151 name pci_clk_extcreate_clock period 5.0 name dac_clk_ext这里并没有将两个时钟应用到任何FPGA元素,所以称之为虚拟时钟,它们是存在于FPGA之外的时钟。虚拟时钟具体怎么使用会在下面几步进行讲述。步骤 2) 使用set_input_delay或set_output_delay为I/O端口添加约束如果是约束一个称为DAC_DATA5的输出端口,可以向.sdc文件添加命令:set_output_delay clock dac_clk_ext max 0.0 get_ports DAC_DATA5set_output_delay clock dac_clk_ext min 0.0 get_ports DAC_DATA5-clock选项后跟步骤1创建的虚拟时钟,-max和-min选项的参数值为0.0。这里0.0只是起到占位符的作用,会在步骤5中被修改。对于一条输入总线,希望其所有端口都作同样的约束,可以在.sdc文件中添加:set_input_delay clock adc_clk_ext max 0.0 get_ports ADC_DATA*set_input_delay clock adc_clk_ext min 0.0 get_ports ADC_DATA*该步骤比较浅显易懂,但是要理解这2条命令具体干了什么。这2条命令其实并没有作任何约束,而是在描述FPGA外部的路径。比如对于输出端口的约束语句,我们把它拆分开来:a) Set_output_delayFPGA的输出端口连接到一个外部目标寄存器b) -clock dac_clk_ext这个外部目标寄存器是有虚拟时钟dac_clk_ext驱动的c) -max/min 0.0FPGA外部的数据延时最大和最小都是0.0d) get_ports DAC_DATA5FPGA内部的源寄存器从DAC_DATA5端口连接到外部下面我们看看这条命令的图解:从图中可以看出,该步骤只是描述了一个FPGA外部的回路。现在出现在我们面前的就像分析片上时序时一样,只是纯粹的寄存器之间的数据传输。步骤 3) 确定FPGA时钟和虚拟时钟之间的建立时间关系和保持时间关系大多数情况下,发起时钟和锁存时钟频率相同且边沿对齐,因此建立时间关系为一个时钟周期,保持时间关系为0ns,如下图左上角所示:对于I/O来说,在输入约束时,虚拟时钟是发起时钟;而在输出约束时,虚拟时钟是锁存时钟。如果需要更深入地学习如何确定建立时间和保持时间关系,请阅读时序分析基础。下面将讲解利用TimeQuest查看时序关系,而不是如何计算时序关系。例:一个100MHz的时钟深入FPGA,通过PLL仍以100MHz驱动数据传输。通过前面的约束步骤,创建一个10ns的外部虚拟时钟并应用到输出端口:create_clock period 10.0 name tx_clk_extset_output_delay clock tx_clk_ext max 0.0 get_ports TX_DATA* TX_PARset_output_delay clock tx_clk_ext min 0.0 get_ports TX_DATA* TX_PAR在上面的例子中,创建了一个虚拟时钟tx_clk_ext,同时输出端口TX_DATA*和TX_PAR向由tx_clk_ext驱动的外部寄存器传输数据,并设置外部数据延时为0.0ns。因为片上时钟周期也是10.0ns,而且两个时钟没有相位差,所以默认建立时间关系为10.0ns,默认保持时间关系为0.0ns。如果你并对此有所怀疑,可以读取迭代方法中使用的.sdc文件并对这些端口执行报告时序。点击TimeQuest的下拉菜单Reports-Custom Reports-Report Timing,在To Clock中选择tx_clk_ext,执行两次report_timing,分别报告建立时间关系和保持时间关系。在这个例子中,可以获得两份报告:左侧面板中显示的是Setup Relationship,如红框中所示,在Relationship列中的数值是10.0ns,和期望值一致。在Summary下是路径的详细描述,其中发送时间是0ns,锁存时间是10ns。Hold Relationship的查看和上面类似。说了这么多,到底是要表达什么呢?当发起时钟进入FPGA,传输到源寄存器,数据通过输出端口传递到外部寄存器,数据到达目标寄存器的时间必须大于0ns(保持时间关系)且小于10ns(建立时间关系)。因为我们设置的外部延时最大和最小都是0ns,即外部无延时,所以在FPGA内部,数据延时必须要大于0ns小于10ns。步骤 4) 使用倍数周期进行约束这一步并不是必要的。如果使用步骤3中的默认时序关系进行路径分析不能完全正确,就要考虑使用倍数周期来确定建立和保持时序关系。倍数周期的使用通常发生在需要进行开窗操作或移窗操作时。要注意的是,在这一步中我们不会去考虑外部延时,像外部器件的Tsu或Tco、电路板布线延时等,这些是步骤5的考虑范畴,这里我们只需确定时序关系即可。如果一个接口连接到FLASH设备,而FLASH设备的每一次操作可能需要花费多个FPGA时钟周期,这时就需要进行开窗操作:set_multicycle_path setup to get_ports FLASH_DATA* 4set_multicycle_path hold to get_ports FLASH_DATA* 3这两条语句会告诉TimeQuest,FLASH_DATA信号从FPGA输出需要花费4个时钟周期。如果原始的建立和保持时序关系是10ns和0ns,那么现在就是40ns和0ns(假定时钟周期是10ns)。如果FPGA内部的时钟有相位偏移(通常是通过PLL实现),而外部时钟无相位偏移,那么通常需要移窗操作。例如,FPGA内部的触发时钟移相了-500ns,那么默认建立时间关系将是500ps。要进行移窗操作,可以添加以下命令:set_multicycle_path setup to get_ports FLASH_DATA* 2 orset_multicycle_path setup from get_clocks pllclk0 to get_clocks clk_ext 2第1条语句会修改相应输出路径的时序关系,第2条会修改两个时钟之间的所有路径的时序关系。只要可以覆盖所有期望的路径,可以选用二者中的任何一个。如果时钟周期为10ns,上面的命令会修改建立时间关系为9.5ns,而不是默认的0.5ns。而保持时间关系会从-9.5ns修改为0.5ns。如果FPGA内部时钟是向前移相了一点,可能就不需要使用倍数周期。比如,默认建立时间关系是10ns,FPGA内部的源时钟向前移相500ps,然后默认建立时间关系会变为9.5ns,这可能就是我们想要的结果。对于输入FPGA的信号,情况恰好相反。如果将FPGA内部的锁存时钟向前移相一点,那么可能需要用倍数周期来移窗。而如果是向后移相一点,可能就不需要进行移窗操作。通过绘制触发和锁存时钟波形,可以很容易看出这一点。详细解释可参考默认建立和保持时间。步骤 5) 根据外部延时来修改-max和-min参数现在我们已经有了正确的建立和保持时间关系,下一步就是来修改-max和-min的参数值。目前这两个参数值都被设置为0,即是外部无延时。这时整个数据传输窗口的延时都在FPGA内部。但是事实上,部分数据传输窗口的延时路径在电路板上或外部器件中。-max和-min就是用来设置这部分外部数据延时值的。在确定外部延时准确值前,我们先来看看其如何影响时序分析。-max和-min均给定0值,意味着外部路径无延时,所以外部数据路径对时序分析无影响。当-max值变大,将缩短建立时间关系。所以如果默认建立时间关系之前是10ns,而-max设置的外部延时为4ns,则FPGA为保证时序收敛,必须在6ns内将数据传输出去。当然建立时间关系仍然是10ns,只是“FPGA内部延时+外部延时”要小于建立时间关系。所以-max参数值越大,FPGA内部要传输数据更快,而且越难达到时序约束。-max越大,FPGA内部Tco(寄存器内数据传输时间)要越快。-min的情况恰恰相反,其值越小,时序越难收敛。如果保持时间关系是0ns,-min参数值为-1ns,则为达到时序收敛,FPGA需花费超过1ns将数据传输出去。下面是直观的波形示图:上图中,第一条波形是默认时间关系,第二条波形是设置了外部延时后的时序关系。从图中可以看出,FPGA将数据传输出去所花费的时间必须介于1ns6ns之间,而不再是默认的0ns10ns之间。类似的,对于输出路径,设置了外部延时后:如图所示,第二条波形中绿色和紫色的箭头并不是起始于同一点,这很容易让人感到困惑。上图的意思是,当外部时钟触发了一个数据,它可能花费-1ns4ns之间的任何值传递到FPGA。我们会使用这个时间段的大值作建立时间分析,采用小值作保持时间分析。关于外部延时具体是如何被添加到时序报告中的将会在后面的章节关联约束和时序报告中讲述。有一点要注意,当-max和-min值的差别越大,FPGA越难达到时序收敛。在上面的输出数据的例子中,默认时间关系指出数据必须在0ns10ns之间被传递出去。当外部延时从默认的0ns,变成-1ns4ns,那么外部路径就占用了数据传输窗口总共10ns中的5ns,所以FPGA也只剩下5ns可供使用。我之所以在这里说明这些,是因为目前读者尚不完全明白时序关系。到这里,我们已经在概念上理解了外部延时如何对时序分析产生影响,下面就一起来看看如何确定外部延时值。外部器件参数:Tsu_ext = 外部器件的建立时间Th_ext = 外部器件的保持时间电路板数据延时:Max_fpga2ext = 电路板到外部器件的最大延时min_fpga2ext = 电路板到外部器件的最小延时set_output_delay max = Tsu_ext + Max_fpga2extset_output_delay min = -Th_ext + min_fpga2ext对于输入约束,计算如下:外部器件参数:Tco_ext = 外部器件的建立时间minTco_ext = 外部器件的保持时间电路板数据延时:Max_ext2fpga = 外部器件到FPGA的电路板最大延时min_ext2fpga = 外部器件到FPGA的电路板最小延时电路板上的时钟延时:Max_clk2fpga = 时钟从电路板到FPGA的最大延时min_clk2fpga = 时钟从电路板到FPGA的最小延时Max_clk2ext = 时钟从电路板到外部器件的最大延时min_clk2ext = 时钟从电路板到外部器件的最小延时Set_input_delay max = Tco_ext + Max_ext2fpgaSet_input_delay min = minTco_ext + min_ext2fpga可以按照TCL语法的描述将变量和等式添加到.sdc文件。请注意上面的等式中并没有计入板级时钟抖动,而是假定到达FPGA和外部器件的时钟是相同的。外部器件参数:Tsu_ext = 外部器件的建立时间Th_ext = 外部器件的保持时间电路板上的数据延时:Max_clk2fpga = 时钟从电路板到FPGA的最大延时min_clk2fpga = 时钟从电路板到FPGA的最小延时Max_clk2ext = 时钟从电路板到外部器件的最大延时min_clk2ext = 时钟从电路板到外部器件的最小延时set_output_delay max = Tsu_ext + Max_fpga2ext - (min_clk2ext Max_clk2fpga) = Tsu_ext + Max_fpga2ext (min_clk_skew)set_output_delay min = -Th_ext + min_fpga2ext (Max_clk2ext min_clk2fpga) = -Th_ext + min_fpga2ext (Max_clk_skew)对于输入约束:外部器件参数:Tco_ext = 外部器件的TcominTco_ext = 外部器件的最小Tco板级数据延时:Max_ext2fpga = 从外部器件到FPGA的最大板级延时min_ext2fpga = 从外部器件到FPGA的最小板级延时板级时钟延时:Max_clk2fpga = 时钟从电路板到FPGA的最大延时min_clk2fpga = 时钟从电路板到FPGA的最小延时Max_clk2ext = 时钟从电路板到外部器件的最大延时min_clk2ext = 时钟从电路板到外部器件的最小延时Set_input_delay max = Tco_ext + Max_ext2fpga (min_clk2fpga Max_clk2ext) = Tco_ext + Max_ext2fpga (min_clk_skew)Set_input_delay min = minTco_ext + min_ext2fpga (Max_clk2fpga min_clk2ext) = minTco_ext + min_ext2fpga (Max_clk_skew)下面是示意图:上图中有两个板级时钟,一个作为输入时钟,另一个作为输出时钟。但是通常它们是同一个时钟。很多人喜欢将时钟延时添加到-max和-min的计算公式中,但是SDC还有另一种更友好的添加板级时钟延时的方法:set_clock_latency source late 2.0 get_clocks clk_fpgaset_clock_latency source early 1.8 get_clocks clk_fpgaset_clock_latency source late 2.3 get_clocks clk_extset_clock_latency source early 2.1 get_clocks clk_ext然后TimeQuest就会自动将上面的时钟延时加入到分析过程。这么做的好处就是不用再去关心延时的正负,不用关心该加还是该减,所有这些都由TimeQuest去自行处理。当然,到底选用哪种方式还是取决于个人喜好,只要设置正确,两种方法可以作出一致的时序分析。3. 时序分析结果这一小节是本章最重要的部分,因为在其他一些文档中往往会看不到类似的分析过程。当然,本节的内容还是很容易理解的。我一次又一次地看到有些用户把精力都集中在.sdc文件的编辑和修改上,但他并没有清楚的明白这些约束指令会如何在分析结果中体现。分析路径时,理解约束命令如何在结果中体现是一项很重要的技能。迭代方法学当输入约束命令时,有时会出错,所以希望有一种快捷的方式来反复地执行“修改SDC-分析结果”。首先,我们要运行TimeQuest:TimeQuest打开之后,推荐执行Task面板中的Report all Summaries宏:执行之前,要先运行Netlist Setup中的3步:1) Create Timing Netlist:默认会创建一个慢时序模型网表。如果用户想要创建其他时序模型的网表,需要从Netlist下拉菜单进行创建。2) Read SDC File:该命令会读取用户的SDC文件。TimeQuest会读取所有添加到“Assignment - Settings - TimeQuest or - Files”的SDC文件,如果没有,TimeQuest会查找任何匹配项目名称的.sdc文件。如果添加到TimeQuest的SDC文件链表有任何变化,一定要从新启动TimeQuest以使变更生效。3) Update Timing Netlist:该命令会应用SDC文件中的约束到设计网表。4) Report All Summaries:该宏命令会执行Setup、Hold、Recovery、Removal总结和最小脉宽检查。这基本上是设计中所有约束路径的分析概要。(不会执行Device Specific检查.)所谓迭代方法,就是当用户更改了.sdc文件并保存后,需双击Reset Design,将状态回滚到读取.sdc文件之前。然后双击Report All Summaries,TimeQuest会重新读取新的.sdc文件,并重新创建时序总结。本质上,迭代方法就是:1) 打开TimeQuest2) 双击“Report All Summaries”3) 对时序概要进行分析4) 更改.sdc文件并保存5) 双击“Reset Design”6) 双击“Report All Summaries”7) 对时序概要进行分析8) 根据需要重复47步要注意迭代方法中只是使用了新的约束命令来重新进行时序分析,但在进行重新分析时,使用的布局布线图仍然是上次编译得到的(使用就的约束命令)。所以如果在使用新的约束命令进行分析时出现了一些约束失败的情况,可能只是需要重新执行布局布线。例如,布局布线器可能将注意力集中在设计中的一条很长的路径上,并尝试使该路径的时序收敛。后来设计者猛然意识到该路径运行在一个更低的速率下,所以在TimeQuest中添加了set_multicycle_path命令来开窗,然后使用迭代方法来执行新的约束命令。刚刚的路径变得收敛了,但是又有其他路径不能收敛了。这次不能收敛的路径可能本来就没有使用最佳的布线方式,因为刚刚布局布线器将注意力都集中到刚才那条长路径上了(刚才的关键路径)。迭代方法推荐用来更正.sdc文件,但是为了使这些新的约束命令生效,用户需要重新执行全编译。第三章 时序分析基础1. Setup、Hold、Recoverry和Removal概念基础当我们还在学校学习数字电路设计的时候,都接触了寄存器的建立时间和保持时间,分别记作Tsu和Th。Tsu表示在时钟沿到来之前,数据必须稳定保持多久;Th表示时钟沿到来之后数据必须要稳定多久。如果违背了这种时序规则,寄存器将会进入亚稳态。Tsu和Th算是寄存器的特性指标,而且这种特性与时钟频率、FPGA的布局布线无关。我们通常称这两个参数为“微参”,因为在使用时,通常使用微秒数量级。当然了,“微参”是TimeQuest进行时序分析时使用的,而不属于建立和保持时序关系的基本原理。大多数情况下,我们无需关心这些微参,因为TimeQuest会帮我们计算,我们要关心的是建立和保持时序关系本身。TimeQuest进行时序分析是基于时钟的,时钟约束是首先被创建并应用到设计的。这些时钟在其本身的路径和其他路径都会存在一种时序关系基于时钟的建立和保持时序关系。这些时序关系是静态时序分析的基石。先了解两个注意点:1. TimeQuest使用建立时序关系和保持时序关系作为术语,但是我更倾向于将它们作为布局布线器想要达到时序收敛要满足的需求,所以我在后面会称呼它们为建立时序需求和保持时序需求,事实上指的是同一个东西。2. 后面提及到Setup Relationship的地方,同时也适用于Recovery Relationship,而提及Hold Relationship同样适用于Removal Relationship。Recovery和Removal同Setup和Hold是类似的,只是它们用于处理异步信号。在后面的章节Recovery和Removal中会有更多的讨论。为简洁起见,这里只给出了Setup和Hold relationship,Recovery和Removal请读者自行推断。TimeQuest和静态时序分析都基于重复性的、周期性的数据关系原则。也就是说,它们都依赖时钟。几乎所有分析都从launch clock和latch clock开始,下面我们来看一个最基本的情况:上面的波形是最基本的情况,读者基本想都不用想就能理解了。上面的Setup Relationship是10ns,Hold Relationship是0ns。Setup Relationship意味着当Launch Clock发送了一个上升沿,数据必须在Latch Clock的上升沿(10ns后)之前到达latch寄存器。Hold Relationship意味着数据必须在Latch Clock的上升沿(0ns后)之后到达latch寄存器。要注意的是,上面的波形基于.sdc文件如何描述时钟。Launch Clock和Latch Clock均由create_clock或create_generated_clock语句声明,它们可能是同一个时钟,也可能不是。下面我们用图解的方式来了解其应用:用等式描述就是:Data Arrival Path = Launch Edge + src_clk_dly + src_reg_uTco + data_delayData Required Path = Latch Edge + dst_clk_dly所以分析上述路径的setup时序时,Data Arrival Path必须在Data Required Path的微参(uTsu)之前到达FPGA,即:Data Arrival Path + uTsu Data Required PathLaunch Edge + src_clk_dly + src_reg_uTco + data_delay Latch Edge + dst_clk_dly dst_reg_uTsu下面是一个实际的timing report:可以看出,Data Arrival Path开始于Launch Edge(0ns),然后加上到达目标寄存器前的所有延时,总共是3.875ns。Data Required Path开始于Latch Edge(10ns),通过latch clock的延时后到达目标寄存器,共13.045ns。所以时序是收敛的,因为Data Arrival Path小于Data Required Path,而且有8.963ns的时间余量。Waveform标签页以更友好的方式展示了上述信息。和Data Path标签页结合起来,可以更好地帮助用户理解。Waveform有助于对过程的理解;当约束失败时,Data Path标签页可能提供更详细的失败原因,给出路径中各种延时和布线信息。再看看同一条路径的Hold Relationship:可以看出,Hold Relationship是0ns,也就是说,Latch Edge在0ns,而且我们希望数据在Latch Edge之后到达目标寄存器以达到时序收敛。下面是时序报告:注意Setup和Hold分析的不同点:- Launch Edge和Latch Edge的改变,上面的例子中Launch Edge不变,Latch Edge分别是10ns和0ns。- 微参分别是uTsu和uTh。- 进行Setup时序分析时,时间余量 = Data Required Path - Data Arrival Path;而对于Hold时序分析,时间余量是Data Arrival Path Data Required Path。- 延时有些不同。当检查Setup时,希望比较最长Data Arrival Path和最短的Data Required Path;而对于Hold,则希望比较最短的Data Arrival Path和最长的Data Required Path。大多数路径都在FPGA内部,而且如果在同一个时钟域内,就拥有同一个全局时钟作为源时钟和目标时钟。这时,Launch时钟延时和Latch时钟延时近乎相等并同时从等式中去除,然后data path delay就成员主要的影响因素。这是设计人员在进行静态时序分析时经常考虑的,如果时钟周期是10ns,那么数据延时必须大于0ns而小于10ns。这种方法过于简洁,但是在时钟延时比较平衡时基本上是正确的。我们已经了解了时钟波形的默认Setup Relationship和Hold Relationship如何应用于分析路径,下面我们来看看如何计算默认Setup Relationship和Hold Relationship。2. 默认时序关系TimeQuest中默认所有时钟都是相关的,有默认
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年建公路法规试题及答案
- 2025年采购专业实务试题及答案
- 2025年出纳人员笔试题及答案大全
- 2025年中医望诊护理试题及答案
- 2025年中药试题选题及答案
- 2025年java面试题sql部分及答案
- 2025年保教人员细则试题及答案
- 2025年第33届中级topik试题及答案
- 2025年中国哲学考研试题及答案
- 村委纠纷协议书
- 《我觉得我很棒》教案-2024-2025学年南大版初中心理健康七年级全一册
- 代名购房合同协议书
- 进城教师考试试题及答案
- 工程归档服务合同协议
- 四川省蜀道集团招聘笔试题库2025
- 集控中心培训管理制度
- 事故隐患内部报告奖励制度
- 八年级历史上册第六单元中华民族的抗日战争第18课从九一八事变到西安事变学案新人教版
- 电力工程企业的绩效考核与激励体系设计
- 2025年云南省康旅控股集团有限公司招聘笔试参考题库含答案解析
- 2025年宁波市交通建设工程试验检测中心有限公司招聘笔试参考题库附带答案详解
评论
0/150
提交评论