1. 时钟介绍 在数字设计中,时钟代表从寄存器(register)到寄存器可靠传输数据的时间基准。Xilinx Vivado集成设计环境(IDE)时序引擎使用ClocK特征计算时序路径要求,并通过松弛计算报告设计时序裕度(Slack)。 时钟必须正确定义,以获得最佳的时序路径。以下特性定义了时钟:
1,时钟定义在它的树根的驱动器管脚或端口上,被称为源点。
2,时钟的边沿是由周期和波形特性相结合来描述的。
3,周期以纳秒(ns)为单位,时钟对应于波形重复的时间。
4,波形是时钟周期内上升边沿和下降边沿绝对时间的列表,以纳秒(ns)为单位。列表必须包含偶数的值。第一个值总是相对应的。到第一个上升的边沿。除非另有规定,占空比默认为50%,相移到0ns。 如图1所示,时钟CLK0具有10ns周期、50%占空比和0ns相位。时钟CLK1具有8ns周期、75%占空比(8ns内的高电平时间为6ns)和2ns上升沿相位偏移。 Clk0: period = 10, waveform = {0 5}
Clk1: period = 8, waveform = {2 8}
图1 时钟波形示例 1.1 传播时钟(Propagated Clocks)
周期和波形属性代表时钟的理想特性。当进入FPGA并通过时钟树传播时,时钟边沿被延迟并受到噪声和硬件行为引起的变化的影响。这些特性称为时钟网络延迟和时钟不确定性。
时钟的不确定性包括:
1,时钟抖动(Clock jitter)
2,相位误差
3,您指定的任何其他不确定性 默认情况下,Vivado IDE始终将时钟视为传播时钟,即非理想时钟,以便提供包括时钟树插入延迟和不确定性的准确松弛值。 1.2专用硬件资源
Xilinx FPGA的专用硬件资源有效支持大量设计时钟。这些时钟通常由电路板上的外部元件产生。它们通常通过输入端口进入设备。
它们也可以由称为时钟修改块的特殊原语生成,例如:
1,MMCM
2,BUFR
3,PLL 它们也可以通过常规单元格(如LUTS和寄存器)进行转换。 2 主时钟(Primary Clocks)
主时钟是通过输入端口或GT收发器输出引脚(例如,恢复时钟)进入设计的板时钟。
主时钟只能由create_clock命令定义。 如图2所示,板时钟通过端口sysclk进入器件,然后在到达路径寄存器之前通过输入缓冲器和时钟缓冲器传播。
1,时钟周期10ns
2,占空比50%
3,没有相位偏移 相应的Xilinx设计约束(XDC):
create_clock -period 10 [get_ports sysclk]
图2 主时钟 与sysclk类似,板时钟devclk通过端口clkIn进入设备。
1,时钟周期10ns
2,占空比为25%
3,相位偏移90度 对应的XDC:
create_clock -name devclk -period 10 -waveform {2.5 5} [get_ports ClkIn] 如图3所示,展示了一个收发器gt0,它从电路板上的高速链路恢复时钟rxclk。时钟rxclk的周期为3.33 ns,占空比为50%,并被路由到MMCM,MMCM为设计生成多个补偿时钟。
对应的XDC: create_clock -name sysclk -period 3.33 [get_ports SYS_CLK_clk_p]
图3 GT主时钟 如图4所示,差分缓冲器驱动PLL。在这种情况下,主时钟只能在差分缓冲区的正输入上创建。在缓冲区的每个正/负输入上创建主时钟将导致不切实际的CDC路径。 相应的XDC:
create_clock -name sysclk -period 3.33 [get_ports SYS_CLK_clk_p]
图4 差动缓冲器上的主时钟 3虚拟时钟( Virtual Clocks)
虚拟时钟是指在设计中没有物理连接到任何Netlist元素的时钟。
虚拟时钟是通过create_clock命令定义的,而不指定源对象。
虚拟时钟通常用于在下列情况之一中指定输入和输出延迟约束:
1,外部设备I/O参考时钟不是设计时钟之一。
2,FPGA I / O路径与内部生成的时钟有关,该时钟无法与从中导出的时钟板正确计时。
3,希望只为与I/O延迟约束相关的时钟指定不同的抖动和延迟,而不修改内部时钟特性。
例如,时钟CLK_virt的周期为10 ns,不附加到任何Netlist对象。未指定[]参数。在这种情况下,-name选项是强制性的. 相应的XDC:
create_clock -name clk_virt -period 10 在输入和输出延迟约束使用之前,必须定义虚拟时钟 4 生成时钟(Generated Clocks)
生成的时钟由设计内部的特殊单元(称为时钟修改块(例如,MMCM))或某些用户逻辑驱动。
生成的时钟与主时钟相关联。create_generated_clock命令考虑主时钟的起始点。主时钟可以是主时钟或另一个生成时钟。
生成的时钟属性直接来自其主时钟。必须描述修改电路如何转换主时钟,而不是指定其周期或波形。 4.1 用户定义产生时钟
例1:一个简单的二分频
图5 Generated Clocks 主时钟clkin的周期为10 ns。寄存器REGA将其除以2,驱动其他寄存器时钟引脚。相应的生成时钟称为clkdiv2。 以下是两个同等的制约因素:
create_clock -name clkin -period 10 [get_ports clkin]
# Option 1: master clock source is the primary clock source point
create_generated_clock -name clkdiv2 -source [get_ports clkin] -divide_by 2 \
[get_pins REGA/Q]
# Option 2: master clock source is the REGA clock pin
create_generated_clock -name clkdiv2 -source [get_pins REGA/C] -divide_by 2 \
[get_pins REGA/Q] 例2:除以2使用-edges选项
以下示例等效于示例1中定义的生成时钟:简单除法2
# waveform specified with -edges instead of -divide_by
create_generated_clock -name clkdiv2 -source [get_pins REGA/C] -edges {1 3 5} \ [get_pins REGA/Q] 例3:使用-edges和-edge_shift选项进行占空比更改和相移
通过使用-edge_shift选项,生成的时钟波形的每个边沿也可以单独移位正值或负值。仅在需要相移时才使用此选项。
-edge_shift选项不能与以下任何内容同时使用:
1,-divide_by
2,-multiply_by
3,-invert
考虑主时钟clkin,周期为10 ns,占空比为50%。它到达单元mmcm0,产生一个占空比为25%的时钟,移动90度。生成的时钟定义指的是主时钟边沿1,2和3.这些边沿分别出现在0ns,5ns和10ns。要获得所需波形,请将第一个和第三个边沿移动2.5ns。 create_clock -name clkin -period 10 [get_ports clkin]
create_generated_clock -name clkshift -source [get_pins mmcm0/CLKIN] -edges {1 2 3} \ -edge_shift {2.5 0 2.5} [get_pins mmcm0/CLKOUT]
# First rising edge: 0ns + 2.5ns = 2.5ns
# Falling edge: 5ns + 0ns = 5ns
# Second rising edge: 10ns + 2.5ns = 12.5ns 4.2 自动派生时钟(Automatically Derived Clocks)
自动派生的时钟也称为自动生成的时钟。如果已经定义了相关的主时钟,Vivado IDE会自动为时钟修改模块(CMBs)的输出引脚创建约束。
在Xilinx 7系列器件中,CMBs是:
1,MMCM*/ PLL*
2,BUFR
3, PHASER* 例:以下自动导出的时钟示例是由MMCM生成的时钟。主时钟clkin驱动MMCME2实例clkip / mmcm0的输入CLKIN。自动生成时钟的名称是cpuClk,其定义点是clkip / mmcm0 / CLKOUT。
5 时钟组(Clock Groups)
默认情况下,Vivado IDE会对设计中所有时钟之间的路径进行计时,除非您通过使用时钟组或错误的路径约束来指定。set_clock_groups命令禁用您标识的时钟组之间的时序分析,而不是同一组内的时钟之间的时序分析。与set_false_path约束不同,时钟之间的两个方向都会忽略时序。
可以使用-group选项多次指定多组时钟。如果设计中不存在组中的任何时钟,则该组变空。只有当至少两个组有效且不为空时,set_clock_groups约束才会保持有效。如果只有一个组保持有效且所有其他组都为空,则不应用set_clock_groups约束并生成错误消息。
使用原理图查看器或时钟网络报告可视化时钟树的拓扑,并确定哪些时钟不能一起定时。您还可以使用时钟交互报告来查看两个时钟之间的现有约束,并确定它们是否共享相同的主时钟 - 也就是说,它们具有已知的相位关系 - 或者识别没有共同周期的时钟(不可扩展)。
|