STA分析基础(六)STA环境

正确的约束对于分析STA结果很重要,只有准确指定设计环境,STA分析才能够识别出设计中的所有时序问题。STA的准备工作包括设置时钟指定IO时序特性以及指定伪路径和多周期路径

什么是STA环境?大部分数字设计是同步的,从前一个时钟周期计算出的数据在时钟有效沿上被锁存在触发器中。为了对这种设计执行STA,需要指定触发器的时钟、以及进入设计和退出设计的所有路径的时序约束。

4.1 Specifying Clocks

4.1.1(主)时钟定义

要定义时钟,我们需要提供以下信息:时钟源(Clock source)周期(Period)占空比(Duty cycle)边沿时间(Edge times)

以下是一个基本的时钟约束规范:

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

4.1.2.时钟不确定度(clock uncertainty)

可以使用set_clock_uncertainty约束来指定时钟周期的时序不确定度(uncertainty),该不确定度可用于对可能会减少有效时钟周期的各种因素进行建模。 这些因素可能是时钟抖动(jitter)以及可能需要在时序分析中考虑的任何其它悲观度。建立时钟不确定性声明,会使整个电路的时序变得更加严苛,满足设计的稳健性。

时钟不确定性的主要来由:
时钟偏差(clock skew):时钟源到达不同触发器的时间偏差
时钟抖动(clock jitter):时钟边沿的超前或滞后
时钟延迟(clock delay):网络延迟和源延迟

对于保持时间检查,时钟不确定度将用作需要满足的额外时序裕量,如下图所示:

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

以下命令可用于指定跨时钟边界路径上的时钟不确定度:

set_clock_uncertainty -from VIRTUAL_SYS_CLK -to SYSCLK -hold 0.05 
set_clock_uncertainty -from VIRTUAL_SYS_CLK -to SYSCLK -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

4.1.3 时钟延迟(clock latency)

时钟延迟分为两种类型:

  1. 网络延迟(network latency):从时钟定义点(create_clock)到触发器时钟引脚的延迟;
  2. 源延迟(source latency):指从时钟源到时钟定义点(create_clock)的延迟;

以下指令可以指定时钟的延迟:

# 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] 
# Specifv a max source latency
set_clock_latency 1.322 -source -max [get_clocks CFG_CLK] 
# Specify a rise latency
set_clock_latency 1.8 -rise [get_clocks MAIN_CLK]  
# Specify a fall latency
set_clock_latency 2.1 -fall [all_clocks] 

4.2 Generated Clocks

衍生时钟是从主时钟(master clock)派生而来的时钟,主时钟是指使用create_clock命令定义的时钟。在基于主时钟的设计中生成一个新时钟时,可以将这个新时钟定义为衍生时钟。

例如根据一个时钟周期为10的主时钟CLKP生成一个二分频衍生时钟CLKPDIV2,指令示例如下:

#主时钟 
create_clock -name CLKP 10 [get_pins UPLL0/CLKOUT] 
#衍生时钟
create_generated_clock -name CLKPDIV2 -source UPPL0/CLKOUT -divide_by 2 [get_pins UFF0/Q] #通过source指定其源时钟

可以在触发器的输出端定义一个新的时钟,即主时钟,而不是生成的时钟吗?

答案是肯定的,但是有一些缺点。定义一个主时钟而不是一个衍生时钟会创建一个新的时钟域,软件工具会当做异步时钟处理而不是同步时钟处理。将新时钟定义为衍生时钟不会创建新的时钟域,并且衍生时钟被认为与其主时钟同相衍生时钟不需要开发额外的约束。因此,尽量将内部新生成的时钟定义为衍生时钟,而不是将其声明为另一个主时钟。
主时钟和衍生时钟之间的另一个重要区别是时钟源的概念。在主时钟中,时钟源位于主时钟的定义点。而在衍生时钟中,时钟源是主时钟的源而不是衍生时钟的源。这意味着在时钟路径报告中,时钟路径的起点始终是主时钟的定义点。这样一来,与定义新的主时钟相比,衍生时钟具有很大优势,是不会自动考虑源延迟的。因此,由衍生时钟驱动的触发器的时钟引脚的总时钟延迟是主时钟源延迟、衍生时钟源延迟和衍生时钟网络延迟的总和。如下图所示:

