STA环境 - 时钟

Posted Starry丶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STA环境 - 时钟相关的知识,希望对你有一定的参考价值。

目录

STA环境配置中对时钟如何约束

XDC约束技巧之时钟篇


1. 指定时钟create_clock

时钟树: 时序电路中从时钟源到各触发器CK端时钟路径构成的结构。

芯片端口输入输出的主时钟、以及RXCLK/TXCLK等随路时钟都必须由用户使用create_clock自主创建,该时钟就是时序分析的起点。

配置的SDC如下

# 名称: SYSCLK
# 周期: 20ns
# 占空比: 20ns内上升沿时刻为0ns,下降沿时刻为5ns
# 端口: SCLK

create_clock -name SYSCLK -period 20 -waveform 0 5 [get_ports SCLK]

# 名称(默认端口名): CLKA
# 周期: 20ns
# 占空比(默认-waveform (0,period/2): 50%
# 端口: CLKA

create_clock -period 20 [get_ports CLKA]

1.1. 时钟延迟set_clock_latency

分为网络延迟和源延迟。

网络延迟(network latency): 表示芯片内部时钟定义点到第一级触发器CK端的时钟延迟,即input2reg。

源延迟(source latency): 表示芯片外部时钟源(比如晶振时钟、数据随路时钟)到时钟定义点的时钟延迟

如下图所示。


理论上这些时钟延迟都为0,可以在STA时使用set_clock_latency 指令指定时钟树综合前所有终点的时钟延迟估计值。一旦时钟树建立完毕,就会忽略该约束,并使用实际走线延迟替代。

一般指定网络延迟即可,SDC如下

# 时钟CLK_CONFIG的上升沿和下降沿时钟延迟均为0.8ns
set_clock_latency 0.8 [get_clocks CLK_CONFIG]

# 时钟MAIN_CLK的上升沿时钟延迟为1.8ns
set_clock_latency 1.8 -rise [get_clocks MAIN_CLK]

# 所有时钟定义的下降沿时钟延迟为2.1ns
set_clock_latency 2.1 -fall [all_clocks]

# 时钟SYS_CLK的上升沿和下降沿源时钟延迟均为1.9ns
set_clock_latency 1.9 -source [get_clocks SYS_CLK]

1.2. 时钟不确定度(时钟抖动)set_clock_uncertainty

从PLL出来的时钟信号周期存在一定程度的抖动。

当然理想情况下抖动为0,可以在STA时指令设定一个时间窗口,该窗口内任何时候都有可能产生时钟沿,这样的时间窗口就可以表示抖动量。

如下图

时钟抖动会提高对建立时间裕度和保持时间裕度要求,因此分为setup uncertainty 和 hold uncertainty。

如下图所示,effective clock period为根据时钟定义确立的预期时钟沿位置,setup uncertainty为早于预定时钟沿的的不确定度,hold uncertainty为晚于预定时钟沿的的不确定度

SDC指令如下

# 时钟CLK_CONFIG的setup uncertainty
set_clock_uncertainty -setup 0.2 [get_clocks CLK_CONFIG]

# 时钟CLK_CONFIG的hold uncertainty
set_clock_uncertainty -hold 0.05 [get_clocks CLK_CONFIG]

# 时钟SYS_CLK到CFG_CLK的跨时钟路径的hold uncertainty 为0.05ns
set_clock_uncertainty -from SYS_CLK -to CFG_CLK -hold 0.05

# 时钟SYS_CLK到CFG_CLK的跨时钟路径的setup uncertainty 为0.1ns
set_clock_uncertainty -from SYS_CLK -to CFG_CLK -setup 0.1

时钟偏斜(clock skew): 时钟信号从时钟源PLL到达不同终点的时间差。时钟延迟和时钟抖动导致了时钟偏斜。

1.3. 时钟过渡时间set_clock_transition

指时钟从阈值电压的起始点到终止点所需的时间。压摆率(Slew rate)是过渡时间的倒数。

指令如下

# 时钟CLK_CONFIG的上升沿过渡时间为0.1ns
set_clock_transition -rise 0.1 [get_clocks CLK_CONFIG]

