静态时序分析--时序约束
目录
- 1.时钟约束
- 1.1创建时钟
- 1.2.生成时钟
- 1.3虚拟时钟
- 1.4 最小时钟脉宽
- 2.I/O延时约束
- 2.1设置输入延时
- 2.2设置输出延时
- 3.I/O环境建模约束
- 3.1输入驱动建模
- 3.2输出负载建模
- 4.时序例外
- 4.1多周期路径设置(multicycle path)
- 4.2伪路径设置(false_path)
- 4.3最大延时和最小延时设置
- 5.恒定约束状态
- 6.屏蔽时序弧线
- 7.时序设计规则约束
SDC的全称为Synopsys设计约束,SDC的格式也是一种业界标准。SDC一般包括时钟约束、IO输入输出约束、伪路径约束等内容。
1.时钟约束
在同步电路设计中,各功能逻辑单元之间的数据传输有一个同步信号控制,这个执行统一只会的信号就是时钟信号,因此需要在设计之初创建时钟,基于该时钟频率进行优化设计,使设计性能达到时序收敛的目的。
1.1创建时钟
时钟信号为一个周期性信号,定义时钟需要包括以下主要基本信息:
(1)时钟源点
时钟可以根据情况定义设计中一个端口,也可以是逻辑单元的PIN脚。
(2)时钟周期
时钟周期定义为是时钟的振荡周期,为时钟频率的倒数。时钟周期是时序分析中最基本、最小的时间单位。
(3)时钟占空比
时钟占空比主要定义时钟高低电平在一个时钟周期内的分布情况。
通过使用SDC命令create_clock来创建时钟(create clock),比如通过该命令定义一个从CLK的端口输出并且时钟周期为10、占空比为50%的时钟信号,命令如下:
create_clock -period 10 -waveform {0,5} [get_ports clk]
通过该命令,可以对所有的内部触发器到触发器类型的路径进行约束。
占空比为50%的设置是默认的,即如果没有定义占空比信息,则默认占空比为50%,下面定义一个占空比不为50%的时钟,命令如下:
create_clock -name BDYCLK -period 15 -waveform {5,12} [get_ports CLK]
(4)时钟转换延时
时钟转换延时定义时钟在高低电平状态下切换所需要的延时。
通过使用SDC命令set_clock_transition来定义时钟转换延时信息,如下图:
命令如下:
set_clock_transition -rise 0.1 [get_clocks clk]
set_clock_transition -fall 0.12 [get_clocks clk]
以上命令定义为clk的时钟信号上升沿转换时为0.1ns,下降沿转换延时为0.12ns。
(5)时钟不确定性
由于实际时钟本身与理想时钟有一定的误差,所以通过时钟不确定来涵盖这些实际的导致误差的因素,比如时钟抖动、时钟偏斜等因素。
由于芯片被捕各个触发器的位置不同,导致每个触发器到时钟源点的距离不相同,所以时钟源点的时钟信号到达每个触发器的时间与理想情况的时间有误差。如下图所示,时钟源点到达触发器P4点的时间为1.3ns,而到达触发器P1点的时间为
0.5ns,这样,时钟不确定性的延时为0.8ns。
通过使用SDC命令set_clock_uncertainty来定一定时钟不确定性信息,命令如下:
set_clock_uncertainty -setup 0.2 [get_clocks clk]
set_clock_uncertainty -hold 0.05 [get_clocks clk]
以上命令定义为CLK时钟信号的不确定性为:建立时间为0.2ns,保持时间为0.05ns,结果如下图:
设计中可能存在由不同的时钟信号驱动的时序路径,如下图
不同时钟域之间也可以定义时钟不确定性,命令如下:
set_clock_uncertainty -from CLK1 -to CLK2 -hold 0.05
set_clock_uncertainty -from CLK2 -to CLK1 -hold 0.05
set_clock_uncertainty -from CLK1 -to CLK2 -setup 0.1
set_clock_uncertainty -from CLK2 -to CLK1 -setup 0.1
以上命令定义为CLK1和CLK2时钟之间的不确定性为:建立时间为0.1ns,保持时间为0.05ns。
(6)时钟延迟
时钟信号从时钟源输出到达时序单元时钟输入端是需要传播时间的。时钟延时由时钟源点到达时钟定义的端口的延迟(source latency)和时钟定义的端口到时序单元时钟输入端口的延迟(network latency)两部分组成,如下图:
通过SDC命令set_clock_latency来定时钟延迟信息,命令如下:
set_clock_latency 1.8 -rise [all_clocks]
set_clock_latency 2.1 -fall [all_clocks]
以上命令定义了时钟网络延迟,上升延迟为1.8ns,下降延迟为2.1ns。
set_clock_latency 0.851 -source -min [get_clocks CLK]
set_clock_latency 1.322 -source -max [get_clocks CLK]
以上命令定义了时钟源信号到达时钟CLK输出端的延时,最大延迟为1.322ns,最小延迟为0.851ns。
时钟网络延迟与时钟源延迟的一个明显区别是,时钟网络哟延迟是时钟树生成前的设置。当实际时钟树生成后,时钟网络延迟的设置会通过命令set_propagated_clock被时钟树的实际结果替代,而时钟源延迟会一直存在,即使使用实际的时钟树传播延时信息。
1.2.生成时钟
在设计中有这样一类时钟,它是基于一个主时钟并通过相关逻辑转换后,在相位、频率、占空比等方面和主时钟有一定变化的分支时钟。我们可以把这类时钟定义为生成时钟,因此,生成时钟的时钟源来自主时钟,其他位参考主时钟,如下图:
通过SDC命令:
create_clock -period 10 -waveform {0,5} {get_ports CLK}
create_generated_clock -name CLKDIV3 -source -divide_by 3 [get_pins FDD/Q]
以上命令定义一个基于主时钟CLK的分支时钟CLKDIV3,CLKDIV3的频率是主时钟的1/3,即生成时钟的周期是主时钟的3倍。生成时钟CLKDIV3与主时钟CLK的时钟信号波形的对比图如下:
可以对生成时钟在相位上进行设置,命令如下:
create_clock -period 10 [get_ports CLK]
create_generated_clock -name CLKDIV2 -divide_by 2 -invert -source CLK [get_pins DFF/Q]
以上命令定义一个基于主时钟CLK的分支时钟CLKDIV2,CLKDIV2的周期为主时钟的2倍,其相位与主时钟相反。对比图如下:
可以对生成时钟的占空比进行设置,命令如下:
create_clock -period 10 -waveform {0,5} [get_ports CLK]
create_generated_clock -name CLK1 -source CLK -edges {1 1 5} -edge_shift {0 5 0} [get_pins DFF/Q]
以上命令定义一个基于主时钟CLK的分支时钟CLK1,CLK1的周期为主时钟的两倍,其占空比为高电平的25%。生成时钟CLK1与主时钟CLK的时钟信号波形的对比图如下图所示:
注意:edges选项指明了生成时钟的边沿是如何与master_clock对齐的,{1,1,5}上升沿和第一个沿对齐,下降沿和第一个沿对齐,第二个上升沿和第5个沿对齐,edge_shift表示这三个沿延时的多少,{0,5,0}表示第一个上升沿不延时,第一个下降沿延时5ns,第二个上升沿不延时。
生成时钟在实现上也可以通过创建时钟命令来设置,而区别是创建时钟命令得到一个独立的时钟信号,这样增加一个独立时钟域就会相应增加静态时序分析的工作量。同时创建时钟还需要设置时钟相关的其他基本信息,比如时钟源,时钟延时,时钟不确定性等,而升成时钟的优点则是自动继承主时钟的设置,无需额外设置,如下图生成时钟继承主时钟延迟的情况。
生成时钟继承主时钟的设置,因此生成时钟的延迟如下。
生成时钟的时钟延迟=时钟源延迟+主时钟的时钟网络延迟+生成时钟的时钟网络延迟
生成时钟也存在缺点,由于生成时钟只能对应一个主时钟,因此在某些具体应用中使用创建时钟命令来实现时钟比较合适。比如某个时钟是通过多个时钟信号混合后转换而来的,在各个时钟带来的不确定性影响共同作用下,其实际时钟的输出解决,比如相位和占空比等属性与任何一个时钟没有绝对对应关系时,那么通过把其中任何一个时钟作为主时钟来定义生成时钟就可能出现误差。对于这种情况,把最终时钟输出端单独使用创建时钟来定义比较安全。
如下图所示为两个时钟信号通过与门转换后得到最终的时钟输出的情况
如果把CLK3定义为生成时钟,在CLK1和CLK2各自带来的时钟抖动、时钟延时等因素共同作用下,CLK3的输出结果并不完全取决于某一个时钟,即CLK3的输出结果实际应该继承两个时钟的共同结果,所以使用任何一个时钟作为主时钟都不合理。这样直接设置CLK3为独立的时钟,并通过设置其他时钟相关的基本信息参数来涵盖需要考虑的不确定因素时比较合理的做法。
由于一个主时钟可以对应多个生成时钟,所以不同的生成时钟可以来自一个主时钟,这在实际设计中也是很正常的应用。比如芯片中不同的时钟域都来自一个时钟源点;锁相环(PLL)部件的输出,基本时钟网络结构如下:
生成时钟CLKA、CLKB、CLKC和CLKD都是通过分频逻辑来自同一个主时钟信号;锁相环输出。
1.3虚拟时钟
虚拟时钟,顾名思义指的是在设计中并不存在的时钟,因此设计中定义虚拟时钟满足以下3个特点:
1)设计中的某个时钟是一个现实存在,但是其时钟源不是来自设计中任何的引脚和端口,即设计中的时序单元都不是由该时钟触发,然而设计中部分时序路径的输入输出端口又与该时钟相关。如下图,由于时钟1并不直接在设计中起作用,时钟1即为虚拟时钟。
2)由于虚拟时钟与设计中的任何引脚和端口没有直接关系,所以定义虚拟时钟的命令不指定时钟的端口。
通过使用SDC命令create_clock来创建虚拟时钟(virtual clock),比如通过该命令定义一个时钟周期为10、占空比为50%的虚拟时钟信号。
命令如下:
create_clock -name VIRTUAL_CLK -period 10 -waveform {0,5}
3)虚拟时钟在设计中的时机应用是用于输入输出端口延时约束的时钟源,主要分为以下三种情况。
- 设计的输入端口信号来自外部某个时钟控制下的时序路径输出端,如下图:
根据以上情况,设计的本身的时钟为CLK1,但是其输入端口core_in来自外部基于CLK2时钟域下的时序路径的输出,命令如下:
create_clock -name CLK2 -period 10 -waveform {0,5}
create_clock -name CLK1 -period 10 -waveform {get_ports core_ck}
set_input_delay -clock CLK2 -max 2.7 [get_ports core_in]
以上命令设计本身的时钟CLK1和定义虚拟时钟CLK2,同时基于虚拟时钟来定义输入输出端口core_in的时序约束,其延时为2.7ns
- 设计的输出端口信号进入外部某个时钟控制下的时序路径输入端,如下图:
根据以上情况,设计本身的时钟为CLK1,但是其中输出端口core_out是到自外部基于CLK2时钟域下的时序路径的输入,命令如下:
create_clock -name CLK2 -period 10 -waveform {0,5}
create_clock -name CLK1 -period 10 [get_ports core_ck]
set_output_delay -clock CLK2 -max 2.7 [get_ports core out]
以上命令设计本身的时钟CLK1和定义虚拟时钟CLK2,同时基于虚拟时钟来定义输出端口core_out的时序约束,其输出延时为2.7ns。
- 设计的输入、输出端口信号都是外部某个时钟控制下的时序路径,如下图:
根据以上情况,设计本身的时钟为CLK1,但是其输入、输出端口是来自外部基于CLK时钟域下的时序路径,其命令如下:
create_clock -name CLK2 -period 10 -waveform {0,5}
create_clock -name CLK1 -period 10 [get_ports core_ck]
set_input_delay -clock CLK2 -max 2.7 [get_ports core_in]
set_output_delay -clock CLK2 -max 2.7 [get_ports core_out]
以上命令定义设计本身的时钟CLK1和定义虚拟时钟CLK2,同时基于虚拟时钟来定义输入、输出端口的时序约束,其输入、输出延时来定义为2.7ns
1.4 最小时钟脉宽
时钟信号的脉冲宽度如果太小会引起如下两个方面的问题:
1)时序单元无法正常工作
由于时序单元本身有建立时间和保持时间的约束,需要时钟信号脉冲保持一段时间的稳定,如下图
上图可以看出,时钟信号高低电平的最小脉冲宽至少分别要大于等于建立时间与保持时间所需要的时间,否则时序单元无法正常工作。
2)任何信号都不能脉冲宽太小,否则在组合逻辑路径传播成功中会慢慢削弱而失真,如下图:
同样时钟信号也会因为脉冲太小的问题在时钟树中无法正确地传播,时钟信号的失真可能会导致整个设计功能出现错误。
由于以上两个原因,需要设置时钟信号脉宽保持稳定的最短时间,命令如下:
set_min_pulse_width -high 1.5 [all_clocks]
set_min_pulse_width -low 1.0 [all_clocks]
以上命令定义所有时钟高电平最小脉冲为1.5ns,低电平最小脉冲为1ns。
2.I/O延时约束
前面介绍了4种时序路径中的3种:触发器到输出端、输入端到触发器和输入端到输出端,都与外部IC相关,所以在时序分析中需要对外部IO的延时进行时序约束,如下图:
这样可以在对这3种类型的时序路径进行时序分析时考虑到外部IO延时的信息。
2.1设置输入延时
输入延时(input delay)定义为在一个有效时钟周期内,外部逻辑在输出数据到达设计输入端口所占用的延时,如下图:
set_input_delay -min 2.0 -clock CLK [get_ports IN]
set_input_delay -max 2.0 -clock CLK [get_ports IN]
以上命令定义一个基于时钟CLK的外部逻辑到输入端口IN的延时信息,其延时波形如下图。
2.2设置输出延时
输出延时(output delay)定义为在一个有效时钟周期内,输出端口数据到外部逻辑所占用的延时,如下图:
通过SDC命令set_output_delay来定义IO输入延时,命令如下:
set_output_delay -clock CLK -max 1.5 [get_ports OUT]
set_output_delay -clock CLK -min 1.5 [get_ports OUT]
以上命令定义一个基于时钟CLK的输出端口OUT到外部逻辑的延时信息,其延时波形为:
3.I/O环境建模约束
前面介绍的I/O延时约束只能对I/O的输入、输出延时信息进行设置,但是对于输入、输出外部的实际负载情况并没有做精确的设置,如下图所示:
如果缺少比较真实的外部输入、输出信息,时序分析工具对外界逻辑有连接关系的内部逻辑的输入、输出延时的计算结构就会和实际情况之间有比较大的误差。可以通过设置I/O环境建模约束来设置于实际情况相符合的外部输入驱动力信息和输出负载信息,这样可以指导时序分析工具计算出处在内部与外部交界上的单元的更符合实际情况的延时信息。
I/O环境建模约束的内容主要包括以下几个方面。
3.1输入驱动建模
默认情况下,如果没有外部输入驱动力信息的设置,时序分析工具默认设置外部输入驱动力为无限大。输入驱动建模的实现方法可以通过一下3个命令实现。
1)通过使用SDC命令set_drive来设置外部输入驱动力信息,通过该命令定义驱动该引脚驱动电阻值,再通过该驱动电阻值算出驱动端的转换时间,并计入时序路径的延时信息里。设置的输入驱动电阻值越大,其输入端驱动力越小,当定义为0时,代表输入端驱动力为无限大,如下图:
命令如下:
set_drive -rise 0.4 [all_inputs]
set_drive -fall 0.3 [all_inputs]
以上命令定义设计所有输入的驱动值,上拉驱动电阻为0.4,下拉驱动电阻为0.3。
2)通过使用SDC命令set_driving_cess来设置外部输入驱动信息,通过该命令定义驱动该引脚的输入驱动力等价为一个指定单元的驱动能力,再通过该等价单元的驱动力算出驱动端的转换时间,并计入时序路径的延时信息里。设置的等价单元驱动能力大则其输入端驱动能力大,如下图:
示例命令如下:
set_driving_cell -lib_cell buff2 [all_inputs]
以上命令定义设计所有输入的驱动力等价于单元库里buff2单元的驱动力。
3)通过使用SDC命令set_input_transition来设置外部输入驱动力信息,通过该命令直接驱动该引脚的输入驱动转换时间。设置的转换时间越大其驱动力越小,当定义为0时,代表输入驱动力为无限大,如下图:
命令如下:
set_input_transition 0.6[all_inputs]
以上命令定义设计所有输入的驱动力的转换时间为0.6ns
3.2输出负载建模
默认情况下,如果没有外部输出负载信息的设置,时序分析工具默认设置外部输出负载为0.输出负载建模的实现方法可以通过使用SDC命令set_load实现,通过该命令定义外部负载为一个等效的电容,其电容值为负载值,如下图:
命令如下:
set_load 5 [all_outputs]
以上命令定义设计所有输出负载等效为5pF的电容负载。
输出负载建模也可以通过该命令定义输出负载等效为某指定单元引脚的电容值,如下:
4.时序例外
静态时序分析工具默认分析规则是在单周期下对所有时序路径进行分析,但是实际设计中并不是所有路径都需要分析,而且也不是所有时序路径的延时都规定在一个时钟周期以内。所有通过定义时序例外来对特殊的时序路径进行特使声明,知道时序分析工具对特殊时序路径做出正确分析,这样的特殊生命叫做时序例外。
时序例外主要有以下几种情况。
4.1多周期路径设置(multicycle path)
设计中存在时序路径延时比较长,并且设计允许信号在这类时序路径下的延时等于几个周期的时间。
那么可以通过使用SDC命令set_multicycle_path来定义这类时序路径为多周期时序路径。命令如下:
set_multicycle_path 5 -setup -from [get_pins DFF1/Q] -to [get_pins DFF2/D]
set_multicycle_path 4 -hold -from [get_pins DFF1/Q] -to [get_pins DFF2/D]
以上命令定义触发器DFF1与DFF2之间时序路径建立时间的延时为第5个时钟周期检查,保持时间的延时为第4个周期检查,其延时如下图:
4.2伪路径设置(false_path)
当设计中存在不需要做时序分析的时序路径时,可以通过伪路径的设置移除该时序路径上的默认时序分析,指导时序分析工具对设置的时序路径停止时序分析。
一般设计中满足如下的情况的时序路径可以定义为伪路径:
1)设计中存在默写时序路径在某特定的工作状态下是不工作的,那么在对应的工作状态下进行时序分析时,该时序路径实际上是不需要进行分析的。
比如测试逻辑的时序路径,这种路径在正常工作模式下是不需要考虑的,这种时序路径在工作模式下的时序分析中就可以定义为伪路径,如下图:
2)设计中存在某些时序路径的时序要求事非常的宽松,以至于不需要进行时序分析。
如,复位控制信号的时序路径,如下图:
这种路径在设计中一般对时序要求比较宽松,所以根据设计要求可以定义为伪路径。
再如,具有反馈环的时序路径如下图:
这种路径一般在设计中如果不设置伪路径,可能出现时序违反,但是这种时序违反是可以接受的,那么可以定义为伪路径。
3)设计中存在某些时序路径并不会真正的工作信号通过,这种时序路径实际上是无效的时序路径。
如,不同时钟域之间的时序路径,如下图:
这种时序路径在设计中可能存在无关性,那么可以定义为伪路径。
再如,在设计中数据信号通过某些逻辑单元的部分时序路径没有对应输入激励来触发工作,如下图:
两个同样的选择器由于选择信号不一样,因此其中的部分时序路径不一定被触发,那么可以把不工作的时序路径定义为伪路径,伪路径通过使用SDC命令set_false_path来定义,命令如下:
set_false_path -from [get_clocks CLK1] -to [get_clocks CLK2]
以上命令定义两个时钟域CLK1和CLK2之间的时序路径为伪路径。
set_false_path -through [get_pins DFF/RST]
以上命令定义通过单元DFF中RST引脚的时序路径为伪路径。
4.3最大延时和最小延时设置
当设计需要对某些点到点的路径进行特殊设置时,可以通过定义最大延时(Maximum Delay)和最小延时(Minimum Delay)来实现。比如,时钟域clk1和clk2之间的时序路径默认设置为伪路径,但是其中有一条从触发器F1通过组合逻辑1到触发器F2的时序路径需要有时序约束,如下图:
那么可以对这条路径通过定义最大延时和最小延时来实现,该命令将会覆盖掉所有设置路径的默认时序约束。
通过使用SDC命令set_min_delay和set_max_delay来定义最大延时和最小延时,命令如下:
set_max_delay 0.6 -from DFF1/Q -to DFF2/D
set_min_delay 0.2 -from DFF1/Q -to DFF2/D
以上命令定义单元DFF1到单元DFF2之间时序路径的时序约束的最大延时以为0.6ns,最小延时为0.2ns。
当最大延时和最小延时设置中约束的节点定义的是时序路径中的节点,那么时序约束仅仅应用于两个节点之间。而当约束的节点定义的是一个时钟,最大延时和最小延时设置将应用于该时钟源所控制的所有路径,命令如下:
set_max_delay 1.2 -from [get_clocks CLK1] -to [get_clocks CLK2]
set_min_delay 0.4 -from [get_clocks CLK1] -to [get_clocks CLK2]
以上命令定义从时钟域CLK1到CLK2之间所有时序路径的时序约束的最大延时为1.2ns,最小延时为0.4ns。
5.恒定约束状态
根据实际的设计需求,在某种工作模式下有些信号实际上为恒定的值,比如自测逻辑中的TEST引脚在测试模式下应该设置为1,在常规工作模式下就应该一直保持为0,如下图:
如果没有正确的恒定状态约束,测试逻辑的约束延时很难满足常规工作模式下的时序要求,因此需要通过相应的恒定状态约束来知道时序分析工具进行正确的时序分析。
通过使用SDC命令
set_case_analysis 0 [get_port test_scan_enable]
以上命令定义测试模式段都test_scan_enable恒定状态值为0.
再比如,设计工作在不同的设计评率下也可以通过恒定状态约束来实现,如下图:
根据设计的工作模式需要,通过设置恒定状态约束来定义时钟选择端口的对应状态值,选择对应的时钟频率进行正确的时序分析。命令如下:
set_case_analysis 1 CLK_SEL
以上命令定义测试模式端口CLK_SEL的恒定状态值为1。
6.屏蔽时序弧线
每个单元内部从输入端口到输出端口都定义有时序弧,默认情况下所有的时序弧都应该有效并用于时序分析。但是在设计中由于具体逻辑设计的原因,某些单元内部的时序弧由于没有对应功能逻辑的触发条件而应该是无效的,对于这样的特殊情况可以通过屏蔽时序弧的约束命令来实现,以知道时序分析工具进行正确的时序分析。
比如,选择器单元存在选择输入端到输出端的时序弧,但是设计中不存在通过该单元选择端口到输出端口的时序路径,这样可以通过屏蔽该时序弧,指导时序分析跳过包含该时序弧的时序分析,如下图:
屏蔽时序弧设置通过SDC命令set_disable_timing来定义,命令如下:
set_disable_timing -from S -to Z [get_cells MUX]
以上命令定义屏蔽选择器单元MUX中从S端到Z端的时序弧。
屏蔽时序弧(set_disable_timing)和伪路径(set_false_path)在某种情况下存在相似的实现结果,但是也存在本质的不同。屏蔽时序弧是针对单元具体端口内部的时序弧并且进行屏蔽,等价于移除掉该单元内部的时序弧。那么时序分析时,与该时序弧相关的所有时序路径都被移除。如下图:
而伪路径是针对时序路径并移除对应时序路径上的默认时序约束,而所有时序弧是一直有效的,如果与单元统一时序相关的书序路径有多余,而伪路径设置只作用于其中部分时序路径,那么时序工具默认还是会机选所有时序路径延时,只是对存在时序约束的时序路径进行时序性能评估,如下图
当为路径设置是移除通过某个单元具体PIN脚上的所有时序约束时,命令如下:
set_false_path through [get_pins ADDER/CI]
可以用屏蔽时序弧约束替代,命令如下所示:
set_disable_timing [get_pins ADDER/CI]
这样的好处是屏蔽时序弧命令可以减少时序分析工具的计算负载,因为对应时序弧已经无效,不会进行计算分析。
7.时序设计规则约束
在设计中,由于时序路径中的逻辑单元本身存在驱动能力的限制,所以在满足时序要求的同时也需要保证逻辑单元本身工作在稳定的合理工作状态下,即逻辑单元所驱动的负载应该控制在可以接受的范围内,如下图:
因此可以通过设置设计规则约束来指导时序分析正确地评估单元是否能够工作在稳定的合理工作状态下。
时序设计规则约束的内容主要包括一下3个方面。
1.最大转换时间
由于所有的单元其驱动能力有限的,所以其驱动的最大转换时间 (max transition)也是有限的。为了让设计中的所有单元都正常的驱动力范围内工作,需要设置最大的转换时间(max transition)来控制单元的驱动力过载的问题,否则可能会导致不能正常工作。
通过使用SDC命令set_max_transition来定义最大转换时间约束,命令如下:
set_max_transition 0.6 [all_outputs]
以上命令定义所有输出驱动端的最大转换时间为0.6ns。
2.最大电容负载
但愿驱动转换时间本质上取决于输出负载的大小,因此单元的驱动状态根本原因是受到输出端的负载影响。为了让设计中的所有单元都在正常的驱动力范围内工作,也可以设置单元输出端的最大电容负载(max capacitance),超过最大负载值的限制有可能会导致单元不能正常工作。
通过使用SDC命令set_max_capacitance来定义最大电容负载约束,命令如下:
set_max_capacitance 0.5 [all_outputs]
以上命令定义所有输出驱动端的最大电容负载为0.5pF。
3.最大扇出
扇出是逻辑单元输出端直接连接的下级逻辑单元输入端的个数,由于单元输出端所连接的输入端的个数直接影响负载的大小,所以为了让设计中的所有单元都在正常的驱动力范围内工作,也可以设置单元输出端的最大扇出值(max fanout),超过最大扇出值的限制有可能会导致单元不能正常工作。
通过使用SDC命令set_max_fanout来定义最大扇出约束,示例命令如下:
set_max_fanout 16 [all_outputs]
以上命令定义所有输出驱动乭最大扇出值为16。
由于以上3种时序设计规则约束时在设计中根据实际情况人位设置的约束,一般其值应该略低于实际单元库真正承受的值,这样可以为设计留一定的裕度,实际的极限值以单元库属性文件(lib库)中设置的值为准。