1、QuartusII 时钟约束 时钟约束(Clock Specification): 约束所有时钟(包括你的设计中特有的时钟)对准确的时序分析结果而言是必不可少的。Quartus II TimeQuest Timing Analyzer为各种各样的时钟配置和典型时钟提供许多SDC命令。 这个章节将介绍SDC可用的应用编程接口,以及描述指定的时钟特性。 时钟(Clocks) 使用create_clock命令为任何register, port或pin进行时钟特性描述,使其具有独一的时钟特性。例6–2展示了create_clock命令: Example 6–2. create_cl
2、ock Command
create_clock
-period
3、进行多个时钟约束
4、clk_sys 使用create_clock命令约束时钟缺省的source Latency值为0。Quartus II TimeQuest Timing Analyzer自动为非虚拟时钟(non-virtual clocks)计算时钟网络延时(clock’s network latency)。 Quartus II Handbook, Volume 3 6-29 生成时钟(Generated Clocks) Quartus II TimeQuest Timing Analyzer可以把修改或改变主时钟(或者引入时钟)特性的分频时钟、波纹时钟和电路作为生成时钟。 你可以定
5、义这些电路的输出作为生成时钟。这些定义可以让Quartus II TimeQuest Timing Analyzer分析这些时钟以及关联的时钟网络延时(network latency)。
使用create_generated_clock命令定义生成时钟。
Example 6–5. create_generated_clock Command
create_generated_clock
[-name
6、de_by
7、 |
-edge_shift
8、
9、by 1 -invert -source [get_registers clk] \ [get_registers gen|clkreg] Figure 6–18 展示了如何使用-edges和-edge_shift选项以改变生成时钟。 Figure 6–18. Edges and Edge Shifting a Generated Clock create_clock -period 10 -waveform { 0 5} [get_ports clk] # Creates a divide-by-t clock create_generated_clock -source
10、[get_ports clk] -edges {1 3 5 } [get_registers \ clkdivA|clkreg] # Creates a divide-by-2 clock independent of the master clocks’ duty cycle (now 50%) create_generated_clock -source [get_ports clk] -edges {1 1 5} -edge_shift { 0 2.5 0 } \ Figure 6–19 展示了-multiply_by选项对生成时钟的影响。 Figure 6–19. M
11、ultiplying a Generated Clock create_clock -period 10 -waveform { 0 5 } [get_ports clk] # Creates a multiply-by-2 clock create_generated_clock -source [get_ports clk] -multiply_by 2 [get_registers \ Quartus II Handbook, Volume 3 6-32 虚拟时钟Virtual Clocks 虚拟时钟是一个在设计中没有真正源或者说与设计没有直接关系的一个时钟。例
12、如,如果一个时钟不是设计中的时钟,而仅仅作为一个外部器件的时钟源,并且外部器件和该设计有输入或者输出的管脚,那么就认为这个时钟是虚拟时钟。 使用create_clock命令创造一个虚拟时钟,对源选项没有指定值。 你可以使用set_input_delay和set_output_delay约束虚拟时钟。 Figure 6–20展示了Quartus II TimeQuest Timing Analyzer若要正确的分析外部寄存器和内部设计逻辑之间的关系,在何处需要设置虚拟时钟的实例。虽然名为virt_clk的晶振没有和Altera器件直接相互作用,但是担当起了外部寄存器的源时钟的角色,所以时钟
13、virt_clk必须申明。 Example 6–6 展示了定义一个周期10ns,名为virt_clk,50%占空比,上升沿在0ns的虚拟时钟的命令。虚拟时钟用于作为输出延时约束的时钟源。 在你产生虚拟时钟之后,你可以执行register-to-register的分析报告(在Altera器件和外部器件的寄存器之间)。 Example 6–6. 虚拟时钟Example 1 #create base clock for the design create_clock -period 5 [get_ports system_clk] #create the virtual cloc
14、k for the external register create_clock -period 10 -name virt_clk -waveform { 0 5 } #set the output delay referencing the virtual clock set_output_delay -clock virt_clk -max 1.5 [get_ports dataout] Example 6–7 展示了产生一个周期为10ns,占空比为50%,相移90度虚拟时钟的命令。 Example 6–7. Virtual Clock Example 2 create_cl
15、ock -name virt_clk –period 10 –waveform { 2.5 7.5 } Quartus II Handbook, Volume 3 6-33 多频时钟 Multi-Frequency Clocks 某些情况下在设计中会有很多个时钟源提供时钟信号。增加的时钟也许扮演一个低频率低功耗时钟的角色。在分析这种设计时,create_clock命令提供了–add选项让你添加多个时钟节点。 Example 6–8展示了时钟周期为10ns的节点clk,然后对同一个节点添加时钟周期为15ns的时钟。Quartus II TimeQuest Timing Anal
16、yzer在执行时序分析时两个时钟都用到了。 Example 6–8. Multi-Frequency Example create_clock –period 10 –name clock_primary –waveform { 0 5 } [get_ports clk] create_clock –period 15 –name clock_secondary –waveform { 0 7.5 } [get_ports clk] -add Quartus II Handbook, Volume 3 6-34 自动时钟检测 Automatic Clock Detectio
17、n
想要为你的设计中所有的时钟节点自动添加时钟约束,那么就使用derive_clocks命令。这个命令从管脚或者寄存器生成时钟以确保设计中的每个寄存器都有时钟。
Example 6–9 展示了derive_clocks命令选项。
Example 6–9. derive_clocks Command
derive_clocks
[-period
18、
19、节点应该有一个共同的时钟基准,故所有的PLL输出应该有一个关联时钟。 你可以使用create_generated_clock命令手动添加一个作为PLL输出的基准时钟,或者你也可以使用derive_pll_clocks命令自动搜寻时序网表并通过设置指定PLL输出来产生时钟。 使用derive_pll_clocks命令为PLL输出自动产生时钟的实例如下: derive_pll_clocks [-use_tan_name] Table 6–9. derive_pll_clocks Command Options 选项 描述 -use_tan_name 缺省下,时钟名为输出时钟名字。
20、这个选项使用的网络名字类似于在Quartus II Classic Timing Analyzer中使用的。 derive_pll_clocks命令调用create_generated_clock命令以产生PLL输出的生成时钟。 create_generated_clock命令的source是PLL的输入时钟。derive_pll_clocks命令的前后已固定,你必须手动为PLL生成一个输入时钟节点。如果PLL的输入时钟节点未被定义好,报告中不会出现PLL输出的时钟。取而代之的,当时序网表更新后,Quartus II TimeQuest Timing Analyzer发出一个类似于Figu
21、re 6–10的警告信息。
Example 6–10. Warning Message
Warning: The master clock for this clock assignment could not be derived.
Clock:
22、eate_generated_clock命令就将生成。如果在derive_pll_clock命令后使用write_sdc命令,新的SDC文件包含了独立的PLL输出时钟管脚的create_generated_clock命令,并且不是derive_pll_clocks命令。任何PLL属性的变化不会自动的反应到新的SDC文件中。你必须通过写入derive_pll_clocks命令手动更新新的SDC文件中的create_generated_clock命令(反映PLL的变化)。 通过添加适当的multicycle约束计算不确定因素,derive_pll_clocks将约束设计中的任何LVDS传送和LV
23、DS接收。 例如,Figure 6–21展示了一个寄存器到寄存器路径的单一PLL设计。 使用derive_pll_clocks命令自动约束PLL。当Figure 6–21的设计中使用到这个命令,将产生Example 6–11的信息。 Example 6–11. derive_pll_clocks Generated Messages Info: Info: Deriving PLL Clocks: Info: create_generated_clock -source pll_inst|altpll_component|pll|inclk[0] -divide_by 2 -n
24、ame pll_inst|altpll_component|pll|CLK[0] pll_inst|altpll_component|pll|clk[0] Info: 名为pll_inst|altpll_component|pll|inclk[0]的节点用于作为PLL输入时钟脚的源参考选项。此外,PLL输出时钟的名字是PLL输出时钟节点pll_inst|altpll_component|pll|clk[0]。 如果PLL处于时钟替换模式,PLL输出时钟将产生多时钟;一个是主要输入时钟(例如inclk[0]),另一个是次要输入时钟(例如inclk[1])。假若那样的话,你可以使用set_
25、cock_groups命令加上-exclusive选项以削减主要和次要输出时钟。在你可以为这个设计产生任何报告之前,你必须为PLL输入时钟管脚产生一个基本时钟,使用类似下面的命令: create_clock -period 5 [get_ports pll_inclk] 你不用在PLL的输入时钟管脚pll_inst|altpll_component|pll|inclk[0]上产生基本时钟。PLL输入时钟管脚产生所有的扇出时钟管脚,包括PLL输入时钟管脚。 Quartus II Handbook, Volume 3 6-37 缺省时钟约束 Default Clock Const
26、raints 为了提供彻底的时钟分析,如果你的设计中没有基本时钟约束,Quartus II TimeQuest Timing Analyzer在缺省时会自动的检测所有未被约束的时钟节点。Quartus II TimeQuest Timing Analyzer使用以下命令产生1GHz的时钟约束你的未约束时钟: derive_clocks -period 1 独立的时钟约束(例如,create_clock, create_generated_clock)可能会出现在设计中。这将导致不切实际的分析设计中的时序要求。derive_clocks的使用应该避免出现在最终的时序里。 缺省时钟约束仅仅
27、被用于Quartus II TimeQuest Timing Analyzer检测所有没有时钟连接的同步单元。例如,如果一个设计约束两个时钟,而仅有一个时钟已经约束了,这将不会使用缺省时钟约束。然而,如果两个时钟都未被约束,那么将会启动缺省时钟约束。 Quartus II Handbook, Volume 3 6-37 Clock Groups 设计中存在着许多时钟,然而,并非所有时钟都相互关联,况且某些时钟间相互关联是没有必要的。异步时钟就是不相关时钟(异步时钟有不同的理想时钟源)。专用时钟也不一定在同一时刻激活(例如,多元时钟)。必须向Quartus II TimeQues
28、t Timing Analyzer指明相互排斥的时钟,从而阻止其把这些时钟作为关联时钟进行分析。
使用set_clock_groups命令指明相互排斥或者异步的时钟。Example 6–12 展示了set_clock_groups命令及选项。
Example 6–12. set_clock_groups Command
set_clock_groups
[-asynchronous | -exclusive]
-group
29、cribes the options for the set_clock_groups command.
选项
描述
-asynchronous
异步时钟——两个时钟没有相位关系并且不在同一时刻激活
-exclusive
专有时钟——两个时钟中仅有一个在特定时间激活。2选1时钟就是专有时钟的一个实例
-group
30、s Example # Clocks A and C are never active when clocks B and D are active set_clock_groups -exclusive -group {A C} -group {B D} # Equivalent specification using false paths set_false_path -from [get_clocks A] -to [get_clocks B] set_false_path -from [get_clocks A] -to [get_clocks D] set_false_
31、path -from [get_clocks C] -to [get_clocks B] set_false_path -from [get_clocks C] -to [get_clocks D] set_false_path -from [get_clocks B] -to [get_clocks A] set_false_path -from [get_clocks B] -to [get_clocks C] set_false_path -from [get_clocks D] -to [get_clocks A] set_false_path -from [get_cloc
32、ks D] -to [get_clocks C] Quartus II Handbook, Volume 3 6-39 影响时钟特性 Clock Effect Characteristics create_clock和create_generated_clock命令产生不涉及板级影响的理想时钟。这个章节描述如何计算影响时钟特性的时钟延时(clock latency)和时钟不确定时间(clock uncertainty)。 时钟延时 Clock Latency 时钟延时(clock latency)由两部分组成:源(source)和网络(network)。源延时(S
33、ource latency),是指从源时钟到目的时钟端的传播延时(例如,一个时钟端口),而网络延时(network latency)是指从一个定义点时钟到一个寄存器时钟端口的传播延时。寄存器时钟节点总的延时是时钟路径上源和网络延时之和。 set_clock_latency命令仅仅支持源延时。当使用该命令时,-source选项需指定。 使用set_clock_latency命令指定设计中的任意时钟端口的源延时Example 6–14展示了set_clock_latency命令选项。 Example 6–14. set_clock_latency Command set_clock_lat
34、ency
-source
[-clock
35、 II TimeQuest Timing Analyzer为每个合适路径数据需要时间(data required time)里扣除建立不确定时间,为每个合适路径的数据需要时间加上保持不确定时间。
使用set_clock_uncertainty命令指定时钟管脚的任意时钟不确定时间。Example 6–15展示了set_clock_uncertainty命令及选项。
Example 6–15. set_clock_uncertainty Command and Options
set_clock_uncertainty
[-rise_from
36、ll_from
37、确定时间的自动检测。建立和保持不确定时间都适合于时钟到时钟的传输。Example 6–16展示了derive_clock_uncertainty命令选项。 Example 6–16. derive_clock_uncertainty Command derive_clock_uncertainty [-overwrite] [-dtw] Quartus II TimeQuest Timing Analyzer自动的添加设计中时钟到时钟传输的时钟不确定时间。随着set_clock_uncertainty命令已被应用于源和目的时钟对中的任何时钟不确定时间约束,比起由derive_cloc
38、k_uncertainty命令约束的时钟不确定时间具有更高的优先权。例如,如果set_clock_uncertainty命令先指定了源时钟CLKA和目的时钟CLKB之间的时钟网络延时。那么derive_clock_uncertainty命令次之,由derive_clock_uncertainty命令计算出的由源时钟CLKA到目的时钟CLKB的不确定时间将被忽略。 你可以使用-overwrite命令覆盖原先的时钟不确定时间分配,后者手动添加remove_clock_uncertainty命令进行移除。 在以下的时钟到时钟传输类型中,时钟必然能够出现,它们被derive_clock_uncer
39、tainty命令自动归类。 ■ Inter-clock ■ Intra-clock ■ I/O Interface 交互时钟传输 Inter-Clock Transfers 交互时钟传输(Inter-clock transfers)发生在FPGA核和来自内部PLL输出节点或管脚的源与目的时钟的寄存器到寄存器传输。Figure 6–22展示了一个交互时钟传输的例子。 内部时钟传输 Intra-Clock Transfers 内部时钟传输(Intra-clock transfers)发生在FPGA核和来自内部PLL输出节点或管脚的源与目的时钟的寄存器到寄存器传输。Figu
40、re 6–22展示了一个内部时钟传输的例子。 I/O接口时钟传输 I/O Interface Clock Transfers I/O接口时钟传输发生在数据从I/O端口到FPGA核(input)或者从FPGA核到I/O端口(output)时的时钟传输。Figure 6–24展示了一个I/O端口时钟传输的例子。 约束I/O总线不确定时间,你必须生成一个虚拟时钟来约束输入和输出管脚(使用以虚拟时钟作为参考的set_input_delay和set_output_delay命令)。当set_input_delay或者set_output_delay命令以PLL输出作为参考时钟管脚时
41、虚拟时钟需阻止derive_clock_uncertainty命令应用于交互或者内部时钟传输在I/O总线时钟传输的确定时钟。 产生的虚拟时钟应该和驱动I/O端口的源时钟具有相同的属性。例如,Figure 6–25展示了一个典型的具有时钟说明的输入I/O接口。 Example 6–17展示了用SDC命令来约束Figure 6–25中的I/O接口。 Example 6–17. SDC Commands to Constrain the I/O Interface # Create the base clock for the clock port create_clock –p
42、eriod 10 –name clk_in [get_ports clk_in]
# Create a virtual clock with the same properties of the base clock driving
# the source register
create_clock –period 10 –name virt_clk_in
# Create the input delay referencing the virtual clock and not the base
# clock
# DO NOT use set_input_delay –clock clk_in






