STA-时序分析
1、set_input_delay/set_output_delay
input delay和output delay是在SDC中经常会遇到的问题,看似简单其实还有很多模棱两可的问题的。特别是为什要设置input delay和output delay?常用的30%和70%的原因以及input delay和output delay有些情况下会设置负值。
1.1、设置input delay和output delay
对于一个芯片设计来说,芯片的外部都会有一些器件和芯片进行数据的交换,简单的示意图如下所示。DUA是我们的设计芯片,外部的器件从STA的角度被简化为两个寄存器和一些组合逻辑。
如上图所示,如果在design设计上没有对DATAIN DATAOUT的数据进行约束,那么STA工具并不能够得到有外部寄存器经过组合逻辑到达DATAIN的时间,同时也不知道DATAIN信号和输入的MCLK是什么关系(如果有多个时钟,到底和哪个时钟是有关的??)和内部采样reg的关系。input delay和output delay就是告诉STA工具芯片外部的信号的delay信息。如果知道芯片外部器件的data sheet,那么input delay和output delay要严格按照data sheet的要求去设置,如果没有就需要和designer确认具体的时序图,根据design的要求合理设置。
如果不设置input delay和output delay,那么工具并不知道上述信息,也就是说工具并不会分析这条path。由于大多数信号进入芯片内部都是需要和芯片内部进行数据传递的,所以必须通过设计input delay和output delay的方式告诉工具此处的timing信息,这样才能保证输入的信号能够被芯片内部正确的采样,从而保证芯片工作正常。
反之,如果某些信号是一些在芯片正常工作之前就稳定的常值信号(bist en 等),那么实际上是没有必要对这些信号进行timing 分析的,所以这些信号可以不用设计input delay来简化约束。
对于input delay和output delay关键是理解下面两句话的含义
set_input_delay是说该输入信号是在时钟沿后多长时间到达模块的port上的 。
set_output_delay是说该输出信号在后级模块中需要在时钟沿之前提前多长时间准备好。
这里以input delay为例,output delay设置大同小异。set_input_delay命令语法如下
SYNTAX
status set_input_delay
delay_value
[-reference_pin pin_port_name]
[-clock clock_name]
[-clock_fall]
[-level_sensitive]
[-network_latency_included]
[-source_latency_included]
[-rise]
[-fall]
[-max]
[-min]
[-add_delay]
port_pin_list
Data Types
delay_value float
clock_name collection of 1 object
port_pin_list collection
这里讲解几个主要的参数
port_pin_list 指定设置input delay的port是哪些
-clock 指定设置input delay的port是相对于哪个时钟设置的,即由port进入的signal信号是有哪个clock采样的,例如 组APB总线的信号,进入芯片内部采样时钟应该是APB clk。
-max/min 指定input delay的最大值和最小值,分别用于STA的setup check和hold check计算。
-clock_fall 如果外部时钟是下降沿发送数据,需要指定该参数,让工具进行下降沿check。默认都是进行上升沿check的。
1.2、常用70%设置
input delay最常用的设置是对一组信号设置为采样时钟的70%.例如APB总线的输入时钟是apb_clk,对于apb的pwdata pradata port的input delay和output delay约束为
set_input_delay -max [expr 0.7 * apb_clk] -clock apb_clk [get_ports apb_pwdata]
set_output_delay -max [expr 0.7 * apb_clk] -clock apb_clk [get_ports apb_prdata]
为什么要设置70%?因为input delay是约束芯片外部的delay 情况,也就是外部约束70%,内部剩余30%的余量,因为外部的情况并不太清楚,所以估计的悲观一些,output delay原因同理。如果估计的过于乐观,那么如果都是这么设置的有可能导致两个block接上之后timing设置都不能满足timing check要求
有时,我们还会看到一些对于input delay的特别设置,如
set_input_delay -min 2 -clock apb_clk [get_ports apb_pwdata]
这样设置一般出现在block的顶层模块和TOP交互的信号,由于这是从外部传进来的信号如果不设置input delay的min,那么往往接口处会出现大量的hold violation,但是由于顶层到block的path delay并不准确,所以这些hold往往在block时并不去处理,但是在auto fix hold时,如果不指定group,那么工具会在接口处插一些buffer,有可能这些buffer是不需要的,为了减少对顶层的影响,所以此处设置一个比较大的input delay min,不让工具报出这些violation,从而也就避免了去插buffer fix hold。
1.3、output delay值为负值
考虑如下的timing path
假定都是相对于时钟的上升沿采样数据,同时假定所有的net delay为0
对于input delay,可以看到数据在片外的reg上升沿25ns之后,数据才从Q端发出,即到达DATAIN port时外部的delay已经有25ns;同时上一个数据能够在MCLK上升沿之后保持5ns,即数据如果被芯片内部clk采样那么数据也会保持5ns,也就是说对于DUA的第一个寄存器来说天然就有5ns的hold margin。所以对应的input delay应该按照如下设置
set_input_delay 25 -max -clock MCLK [get_ports DATAIN]
set_input_delay 5 -min -clock MCLK [get_ports DATAIN]
对于output delay,可以看到外部的寄存器要求的setup time是20ns,hold time是5ns。由于output delay的含义是说数据在时钟沿前什么时候稳定。所以为了满足要求,output delay应该按照如下设置
set_output_delay 20 -max -clock MCLK [get_ports DATAOUT]
set_output_delay -5 -min -clock MCLK [get_ports DATAOUT]
1.4、input delay 值为负值
考虑如下的timing path
即片外的CLKA在到达UFF1的clk path明显比data path的delay要长(由于CTS等原因导致)1ns,即在UFF1来看数据提前CLKA到达UFF1/D.假设
Tclk2q=2ns
Tc1=3ns
UFF1 Tsetup=1ns Thold=0.5ns
那么对于DUA的INP1来说应该如何设置input delay
set_input_delay 6 -max -clock CLKA [get_ports INP1]
set_input_delay -1 -min -clock CLKA [get_ports INP1]