相反的,如果时钟操作输出的时钟和源时钟没有太多关系(不是直接的倍频分频等),失去了相位和周期的继承性,那么此时输出的时钟就是可以定义为主时钟,而非衍生时钟。

4.3 Constraining Input Paths and Output Path

为什么需要进行输入输出路径的约束?

这里需要注意的一点是,STA无法检查不受约束的路径上的任何时序,因此需要约束所有路径以进行时序分析。输入输出路径的约束关系可以用来确定可靠地捕获DUA内部数据的可用时间

1.输入路径约束
下图展示了DUA的一条输入路径。触发器UFFO在设计的外部,为设计内部的触发器UFFI提供数据。数据通过输入端口INP1连接。时钟CLKA的定义指明了时钟周期,也就是在两个触发器UFF0和UFF1之间总的可用时间。外部逻辑所用时间为Tclk2q(发射触发器UFF0的CK到Q的延迟),加上Tc1(通过外部组合逻辑的延迟)。所以,延迟约束在输入引脚INP1定义了外部延迟Tclk2q加上TC1。在这个例子里,指定的延迟是相对于时钟CLKA的。

下面是输入延迟约束:

set Tclk2q 0.9
set Tc1 0.6
set_input_delay -clock CLKA -max [expr Tclk2q + Tc1]  [get_ports INP1]

该约束指定了在输入INP1的外部延迟是1.5ns, 该延迟是相对于时钟CLKA的。假设CLKA的时钟周期是2ns, 引脚INP1的逻辑在设计内部传播只有500ps(=2ns-1.5ns)可用了。该输入延迟规范映射到输入约束上就意味着,Tc2加上UFF1的Tsetup必须小于500ps,这样触发器UFF1才可以可靠的捕获到触发器UFFO发射出来的数据。注意,上面的外部延迟指定的是最大值。

让我们思考一种情况,我们必须同时考虑最大和最小延迟,如下图所示。下面是这个例子的约束:

create_clock -period 15 -waveform {5 12} [get_ports CLKP] 
set_input_delay -clock CLKP -max 6.7 [get_ports INPA] 
set_input_delay -clock CLKP -min 3.0 [get_ports INPA]

INPA的最大最小延迟是从CLKP到INPA的延迟计算得到的。最大和最小延迟分别对应着最长和最短路径。通常情况下也对应着最坏情况慢速(最大时序工艺角)和最佳情况快速(最小时序工艺角)。所以,最大延迟对应着最大时序工艺角下的最长路径,最小延迟对应着最小时序工艺角下的最短路径。在我们的例子里,Tck2q的最大和最小延迟值分别是1.1ns和0.8ns。组合逻辑路径延迟Tc1的最大延迟5.6ns和最小延迟2.2ns。在INPA上的波形表明了数据到达设计输入并且期望保持稳定的时间窗口。从CLKP到INPA的最大延迟是(1.1ns+5.6ns)=6.7ns。最小延迟是(0.8ns+2.2ns)=3ns。这些指定的延迟是对应时钟有效沿的。考虑到外部输入延迟,设计内部的可用建立时间最小是在慢速工艺角的(15ns-6.7ns)=8.3ns,快速工艺角的(15ns-3.0ns)=12ns。所以,8.3ns是在DUA内部可靠捕获数据的可用时间。

2.输出路径约束
本节用下面3个例子讲解了输入路径的约束。
Example A
下图所示的例子是经过DUA的输出端口的路径。Tc1和Tc2是经过组合逻辑的延迟。时钟CLKQ的周期定义了从触发器UFF0到触发器UFF1的总可用时间。外部逻辑的总延迟是Tc2加上Tsetup。这个总的延迟,Tc2+Tsetup,必须指定为输出延迟约束的一部分。注意,输出延迟是对应捕获时钟指定的。数据必须及时到达外部触发器UFF1,以满足建立时间的要求。

set Tc2 3.9
set Tsetup 1.1
set_output_delay -clock CLKQ -max [expr Tc2 + Tsetup]  [get_ports OUTB]

这指定了对应时钟沿的最大外部延迟是Tc2加上Tsetup, 应该相当于延迟5ns。最小延迟也可以用类似方法指定。

Example B
下图的例子有最大和最小延迟。最大路径延迟是7.4ns(即最大Tc2加上Tsetup,为7+0.4)。最小路径延迟是-0.2ns(即最小Tc2减去Thold,为0-0.2)。所以输出约束如下:

