1、FPGA QuartusII 时钟约束时钟约束(Clock Specification):约束所有时钟(包括你的设计中特有的时钟)对准确的时序分析结果而言是必不可少的。Quartus II TimeQuest Timing Analyzer为各种各样的时钟配置和典型时钟提供许多SDC命令。这个章节将介绍 SDC 可用的应用编程接口,以及描述指定的时钟特性。时钟(Clocks)使用 create_clock 命令为任何 register, port 或 pin 进行时钟特性描述,使其具有独一的时钟特性。例 62 展示了 create_clock 命令:Example 62. create_clo
2、ck Commandcreate_clock-period -name -waveform -addTable 66. create_clock Command Options选项 描述-period 指定时钟周期-name 指定时钟名称(不一定是约束时钟的节点名称)-waveform 指定时钟上升沿/下降沿-add 可以对一个时钟节点进行多个时钟约束指定你要约束的时钟(目标节点)Example 63 约束时钟频率 100MHz,占空比 50%,0ns 上升沿,5ns 下降沿。Example 63. 100MHz Clock Creationcreate_clock period 10 wav
3、eform 0 5 clkExample 64 和上例相差 90 度的相位。Example 64. 100MHz Shifted by 90 Degrees Clock Creationcreate_clock period 10 waveform 2.5 7.5 clk_sys使用 create_clock 命令约束时钟缺省的 source Latency 值为 0。Quartus II TimeQuest Timing Analyzer 自动为非虚拟时钟(non-virtual clocks)计算时钟网络延时(clocks network latency) 。Quartus II Hand
4、book, Volume 3 6-29生成时钟(Generated Clocks)Quartus II TimeQuest Timing Analyzer 可以把修改或改变主时钟(或者引入时钟)特性的分频时钟、波纹时钟和电路作为生成时钟。你可以定义这些电路的输出作为生成时钟。这些定义可以让 Quartus II TimeQuest Timing Analyzer 分析这些时钟以及关联的时钟网络延时( network latency) 。 使用 create_generated_clock 命令定义生成时钟。Example 65. create_generated_clock Commandcr
5、eate_generated_clock-name -source -edges -edge_shift -divide_by -multiply_by -duty_cycle -add-invert-master_clock -phase -offset Table 67. create_generated_clock Command Options选项 描述-name 生成时钟名-source 指定被设定的时钟节点-edges |-edge_shift -edges 指定和主时钟的上升沿和下降沿有关的新的上升沿和下降沿-divide_by |-multiply_by -divide_by
6、和 -multiply_by 要素是基于第一个时钟上升沿,通过设定来延长或者缩短指定要素的波形-duty_cycle 指定生成时钟的占空比-add 允许你对同一个管脚添加多个时钟约束-invert-master_clock 用于主管脚上有多个时钟存在时指定一个主时钟-phase 指定生成时钟的相位-offset 指定生成时钟的偏移指定被分配到的目标管脚源延时是由于从主时钟(不一定是主管脚)开始的时钟网络延时所致。你可以使用 set_clock_latency source 命令约束源延时。Figure 617 展示了如何产生一个基于 10ns 时钟的反向生成时钟:Figure 617. Gen
7、erating an Inverted Clockcreate_clock -period 10 get_ports clkcreate_generated_clock -divide_by 1 -invert -source get_registers clk get_registers gen|clkregFigure 618 展示了如何使用-edges 和-edge_shift 选项以改变生成时钟。Figure 618. Edges and Edge Shifting a Generated Clockcreate_clock -period 10 -waveform 0 5 get_p
8、orts clk# Creates a divide-by-t clockcreate_generated_clock -source 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 619 展示了 -
9、multiply_by 选项对生成时钟的影响。Figure 619. Multiplying a Generated Clockcreate_clock -period 10 -waveform 0 5 get_ports clk# Creates a multiply-by-2 clockcreate_generated_clock -source get_ports clk -multiply_by 2 get_registers Quartus II Handbook, Volume 3 6-32虚拟时钟 Virtual Clocks虚拟时钟是一个在设计中没有真正源或者说与设计没有直接关
10、系的一个时钟。例如,如果一个时钟不是设计中的时钟,而仅仅作为一个外部器件的时钟源,并且外部器件和该设计有输入或者输出的管脚,那么就认为这个时钟是虚拟时钟。使用 create_clock 命令创造一个虚拟时钟,对源选项没有指定值。你可以使用 set_input_delay 和 set_output_delay 约束虚拟时钟。Figure 620 展示了 Quartus II TimeQuest Timing Analyzer 若要正确的分析外部寄存器和内部设计逻辑之间的关系,在何处需要设置虚拟时钟的实例。虽然名为 virt_clk 的晶振没有和 Altera 器件直接相互作用,但是担当起了外部寄
11、存器的源时钟的角色,所以时钟 virt_clk 必须申明。Example 66 展示了定义一个周期 10ns,名为 virt_clk,50%占空比,上升沿在 0ns 的虚拟时钟的命令。虚拟时钟用于作为输出延时约束的时钟源。在你产生虚拟时钟之后,你可以执行 register-to-register 的分析报告(在Altera 器件和外部器件的寄存器之间) 。Example 66. 虚拟时钟 Example 1#create base clock for the designcreate_clock -period 5 get_ports system_clk#create the virtual
12、 clock for the external registercreate_clock -period 10 -name virt_clk -waveform 0 5 #set the output delay referencing the virtual clockset_output_delay -clock virt_clk -max 1.5 get_ports dataoutExample 67 展示了产生一个周期为 10ns,占空比为 50%,相移 90 度虚拟时钟的命令。Example 67. Virtual Clock Example 2create_clock -name
13、virt_clk period 10 waveform 2.5 7.5 Quartus II Handbook, Volume 3 6-33多频时钟 Multi-Frequency Clocks某些情况下在设计中会有很多个时钟源提供时钟信号。增加的时钟也许扮演一个低频率低功耗时钟的角色。在分析这种设计时,create_clock 命令提供了add 选项让你添加多个时钟节点。Example 68 展示了时钟周期为 10ns 的节点 clk,然后对同一个节点添加时钟周期为 15ns 的时钟。Quartus II TimeQuest Timing Analyzer 在执行时序分析时两个时钟都用到了。
14、Example 68. Multi-Frequency Examplecreate_clock period 10 name clock_primary waveform 0 5 get_ports clkcreate_clock period 15 name clock_secondary waveform 0 7.5 get_ports clk -addQuartus II Handbook, Volume 3 6-34自动时钟检测 Automatic Clock Detection想要为你的设计中所有的时钟节点自动添加时钟约束,那么就使用derive_clocks 命令。这个命令从管脚或
15、者寄存器生成时钟以确保设计中的每个寄存器都有时钟。Example 69 展示了 derive_clocks 命令选项。Example 69. derive_clocks Commandderive_clocks-period -waveform Table 68 describes the options for the derive_clocks command.选项 描述-period 指定时钟周期,你也可以指定时钟频率如下:-period MHz-waveform 指定沿变化时刻derive_clocks 命令不能为 PLLs 输出时钟进行约束。derive_clocks 命令相当于使用
16、 create_clock 命令为每个寄存器或者管脚产生时钟。Quartus II Handbook, Volume 3 6-35锁相环时钟 Derive PLL ClocksPLLs(锁相环)在 Altera 器件中被用于时钟管理和综合。你可以定制基于你设计需要的 PLL 输出时钟约束。因为所有的时钟节点应该有一个共同的时钟基准,故所有的 PLL 输出应该有一个关联时钟。你可以使用 create_generated_clock 命令手动添加一个作为 PLL 输出的基准时钟,或者你也可以使用 derive_pll_clocks 命令自动搜寻时序网表并通过设置指定 PLL 输出来产生时钟。使用
17、derive_pll_clocks 命令为 PLL 输出自动产生时钟的实例如下:derive_pll_clocks -use_tan_nameTable 69. derive_pll_clocks Command Options选项 描述-use_tan_name 缺省下,时钟名为输出时钟名字。这个选项使用的网络名字类似于在 Quartus II Classic Timing Analyzer 中使用的。derive_pll_clocks 命令调用 create_generated_clock 命令以产生 PLL 输出的生成时钟。create_generated_clock 命令的 sourc
18、e 是 PLL 的输入时钟。 derive_pll_clocks命令的前后已固定,你必须手动为 PLL 生成一个输入时钟节点。如果 PLL 的输入时钟节点未被定义好,报告中不会出现 PLL 输出的时钟。取而代之的,当时序网表更新后,Quartus II TimeQuest Timing Analyzer 发出一个类似于 Figure 610 的警告信息。Example 610. Warning MessageWarning: The master clock for this clock assignment could not be derived.Clock: was not create
19、d.你可以把 derive_pll_clocks 命令添加到你的 SDC 文件中,以使得derive_pll_clocks 命令可以自动检测 PLL 的任何变化。derive_pll_clocks 在你的SDC 文件中,每次读取该文件,PLL 输出时钟脚的 create_generated_clock 命令就将生成。如果在 derive_pll_clock 命令后使用 write_sdc 命令,新的 SDC 文件包含了独立的 PLL 输出时钟管脚的 create_generated_clock 命令,并且不是derive_pll_clocks 命令。任何 PLL 属性的变化不会自动的反应到新的
20、 SDC 文件中。你必须通过写入 derive_pll_clocks 命令手动更新新的 SDC 文件中的create_generated_clock 命令(反映 PLL 的变化) 。通过添加适当的 multicycle 约束计算不确定因素, derive_pll_clocks 将约束设计中的任何 LVDS 传送和 LVDS 接收。例如,Figure 621 展示了一个寄存器到寄存器路径的单一 PLL 设计。使用 derive_pll_clocks 命令自动约束 PLL。当 Figure 621 的设计中使用到这个命令,将产生 Example 611 的信息。Example 611. deriv
21、e_pll_clocks Generated MessagesInfo:Info: Deriving PLL Clocks:Info: create_generated_clock -source pll_inst|altpll_component|pll|inclk0 -divide_by 2 -namepll_inst|altpll_component|pll|CLK0 pll_inst|altpll_component|pll|clk0Info:名为 pll_inst|altpll_component|pll|inclk0的节点用于作为 PLL 输入时钟脚的源参考选项。此外,PLL 输出
22、时钟的名字是 PLL 输出时钟节点pll_inst|altpll_component|pll|clk0。如果 PLL 处于时钟替换模式,PLL 输出时钟将产生多时钟;一个是主要输入时钟(例如 inclk0) ,另一个是次要输入时钟(例如 inclk1) 。假若那样的话,你可以使用 set_cock_groups 命令加上-exclusive 选项以削减主要和次要输出时钟。在你可以为这个设计产生任何报告之前,你必须为 PLL 输入时钟管脚产生一个基本时钟,使用类似下面的命令:create_clock -period 5 get_ports pll_inclk你不用在 PLL 的输入时钟管脚 pl
23、l_inst|altpll_component|pll|inclk0上产生基本时钟。PLL 输入时钟管脚产生所有的扇出时钟管脚,包括 PLL 输入时钟管脚。Quartus II Handbook, Volume 3 6-37缺省时钟约束 Default Clock Constraints为了提供彻底的时钟分析,如果你的设计中没有基本时钟约束,Quartus II TimeQuest Timing Analyzer 在缺省时会自动的检测所有未被约束的时钟节点。Quartus II TimeQuest Timing Analyzer 使用以下命令产生 1GHz 的时钟约束你的未约束时钟:deriv
24、e_clocks -period 1独立的时钟约束(例如,create_clock, create_generated_clock)可能会出现在设计中。这将导致不切实际的分析设计中的时序要求。derive_clocks 的使用应该避免出现在最终的时序里。缺省时钟约束仅仅被用于 Quartus II TimeQuest Timing Analyzer 检测所有没有时钟连接的同步单元。例如,如果一个设计约束两个时钟,而仅有一个时钟已经约束了,这将不会使用缺省时钟约束。然而,如果两个时钟都未被约束,那么将会启动缺省时钟约束。Quartus II Handbook, Volume 3 6-37Clock Groups设计中存在着许多时钟,然而,并非所有时钟都相互关联,况且某些时钟间相互关联是没有必要的。异步时钟就是不相关时钟(异步时钟有不同的理想时钟源) 。专用时钟也不一定在同一时刻激活(例如,多元时钟) 。必须向Quartus II TimeQuest Timing Analyzer指明相互排斥的时钟,从而阻止其把这些时钟作为关联时钟进行分析。