STA env

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

Timing Constraint按照它们的用途,大致分为以下几类:

(1)描述芯片的工作速度,即时钟的频率,包括create_clock,create_generated_clock

(2)描述芯片的边界约束,包括set_input_delay, set_output_delay

(3)描述芯片的一些设计违反rule(DRV),包括set_max_fanout,set_max_capacitance, set_max_transition

(4)描述设计中一些特殊的路径,包括set_false_path,set_multicycle_path

(5)描述设计中一些需要禁止的timing arc,例如set_disable_timing

需要注意的是,设计的不同阶段我们使用的sdc都有所不同。比如说,综合时由于模型的粗糙,我们会选择过约sdc,将时钟频率设得更高一些;CTS之前,由于skew的不确定性,通常我们也会加大uncertainty;还有signoff tool与PR工具correlation问题,margin的设置也会不一样。

常用的sdc命令:

clock相关

create_clock

create_generated_clock

set_clock_uncertainty

set_clock_groups

set_input_delay

set_output_delay

系统接口相关

set_input_transition

set_load

set_driving_cell

时序特例相关:

set_false_path

set_multicycle_path

逻辑赋值相关:

set_case_analysis

 

1.create_clock

任何sdc首先定义的都是时钟,对于一个同步电路而言,缓存器和缓存器之间的路径延迟时间必须小于一个Clock 周期(Period),也就是说,当我们确认了Clock 规格,所有缓存器间的路径的Timing Constraint 就会自动给定了。Clock规格主要包含WaveformUncertaintyClock group的定义。我们把它们称为时钟的三要素,当然创建任何时钟都要检查一下这三者有没有正确定义。

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

2.create_generated_clock

#定义master clock

create_clock -name CLKP -period 10 -waveform {0 5} [get_pins UPLL0/CLKOUT]

#在Q点定义generated clock

create_generated_clock -name CLKPDIV2  -source UPLL0/CLKOUT  -master_clock CLKP  -divide_by 2 [get_pins UFF0/Q]

与master clock的主要区别在于:在CTS步骤,generated clock并不会产生新的clock domain, 而且定义generated clock后,clock path的起点始终位于master clock, 这样source latency并不会重新的计算。这是定义generated clock的优点所在。

3.Virtual clock

virtual clock不挂在任何port或者pin上,只是虚拟创建出来的时钟。如下所示:

#定义虚拟时钟

create_clock -name VCLK -period 10 -waveform {0 5}

通常会把input/output delay挂在virtual clock上,因为input/output delay约束本来就是指片外的时钟,所以挂在虚拟时钟上较为合理。当然如果要省事情,直接挂在real clock上也是可以的。
4.set_clock_uncertainty
主要定义了Clock信号到时序器件的Clock端可能早到或晚到的时间。主要是用来降低jitter对有效时钟周期的影响。值得注意的是,在setup check中,clock uncertainty是代表着降低了时钟的有效周期;而在hold check中,clock uncertainty是代表着hold check所需要满足的额外margin。
 set_clock_uncertainty -setup 0.65 [get_clocks CLK]
5.set_clock_groups

定义完时钟后,需要通过设置clock group来确认各个时钟之间的关系,一般有三个选项:asynchronous,physically_exclusive和logically_exclusive。

asynchronous代表两个异步的clock group

physically_exclusive代表两个clock group在物理意义上相互排斥,比如在一个source pin上定义了两个时钟。

logically_exclusive代表两个clock group在逻辑上相互排斥,比如两个clock经过MUX选择器。一个简单的例子:

set_clock_group -name wr_clk_group -async \
-group {REG_CMN_WE} -group {REG_CMN_RE} \
-group {CMN_DIG_CAL_CLK} -group {CMN_DIG_CAL_SCN_CLK} \
-group {CMN_DIG_REG_SCN_CLK}

6 .set_input_delay/set_output_delay

这是关于IO边界上的约束,STA并不能去检查一条没有被约束的路径,因此所有的端口上路径都必须被赋予边界约束,set_input_delay 和set_output_delay都是对外部的延时信息的描述。

set_input_delay:输入信号是在时钟沿后多长时间到达模块的port上的 。如下图所示:

set_output_delay:输出信号在后级模块中需要在时钟沿之前提前多长时间准备好。 

# leave margin for analog routing, refer to syn_ana_cmn_dig/scr/constraint.tcl for detailed info
set_input_delay [list [expr ${T_REG_CMN_RE} - 0.9]] -clock REG_CMN_RE -max [get_ports REG_CMN_ADDR]
set_input_delay 0.3 -clock REG_CMN_RE -min [get_ports REG_CMN_ADDR]

set_output_delay [list [expr ${T_REG_CMN_RE} - 0.95]] -clock REG_CMN_RE -max [get_ports REG_CMN_RD_OUT]
set_output_delay 0.3 -clock REG_CMN_RE -min [get_ports REG_CMN_RD_OUT]

7.set_case_analysis

逻辑赋值,作用就是对电路端口进行置“0”,置“1”的操作。一般用在切换DFT模式的时候,以及控制时钟Mux,功能Mux的选择。

set_case_analysis 1 [get_ports I_DFTTE]

set_case_analysis 1 [get_ports I_DFTCONFIG[1]]

set_case_analysis 0 [get_ports I_DFTCONFIG[2]]

set_case_analysis 0 [get_ports CMN_DIG_SCN]

8.时序特例
set_false_path, set_multicycle_path, set_max_delay, set_min_delay等
set_false_path: false path是指在正常工作环境下,并不真实存在或者经过的路径,比如说一些静态输入信号产生的path。像这样的path,我们可以指定set_false_path。这样工具在计算timing时就不会去分析它。值得注意的是,设定false path时一定要非常小心,一定要和designer仔细确认下,不要把正常的path给误伤掉。
set_multicycle_path: 指的是两个寄存器之间数据要经过多个时钟才能稳定的路径,一般出现于组合逻辑较大的那些路径,也有可能是一些慢时钟去踩快时钟的路径。对于这些路径,我们可以设置multicycle path。同样的,设置multicycle path时,也需要非常谨慎,需要和前端沟通好,该条path要设几个cycle, -start还是-end也要理解清楚,而且默认的hold的multicycle比setup少一个。

set_max_delay: 指定某段path的最大延迟,超过就是violation。用于某些特定的path,限定该path只能走这么长delay.

例:set_max_delay 8.0 -from {ff1/CP} -to {ff2/D}

set_min_delay: 指定某段path的最小延迟,小于该值就是violation。用于某些特定的path,限定该path至少应该走这么长delay.

例:set_min_delay 4.0 -from {ff1/CP} -to {ff2/D}

9.设计规则相关

set_max_capacitance,set_min_capacitance,set_max_fanout,set_max_transition。一般情况下lib库里面会有这些约束,但是我们往往为了时序更好,会在sdc里面更加严格的去约束它.

set_max_capacitance,set_min_capacitance:设定了某一端口所连互连线的最大和最小负载电容,负载电容是互连线自身电容和扇出电容之和。

set_max_fanout 80 [current_design]

set_max_fanout:约束了某条net上驱动的所有cell的个数的总和,而这条net可以由input port驱动,也可以使内部的任何一条net。需要注意的是,max fanout并不是用来约束output port的,因为一个输出端口可能会连有很多条net。

set_max_capacitance 150  [current_design]

set_max_transition: 设定端口信号的最大转换时间,需要注意区分data transition time和clock transition time,一般clock的transition time要小一点。

set_max_transition 150 [current_design]

set_max_transition -clock_path 80 [all_clocks]

posted @   bost  阅读(258)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示