create_clock -period 20 -waveform {0 15} [get_ports CLKQ]
set_output_delay -clock CLKQ -min -0.2 [get_ports OUTC]
set_output_delay -clock CLKQ -max 7.4 [get_ports OUTC]

图示的波形表明OUTC何时必须保持稳定,确保可以被外部触发器可靠的捕获。该图描述了数据必须在要求的稳定区间之前就在输出端口准备好,而且要在稳定区间结束前保持稳定。这映射了DUA内部逻辑到输出端口OUTC的时序要求。

Example C
这里是另一个说明输入输出约束的例子。这个模块有两个输入,DATAIN和MCLK,1个输出DATAOUT。下图为预期的波形。

reate_clock -period 100 -waveform {5 55} [get_ports MCLK]
set_input_delay 25 -max -clock MCLK [get_ports DATAIN]
set_input_delay 5 -min -clock MCLK [get_ports DATAIN]
set_output_delay 20 -max -clock MCLK [get_ports DATAOUT]
set_output_delay -5 -min -clock MCLK [get_ports DATAOUT]

3. 时序路径组(Timing Path Groups)
设计中的时序路径可以被当作路径的集合。每条路径都有一个起点和一个终点。下图所示为一些示例路径。

在STA时,路径是依据有效的起点和有效的终点来记录的。有效的起点包括:input ports、同步器件的clk pin,比如触发器和存储器。有效的终点是output ports,同步器件的data input pins。所以,一条有效的时序路径可以是:

  • input port→output port
  • input port→input of a flip-flop or a memory
  • clock pin of a flip-flop or a memory→input of flipflop or a memory
  • clock pin of a flip-flop→output port,
    所以上图中包含如下时序路径:
    1) 输入端口A到UFFA/D;
    2) 输入端口A到输出端口Z;
    3) UFFA/CK到UFFB/D;
    4) UFFB/CK到输出端口Z。

时序路径可以根据路径终点相关的时钟被分为不同的路径组(Path Group)。所以,每个时钟都有一组和它相关的路径。也会有默认路径组,它包括了所有非时钟(异步)路径。举例:
在下图中,路径组是:
1) CLKA组:输入端口A到UFFA/D;
2) CLKB组:UFFA/CK到UFFB/D;
3) 默认组:输入端口A到输出端口Z,UFFB/CK到输出端口Z.

静态时序分析和报告通常是在每个路径组分别进行的。

4.4 Design Rule Checks(DRC)

STA中两个常用的设计规则是最大转换时间max_transition最大电容max_capacitance。这些规则将会检查设计中的所有端口和引脚是否满足转换时间电容的规定约束
这些范围可以用下面的命令来指定:

• set_max_transition
• set_max_capacitance

作为STA的一部分,任何设计规则的违例(violation)均以裕量(slack)的形式报告。这些规则可以使用以下命令指定:

set_max_transition 0.6 IOBANK
# Sets a limit of 600ps on IOBANK.
set_max_capacitance 0.5 [current_design]
# Max capacitance is set to 0.5pf on all nets in current design.
# 在当前设计中设定所有线的最大电容为0.5pf

4.5 Virtual Clocks

虚拟时钟(Virtual Clocks)是一个存在的时钟,但是和设计的任何引脚或者端口都不相关。它被用来在STA中当作参考时钟,指定相对于时钟的输入输出延迟。下图所示的例子就是虚拟时钟。DUA从CLK_CORE得到它的时钟,但是驱动输入端口ROW_IN的时钟是CLK_SAD。在这种情况下,如何指定输入端口ROW_IN的IO约束呢?同样的问题也发生在输出端口STATE_0。

为了处理这种情况,可以定义没有源端口或源引脚的虚拟时钟。在上图的例子,可以为时钟CLK_SAD和CLK_CFG定义虚拟时钟。

create_clock -name VIRTUAL_CLK_SAD -period 10 -waveform {2 8}
create_clock -name VIRTUAL_CLK_CFG -period 8  -waveform {0 4}
create_clock -period 10 [get_ports CLK_CORE]

定义好虚拟时钟后,就可以相对于这些虚拟时钟指定IO约束。

