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
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的优点所在。
virtual clock不挂在任何port或者pin上,只是虚拟创建出来的时钟。如下所示:
#定义虚拟时钟
create_clock -name VCLK -period 10 -waveform {0 5}
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}
这是关于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]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 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]
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现