使用 Synopsys PrimeTime 进行静态时序分析的关键约束设置技巧
PrimeTime 跑 STA,网表、库、SDC 三件套齐了,报告却还能给你看"假违例"——问题八成在 SDC。下面这套约束节奏按"时钟树 → 例外 → 验证"三层走,覆盖 PT 里最容易翻车的几个点。
一、时钟约束:generated clock 别再当 create_clock 用
主时钟 create_clock 谁都会写,但 PLL 分频、门控、选择器出来的派生时钟,很多人懒得挂 create_generated_clock,直接再敲一个 create_clock——后果是 PT 认不出同源关系,clock skew 算崩,跨域路径全假违例。
# 错误:割裂血缘,PLL 改周期时 LP_CLK 不会跟着变
create_clock -period 10 -name MAIN_CLK [get_ports PLL_OUT]
create_clock -period 320 -name LP_CLK [get_pins DIV32K/Q]
# 正确:-source 指 master 传播路径上的 pin,-master_clock 锚定源
create_clock -period 10 -name MAIN_CLK [get_ports PLL_OUT]
create_generated_clock -name LP_CLK -source [get_pins DIV32K/CLK] \
-master_clock MAIN_CLK -divide_by 32 [get_pins DIV32K/Q]
-source 指引脚不是端口,分频寄存器场景要挂到分频 FF 的 CK 上,工具才能把 master → source → generated 三段的 latency 算对。同一个点挂多时钟(测试/功能模式切换)用 -add + set_clock_groups -physically_exclusive,别裸奔。
门控时钟过组合逻辑的,加 -combinational:
create_generated_clock -name GATED_CLK -source [get_pins gate/clk_in] \
-combinational [get_pins gate/clk_out] -master_clock SYS_CLK
二、Multicycle:只写 -setup 不写 -hold 是经典翻车
set_multicycle_path 2 -setup -from A -to B 写完就跑,看着 setup 违例没了,回片却偶发错误——原因是 PT 默认把 hold 检查沿也跟着往后挪了 (N-1),对你这个 2-cycle 路径来说 hold 检查挪到第 1 个捕获沿,比想要的严一倍。
# 同频 2-cycle 标准配对
set_multicycle_path 2 -setup -from [get_clocks CLK] -to [get_clocks CLK]
set_multicycle_path 1 -hold -from [get_clocks CLK] -to [get_clocks CLK]
规律就一句:setup = X,hold = X-1,成对写。
跨时钟场景还要带 -start/-end:
• 快→慢(多周期针对快时钟):-setup -start,hold 配 -hold -start
• 慢→快(多周期针对慢时钟):-setup -end,hold 配 -hold -end
只写 -setup 不写 -hold,工具自动挪 hold 沿,修完 setup 回头 hold 爆一片,布线器插 delay cell 又把 setup 顶回去——死循环。
三、CDC 与 false_path:异步 FIFO 别直接 false_path
新手最爱 set_false_path -from wr_clk -to rd_clk 一刀砍,FIFO 控制路径和数据路径的相对延迟关系丢了,读空写满隐患。
# 异步 FIFO:控制路径给 max_delay 保相对关系,数据路径 datapath_only
set_max_delay 1.5 -from [get_pins fifo_ctrl/wr_ptr_reg[*]/Q] \
-to [get_pins fifo_ctrl/sync_wr2rd[*]/D]
纯异步单比特(如复位同步链)才上 false_path,且双向都要砍:
set_false_path -from [get_clocks CLK_A] -to [get_clocks CLK_B]
set_false_path -from [get_clocks CLK_B] -to [get_clocks CLK_A]
set_clock_groups -asynchronous -group CLK_A -group CLK_B
四、三连验证:约束写没写对,PT 自己告诉你
check_timing -verbose ;# 漏约束、未定义时钟、无启动点
report_analysis_coverage -check_type all ;# 约束覆盖率
report_timing -delay_type max -nworst 10 -slack_lesser_than 0 ;# setup 违例
report_timing -delay_type min -nworst 10 -slack_lesser_than 0 ;# hold 违例
check_timing 重点看 "No clock at all"、"Unconstrained endpoint" 两类;report_analysis_coverage 里 Timed 比例不到 95% 就得回去补。
PrimeTime 约束的真谛:派生时钟用 generated 不用 create、multicycle setup/hold 必须成对、-start/-end 按快慢方向带、CDC 先想清楚再砍 false_path。这三层锁完,report_timing 出来的违例才值得你花力气去修,不然就是在给烂约束擦屁股。