# 时钟CLK_CONFIG的下降沿过渡时间为0.12ns
set_clock_transition -fall 0.12 [get_clocks CLK_CONFIG]

当然在实际仿真和分析中,经常直接使用如下图的理想波形进行时序分析,将电平转换时间近似成零。

2. 衍生时钟create_generated_clock

使用指定时钟(create_clock指令产生的时钟)经过MMCM/PLL/BUFR产生的时钟、或者是用户自行设计出来的时钟,需要约束衍生时钟create_generated_clock

4.1 Verilog 同步与异步
深度解析Create_clock与Create_generated_clock的区别

指令如下

# 名称: CLKP 
# 周期: 10ns
# 占空比: 50%
# 端口: UPLL0/CLKOUT
create_clock -name CLKP -period 10 [get_pins UPLL0/CLKOUT]

# 名称: CLKPDIV2
# 源时钟: UPPL0/CLKOUT
# 分频系数: 2
# 端口: UFF0/Q
create_generated_clock -name CLKPDIV2 -source [get_pins UPLL0/CLKOUT] -divide_by 2 [get_pins UFF0/Q]

如果衍生时钟有多个源,则需要指定哪个是源时钟。

3. 划定时钟域set_clock_groups

静态时序分析—set_clock_groups

可将多个时钟分成多个组,通常时钟组之间为异步的。

# CLKA和CLKB为同步时钟,且与CLKC异步
set_clock_groups -asynchronous -group CLKA CLKB -group CLKC

# CLKA和CLKB为同步时钟,且与CLKC以及CLKC的衍生时钟 异步
set_clock_groups -asynchronous -group CLKA CLKB -group [get_clocks -include_generated_clocks CLKC]

如果两个时钟无需进行STA,但两个时钟都来自同一根线,就需要进行逻辑隔离,如下图

# C1和C2为来自同一根线,但相互之间不需要STA
set_clock_groups -logically_exclusive -group C1 -group C2

如果两个时钟需要进行STA,但两个时钟都来自同一根线,就需要进行逻辑隔离,如下图

配置STA环境

文章目录


本章节介绍了如何为静态时序分析配置环境。正确的约束对于分析STA结果很重要,只有准确指定设计环境,STA分析才能够识别出设计中的所有时序问题。STA的准备工作包括设置时钟、指定IO时序特性以及指定伪路径和多周期路径。在继续学习下一章的时序验证之前,请务必全面了解本章节。



7.1 什么是STA环境(What is the STA Environment)

大部分数字设计是同步的,从前一个时钟周期计算出的数据在时钟有效沿上被锁存在触发器中。考虑图7-1中的典型同步设计。假定待分析设计(Design Under Analysis, DUA)会与其他同步设计交互。这意味着DUA从一个时钟触发器获取数据并将数据输出至DUA外的另一个时钟触发器。

为对这种设计执行STA,需要指定触发器的时钟,且需要进入和退出设计的所有路径的时序约束。

图7-1中的例子假定这里只有一个时钟和 C 1 C1 C1 C 2 C2 C2 C 3 C3 C3 C 4 C4 C4,和 C 5 C5 C5表示组合逻辑块,其中 C 1 C1 C1 C 5 C5 C5在设计之外。

在一个典型设计中,可以有多个时钟,且存在多个路径从一个时钟域到另一个时钟域。以下部分描述了在这个场景下如何配置STA环境。



7.2 指定时钟(Specifying Clocks)

定义一个时钟,需要以下信息:

  • i i i. 时钟源(Clock source):可以是设计的一部分,或是设计内单元的引脚(通常是时钟生成逻辑的一部分);
  • i i ii ii. 周期(Period):时钟的时间周期;
  • i i i iii iii. 占空比(Duty cycle):高电平持续时间(正相位)和低电平持续时间(负相位);
  • i v iv iv. 边沿时间(Edge time):上升沿和下降沿的时刻;

基本定义如图7-2所示。通过定义时钟,所有的内部时序路径(所有触发器到触发器的路径)均受到约束;这意味着所有的内部路径可仅使用时钟约束(clock specification)来分析。时钟约束指定触发器到触发器的路径必须占用一个周期。我们将介绍占用一个周期时间的要求怎样可以放宽。

