静态时序约束(SDC)

1、时钟约束

1.1 创建时钟

  时钟信号一般要包含以下主要信息:

create_clock -period 10 -waveform {0 5} [get_ports clk]

  (1)时钟源点
  时钟源点可以根据情况定义为设计中一个端口,也可以是一个逻辑单元的PIN脚,上边约束代码的[]中的部分。
  (2)时钟周期
  上边约束代码的-period中的部分。
  (3)时钟占空比
  时钟占空比主要定义时钟高低电平在一个时钟周期内的分布情况。上边约束代码的-waveform {0 5}中的部分。{0 5}表示在这个时刻段里时钟是高电平,它占时钟周期的一半,因此占空比为50%,默认情况不设置的话占空比为50%
  (4)时钟转换延时
  时钟转换延时定义时钟在高低电平状态下切换所需要的延时。
例如设置时钟`clk``上升转换延时为0.1ns,下降转换延时为0.12ns:

set_cloek_transition -rise 0.1 [get_clocks clk]
set_cloek_transition -fall 0.12 [get_clocks clk]

  (5)时钟不确定性
  主要就是时钟偏差,抖动等,这是不可避免的。例如设置建立时间和保持时间的时钟不确定性:

set_clock_uncertainty -setup 0.2 [getLcloeks clk]
set_clockLuncertainty -hold 0.05 [get_clocks clk]

在这里插入图片描述
不同时钟域之间也可以定义时钟不确定性:
在这里插入图片描述

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

  (6)时钟延时
  时钟延时分为两部分——时钟源延时和时钟网络延时,区分呢就是以创建时钟那个点为界。
在这里插入图片描述
时钟网络延时定义:

set_clock_lateney 1.8 -rise [all_clocks]
set_clock_latency 2.1 -fal1 [all_clocks]

时钟源延时:

set_clock_latency 0.851 -source -min [get_clocks CLK]
set_clock_lateney 1.322 -source -max [get_clocks CLK]

  时钟网络延迟与时钟源延迟的一个明显区别是,时钟网络延迟是时钟树生成前的设置。当实际时钟树生成后,时钟网络延迟的设置将会通过命令set_propagated_clock被时钟树的实际结果替代,而时钟源延迟会一直存在。

1.2 生成时钟

  生成时钟来源于主时钟,一般由主时钟分频,倍频等操作得到
在这里插入图片描述
  使用SDC命令create_generate_clock来定义生成时钟,示例如下:

create_clock -period 10 -waveform {0 5} [get_ports CLK]
create_generate_clock -name CLKDIV3 -source CLK -devided_by 3 [get_pins DFF/Q]

  以上命令定义一个基于主时钟CLK的分支时钟CLKDIV3,CLKDIV3的频率是主时钟的1/3,即生成时钟的周期是主时钟的3倍。生成时钟CLKDIV3与主时钟CLK的时钟信号波形的对比图如下:
在这里插入图片描述
  可以对生成时钟在相位上进行设置:

create_clock -period 10 -waveform {0 5} [get_ports CLK]
create_generate_clock -name CLKDIV2 -divided_by 2 -invert -source CLK [get_pins DFF/Q]

  以上命令定义一个基于主时钟CLK的分支时钟CLKDIV2,CLKDIV2的周期为主时钟的2倍,其相位与主时钟相反。生成时钟 CLKDIV2与主时钟CLK的时钟信号波形的对比图如下:
在这里插入图片描述
  可以对生成时钟在占空比上进行设置:

create_clock -period 10 -waveform {0 5} [get_ports CLK]
create_generate_clock -name CLK1 -source CLK -edges {1 1 5} -edge_shift {0 5 0} [get_pins DFF/Q]

  以上命令定义占空比为高电平25%。生成时钟CLK1与主时钟CLK的时钟信号波形的对比图如图所示:
在这里插入图片描述
  生成时钟的创建也可以通过生成时钟来实现。独立的时钟信号,这样增加一个独立时钟域就会相应增加静态时序分析的工作量。同时创建时钟还需要设置时钟相关的其他基本信息,比如时钟源、时钟延迟,时钟不确定性等,而生成时钟的优点则是会自动继承主时钟的设置,无需额外设置。 有一种情况就是**某个时钟是经过多个信号混合而来,与创建的各个时钟没有关系,这种情况下用创建时钟命令实现比较合理。**并通过设置其他时钟相关的基本信息参数来涵盖需要考虑的不确定因素。

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)虚拟时钟在设计中的实际应用是用于作为输人输出端口延时约束的时钟源,主要分为以下3种基本情况。

  • 设计的输人端口信号来自外部某个时钟控制下的时序路径输出端;
    在这里插入图片描述
      根据以上情况,设计本身的时钟为CLK1,但是其输人端口core i是来自外部基于CLK2时钟域下的时序路径的输出,其示例命令如下:
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]

  以上命令定义设计本身的时钟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和定义虚拟时钟输出端口coreout的时序约束,其输出延时为2.7ns。

  • 设计的输人、输出端口信号都是外部某个时钟控制下的时序路径;
    在这里插入图片描述
      根据以上情况,设计本身的时钟为CLK1、但是其输人、输出端口是到自外部基于CLK2时钟域下的时序路径、其示例命令如下:
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)任何信号都不能脉宽太小,否则在组合逻辑路径传播过程中会慢慢削弱而失真。
  通过使用SDC命令set_min_pulse_width来定义时钟信号的最小脉宽(minimum pulse width),示例命令如下:

set_min_pulse_width -high 1.5 [all_clocks]
set_min_pulse_width -low 1.0 [all_clocks]

以上命令宗义所有时钟高电平最小脉宽为1.5ns,低电平最小脉宽为1ns。

2、I/O 延时约束

  四种时序路径中的三种:触发器到输出端、输入端到触发器和输入端到输出端都与外部IO有关,因此IO延时约束也很有必要。I/O延时约束的作用是告诉时序仿真工具输入输出延时与时钟的相对关系。
  设置输入延时约束,SDC命令:

set_input_delay -min 2.0 -clock CLK [get_ports IN]
set_input_delay -max 2.0 -clock CLK [get_ports IN]

示意图如下:
在这里插入图片描述
  设置输出延时约束,SDC命令:

set_output_delay -min 1.5 -clock CLK [get_ports OUT]
set_output_delay -max 1.5 -clock CLK [get_ports OUT]

示意图如下:
在这里插入图片描述

3、I/O 环境建模约束

  I/O 环境建模约束的目的是告诉时序分析工具输入输出外部的实际负载情况
在这里插入图片描述
  输入驱动建模,如果缺少则认为输入驱动力无限大,SDC命令:

set_drive -rise 0.4 [all_inputs]
set_drive -fal1 0.3 [all_inputs]

以上命令定义设计所有输人的驱动值,上拉驱动电阻为0.4,下拉驱动电阻为0.3。设置的输人驱动电阻值越大,其输人端驱动力越小,当定义为0时,代表输人端驱动力为无穷大。
在这里插入图片描述

  输出负载建模,若缺少则认为外部输出负载为0,SDC命令:

set_load 5 [all_outputs]

以上命令定义设计所有输出负载等效为5pF的电容负载,通过该命令定义外部负载为一个等效的电容,其电容值即为负载值。
在这里插入图片描述

4、时序例外

  静态时序分析工具默认分析规则是在单周期下对所有时序路径进行分析,但是实际设计
中并不是所有的路径都需要分析,而且也不是所有时序路径的延时都规定在一个时钟周期以内。所以通过定义时序例外来对特殊的时序路径进行特殊的声明,指导时序分析工具对特殊的时序路径做出正确分析,这样的特殊声明叫做时序例外 (timing exception)时序例外主要用于如下几种情况:

4.1 多周期路径设置:

  设计中存在时序路径延时比较长,并且设计允许信号在这类时序路径下的延时等于几个
周期的时间
在这里插入图片描述
SDC命令:

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 伪路径设置:

  当设计中存在不需要做时序分析的时序路径时,可以通过伪路径的设置移除该时序路径上的默认时序约束,指导时序分析工具对设置的时序路径停止时序分析。一般设计中满足如下情况的时序路径可以定义为伪路径:

  • 设计中存在某些时序路径在某特定的工作状态下是不工作的,那么在对应的工作状态下进行时序分析时。该时序路径实际上是不需要进行分析的。比如测试逻辑的时序路径、这种路径在正常工作模式下是不需要考虑的这种时序路径在工作模式下的时序分析中就可以定义为伪路径。

在这里插入图片描述

  • 设计中存在某些时序路径的时序要求是非常的宽松、以至于不需要进行时序分析。如复位控制信号的时序路径、具有反馈环的时序路径:
    在这里插入图片描述
    在这里插入图片描述

设计中存在某些时序路径并不会有真正的工作信号通过、这种时序路径实际上是无效的时序路径。如不同时钟域之间的信号、设计中数据信号通过某些逻辑单元的部分时序路释没有对应输人激励来触发工作:(静态时序分析只能分析同步时序电路,对于不同跨时钟域的路径直接设置时序伪时序路径
在这里插入图片描述
在这里插入图片描述
SDC命令:

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_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,最小延时为O.4ns。

5、恒定状态约束

  根据实际的设计需求,在某种工作模式下有些信号实际上为恒定的值,比如自测试逻
辑中的TEST引脚在测试模式下应该设置为1、在常规工作模式下就应该一直保持为0。如果没有正确的恒定状态约束、测试逻辑的时序延时是很难满足常规工作模式下的时序要求的、因此需要通过做相应的恒定状态约束来指导时序分析工具进行正确的时序分析:
SDC命令:

set_case_analysis 0 [get_port test_scan_enable]

以上命令定义测试模式端口test_scan_enable恒定状态值为0。
在这里插入图片描述

  再比如,设计工作在不同的设计频率下也可以通过恒定状态约束来实现,根据设计的工作模式需要、通过设置恒定状态约束来定义时钟选择对应的时钟频率进行正确的时序分析。SDC命令如下:

set_case_analysis 1 CLK_SEL

以上命令定义测试模式端口CLK_SEL恒定状态值为1。
在这里插入图片描述

6、屏蔽时序弧

  每个单元内部从输人端口到输出端口都定义有时序弧、默认情况下所有的时序弧都应该有效并用于时序分析。但是在设计中由于具体逻辑设计的原因,某些单元内部的时序弧由于没有对应功能逻辑的触发条件而应该是无效的,对于这样的特殊情况可以通过屏蔽时序弧的约束命令来实现,以指导时序分析工具进行正确的时序分析。
比如,选择器单元存在选择输人端到输出端的时序弧、但是设计中不存在通过该单元选择端口到输出端口的时序路径,这样可以通过屏蔽该时序弧,指导时序分析跳过包含该时序弧的时序分析:
在这里插入图片描述
SDC命令:

set_disable_timing -from S -to Z [get_cells MUX]

以上命令定义屏蔽选择器单元MUX中从S端到Z端的时序弧。
  屏蔽时序弧 (set_disable_timing)和伪路径 (set_false_path) 在某种情况下存在相似的实现结果,但是也存在本质的不同。屏蔽时序弧是针对单元具体端口内部的时序弧并且进行屏蔽,等价于移除掉该单元内部的时序弧。那么时序分析时,与该时序弧相关的所有时序路径都被移除。
  而伪路径是针对时序路径并移除对应时序路径上的默认时序约束,而所有时序弧是直有效的,如果与单元同一时序弧相关的时序路径有多条、而伪路径设置只作用于其中部分时序路径,那么时序工具默认还是会计算所有时序路径延时,只是对存在时序约束的时序路径进行时序性能评估。
在这里插入图片描述
当伪路径设置是移除通过某单元具体PIN脚上的所有时序约束时,SDC命令如下所示:

set_false_path -through [get_pins ADDER/CI]

可以用屏蔽时序弧约束替代、SDC命令如下所示:

set_disable_timing [get_pins ADDER/CI]

这样的好处是屏蔽时序弧命令可以减少时序分析工具的计算负载、因为对应时序弧已经无效,不会进行计算分析。

7、时序设计规则约束

  在设计中,由于时序路径中的逻辑单元本身存在驱动能力的限制,所以在满足时序要求的同时也需要保证逻辑单元本身工作在稳定的合理工作状态下、即逻辑单元所驱动的负载应该控制在可以接受的范围内:
在这里插入图片描述
  因此可以通过设置设计规则约束来指导时序分析工具正确地评估单元是否能够工作在稳定的合理工作状态下。时序设计规则约束的内容主要句括以下3个方面:

  • 最大转换时间

  由于所有的单元其驱动能力是有限的,所以其驱动的最大转换时间 (max transition)也是有限的。为了让设计中的所有单元都在正常的驱动力范围内工作,需要设置最大的转换时间(max transition)来控制单元的驱动力过载的问题,否则可能会导致不能正常工作。SDC命令:

set_max_transition 0.6 [all_outputs]

以上命令定义所有输出驱动端的最大转换时间为0.6ns。

  • 最大电容负载

  前面讲到的单元驱动转换时间本质上取决于输出负载的大小,因此单元的驱动状态根本原因是受到输出端的负载影响。为了让设计中的所有单元都在正常的驱动力范围内工作,也可以设置单元输出端的最大电容负载 (max capacitance),超过最大负载值的限制有可能会导致单元不能正常工作。 SDC命令:

set_max_capecitance 0.5 [all_outputs]

以上命令定义所有输出驱动端的最大电容负载为0.5pF。

  • 最大扇出

  扇出是指逻辑单元输出端直接连接的下级逻辑单元输人端的个数、由于单元输出端所连接的输人端的个数多少直接影响负载的大小,所以为了让设计中的所有单元都在正常的驱动力范围内工作,也可以设置单元输出端的最大扇出值(max fanout),超过最大扇出值的限制有可能会导致单元不能正常工作。SDC命令:

set_max_fanout 16 [all_outputs]

  以上命令定义所有输出驱动端的最大扇出值为16。
  由于以上3种时序设计规则约束是在设计中根据实际情况人为设置的约束,一般其值应该略低于实际单元库真正承受的值,这样可以为设计留有一定的裕度,实际的极限值以单元库属性文件 (lb库)中设置的值为准。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值