```bash
set_input_delay -clock VIRTUAL_CLK_SAD -max 2.7 
[get_ports ROW_IN]

set_output_delay -clock VIRTUAL_CLK_CFG -max 4.5 
[get_ports STATE_O]

下图说明了这些输入路径的时序关系。DUA的输入路径被约束为5.3s或者更少。

4.6 Refining the Timing Analysis

用于精细化约束分析的四个常用命令是:

1)set_case_analysis:在单元输入引脚或者输入端口指定常量;
2)set_disable_timing:中断单元的时序弧;
3)set_false_path:指定路径不是真实的,表明这些路径不需要在STA中检查;
4)set_multicycle_path:指定路径可以有大于1个时钟周期。
约束set_false_path和set_multicycle_path会在第8章有详细的讨论。

4.6.1 Specifying Inactive Signals(指定无效信号)

在设计中,在芯片的指定模式下某些信号是常量。例如,如果芯片有DFT逻辑,那在普通的功能模式下,芯片的TEST引脚就应该为0。给STA指定常量通常是很有用的。这会帮助减少分析空间,不报出任何不相关的路径。例如,如果TEST引脚不设为常量,可能存在一些奇怪的长路径本该在功能模式下永远不存在。这些常量信号用约束set_case_analysis来指定。

set_case_analysis 0 TEST

set_case_analysis 0 [get_ports {testmode[3]}]
set_case_analysis 0 [get_ports {testmode[2]}]
set_case_analysis 0 [get_ports {testmode[1]}]
set_case_analysis 0 [get_ports {testmode[0]}]

如果设计有多个功能模式且只需要分析其中一个功能模式,则可以用情况分析来指定需要分析的真正模式。

set_case_analysis 1 func_mode[0]
set_case_analysis 0 func_mode[1]
set_case_analysis 1 func_mode[2]

注意情况分析可以指定在设计的任一引脚上。另一个常见的情况分析应用是,当设计可以在多个时钟下运行,可以通过多路复用器来控制选择合适的时钟。为了让STA分析简化并减少CPU运行时间,让STA分别在不同的时钟选择下进行是很有益的。下图所示的例子说明了在不同设定下多路复用器选择不同的时钟。

set_case_analysis 1 UCORE/UMUX0/CLK_SEL[0]
set_case_analysis 1 UCORE/UMUX1/CLK_SEL[1]
set_case_analysis 0 UCORE/UMUX2/CLK_SEL[2]

第1个set_case_analysis让MIICLK选择了PLLdiv16。PLLdiv8的时钟路径被阻断了,没有通过多路复用器传播。所以,没有时序路径是用时钟PLLdiv8分析(假设这个时钟没有在多路复用器之前到达任何触发器)。类似的,最后的set_case_analysis让ADCCLK选择了SCANCLK,CLK200的时钟路径被阻断了。

4.6.2 Breaking Timing Arcs in Cells(中断单元内部的时序弧)

每个单元都有从输入到输出的时序弧,1条时序路径可能穿过其中一条单元内时序孤。在某些情况下,可能穿过单元的特定路径不可能发生。例如,思考一种场景,时钟和多路复用器的选择端相连,而多路复用器的输出端又是数据路径的一部分。在这种情况下,中断多路复用器的选择引脚和输出引脚可能是很有用的。下图所示为这样的例子。经过多路复用器选择端的路径不是一条有效的路径。这样的时序弧可以用set_disable_timing中断。

set_disable_timing -from S -to Z [get_cells UMUX0]

因为这个时序弧不再存在了,需要分析的时序路径相应地减少了。另一个类似用法的例子是禁止触发器的最小时钟脉冲宽度检查。
使用set_disable_timing时要小心,因为它能删除所有经过指定引脚的时序路径。如果可以的话,最好使用命令set_false_path和set_case_analysis。

4.6.3 伪路径时序分析

指定实际不存在的路径,这意味着在STA中不需要检查这些路径。伪路径约束很重要,对于跨时钟域的模块之间的路径,不予分析。注意,伪路径约束是单向的。伪时序路径后文重点分析。

4.6.4多周期路径时序分析

信号传输可能花费超过一个时钟周期的路径。输入到输出的延迟跨越了多个时钟周期。多周期时序路径后文重点分析。

后续暂时不更新了,可以参考:静态时序分析圣经翻译计划——汇总篇 - 知乎 (zhihu.com)

来自广东
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