这里有一个基本时钟约束/规范(specification和contraint在SDC规格中是同义词):

create_clock \\
-name SYSCLK \\
-period 20 \\
-waveform 0 5 \\
[get_ports2 SCLK]

该时钟名为SYSCLK,并在端口SCLK上定义。SYSCLK的周期指定为 20 20 20个单位,如果未指定,默认时间单位为纳秒(通常,时间单位会在技术库中进行指定)。waveform中的第一个自变量指定出现上升沿的时刻,第二个自变量指定出现下降沿的时刻。

waveform选项中可以指定任意数量的边沿。但是,所有边沿必须在一个周期内。边沿时刻从零时刻之后的第一个上升沿开始,然后是下降沿,然后再是上升沿,以此类推,这意味着waveform列表中的所有时刻值必须单调增加。

-waveform time_rise time_fall time_rise time_fall ...

另外,必须指定偶数个边沿时刻。waveform选项将指定一个时钟周期内的波形,然后不断重复。如果未指定任何waveform选项,则默认值为:

-waveform 0, period/2

如下图7-3所示是一个没有指定waveform选项的时钟约束的示例:

create_clock -period 5 [get_ports SCAN_CLK]

在此约束中,由于未指定-name选项,因此时钟的名称与端口的名称相同,即SCAN_CLK

下图7-4是时钟约束的另一个示例,其中波形的边沿在一个周期的中间位置。

create_clock -name BDYCLK -period 15 \\
	-waveform 5 12 [get_ports GBCLK]

所创建时钟的名字为BDYCLK且其被定义在端口GBLCLK上。实际上,将时钟名和端口名保持一致最好。

以下是更多的时钟约束示例:

# See Figure 7-5(a):
create_clock -period 10 -waveform 5 10 [get_ports FCLK]
# Creates a clock with the rising edge at 5ns and the
# falling edge at 10ns.
# See Figure 7-5(b):
create_clock -period 125 \\
-waveform 100 150 [get_ports ARMCLK]
# Since the first edge has to be rising edge,
# the edge at 100ns is specified first and then the
# falling edge at 150ns is specified. The falling edge
# at 25ns is automatically inferred.
# See Figure 7-6(a):
create_clock -period 1.0 -waveform 0.5 1.375 MAIN_CLK
# The first rising edge and the next falling edge
# is specified. Falling edge at 0.375ns is inferred
# automatically.
# See Figure 7-6(b):
create_clock -period 1.2 -waveform 0.3 0.4 0.8 1.0 JTAG_CLK
# Indicates a rising edge at 300ps, a falling edge at 400ps,
# a rising edge at 800ps and a falling edge at 1ns, and this
# pattern is repeated every 1.2ns.

还有一些时钟约束如下:

create_clock -period 1.27 \\
-waveform 0 0.635 [get_ports clk_core]
create_clock -name TEST_CLK -period 17 \\
-waveform 0 8.5 -add [get_ports ip_io_clk[0]]
# The -add option allows more than one clock
# specification to be defined at a port.

除了上述属性外,还可以在时钟源处指定过渡时间/压摆(transition_time/slew)。在某些情况下,例如顶层的输入端口或某些PLL的输出端口,工具无法自动计算出过渡时间。在这种情况下,在时钟源处显式地指定过渡时间很有用,这可以使用set_clock_transition命令来指定。

set_clock_transition -rise 0.1 [get_clocks CLK_CONFIG]
set_clock_transition -fall 0.12 [get_clocks CLK_CONFIG]

这个约束仅适用于理想时钟,一旦构建了时钟树就将其忽略,因为此时将会使用时钟引脚上的实际过渡时间。如果在输入端口上定义了时钟,也可以使用set_input_transition命令(参见7.7节)来约束时钟的压摆。


7.2.1 时钟不确定度(Clock Uncertainty)

可以使用set_clock_uncertainty约束来指定时钟周期的时序不确定度(uncertainty),该不确定度可用于对可能会减少有效时钟周期的各种因素进行建模。 这些因素可能是时钟抖动(jitter)以及可能需要在时序分析中考虑的任何其它悲观因素。

set_clock_uncertainty -setup 0.2 [get_clocks CLK_CONFIG]
set_clock_uncertainty -hold 0.05 [get_clocks CLK_CONFIG]

注意,建立时间检查的时钟不确定度将减少可用的有效时钟周期,如图7-7所示。对于保持时间检查,时钟不确定度将用作需要满足的额外时序裕量。

以下命令可用于指定跨时钟边界路径上的时钟不确定度,称为时钟间不确定度(inter-clock uncertainty)。

set_clock_uncertainty -from VIRTUAL_SYS_CLK -to SYS_CLK \\
-hold 0.05
set_clock_uncertainty -from VIRTUAL_SYS_CLK -to SYS_CLK \\
-setup 0.3
set_clock_uncertainty -from SYS_CLK -to CFG_CLK -hold 0.05
set_clock_uncertainty -from SYS_CLK -to CFG_CLK -setup 0.1

图7-8中为两个不同时钟域SYS_CLKCFG_CLK之间的路径。根据上述时钟间不确定度的约束,将 100 p s 100ps 100ps用作建立时间检查的不确定度,将 50 p s 50ps 50ps用作保持时间检查的不确定度。


7.2.2 时钟延迟(Clock Latency)

可以使用set_clock_latency命令指定时钟的延迟。

# Rise clock latency on MAIN_CLK is 1.8ns:
set_clock_latency 1.8 -rise [get_clocks MAIN_CLK]
# Fall clock latency on all clocks is 2.1ns:
set_clock_latency 2.1 -fall [all_clocks]
# The -rise, -fall refer to the edge at the clock pin of a
# flip-flop.

时钟延迟有两种类型:网络延迟(network latency)源延迟(source latency),触发器时钟引脚上的总时钟延迟是源延迟和网络延迟之和:

  • 网络延迟是指从时钟定义点(create_clock)到触发器时钟引脚的延迟;
  • 源延迟,也称为插入延迟(insertion delay),是指从时钟源到时钟定义点的延迟,源延迟可能代表片上或片外延迟,图7-9展示了这两种情况;

以下是一些指定源延迟和网络延迟的命令示例:

# Specify a network latency (no -source option) of 0.8ns for
# rise, fall, max and min:
set_clock_latency 0.8 [get_clocks CLK_CONFIG]
# Specify a source latency:
set_clock_latency 1.9 -source [get_clocks SYS_CLK]
# Specify a min source latency:
set_clock_latency 0.851 -source -min [get_clocks CFG_CLK]
# Specify a max source latency:
set_clock_latency 1.322 -source -max [get_clocks CFG_CLK]

源延迟和网络延迟之间的一个重要区别是:一旦为设计建立了时钟树,就可以忽略网络延迟(假设指定了set_propagated_clock命令)。但是,即使在建立时钟树之后,源延迟也会保留。网络延迟是在进行时钟树综合(Clock Tree Synthesis)之前对时钟树延迟的估计值。在时钟树综合完成后,从时钟源到触发器时钟引脚的总时钟延迟是源延迟加上时钟树从时钟定义点到触发器的实际延迟

下一节将介绍衍生时钟(generated clocks),7.9节将介绍虚拟时钟(virtual clocks)。



7.3 衍生时钟(Generated Clocks)

以上是关于STA环境 - 时钟的主要内容,如果未能解决你的问题,请参考以下文章

收录近500篇文章|学习路线|基础知识|接口|总线|脚本语言|芯片求职|安全|EDA|工具|低功耗设计|Verilog|低功耗|STA|设计|验证|FPGA|架构|AMBA|书籍|

收录近500篇文章|学习路线|基础知识|接口|总线|脚本语言|芯片求职|安全|EDA|工具|低功耗设计|Verilog|低功耗|STA|设计|验证|FPGA|架构|AMBA|书籍|

收录近500篇文章|学习路线|基础知识|接口|总线|脚本语言|芯片求职|安全|EDA|工具|低功耗设计|Verilog|低功耗|STA|设计|验证|FPGA|架构|AMBA|书籍|

FPGA/数字IC手撕代码11——基于PWM驱动的蜂鸣器verilog开发

总结集成电路设计中的时钟策略

在FPGA中,如何实现一个时钟信号的可控延时? (用高频50MHZ的时钟去延时一个22KHZ的信号)