面向模块的综合技术之过约束(十)

面向模块的综合技术之过约束(十)



前言


过约束:FPGA 时序收敛的“隐形杠杆”


1. 什么是“过约束”

  • 定义:在布局/布线阶段人为收紧时序预算(通常 ≥ 200 ps),迫使工具对关键路径投入更多优化资源;布线后再释放多余预算,从而提前达到时序收敛。
  • 适用范围
    – 仅用于时钟内同步跨时钟域路径;
    异步路径假路径禁止过约束(工具已忽略)。
  • 官方定位:UG949 §5.5.9 将过约束列为“布线前最后一次加速手段”,并给出 0.5 ns 上限建议。

2. 官方推荐公式与数值

阶段过约束量来源备注
布局前+0.2 ~ +0.5 nsUG949 v2018.3 p.128超过 0.5 ns 可能过度优化增加布线拥塞
保持时间仅当 WHS < –0.4 nsUG904 §2.4.1布线前修复,避免布线后Hold Detour导致建立时间退化

3. 实现方式对比(官方支持 vs 民间偏方)

方式是否推荐官方理由实测副作用
set_clock_uncertainty -setup✅ 官方推荐不改变周期、占空比、时钟关系;易回滚
直接缩小 create_clock -period❌ 不推荐改变所有衍生时钟;无法局部撤销导致假违例编译时间翻倍
set_max_delay 硬压⚠️ 有限场景仅适合跨时钟域且需datapath_only容易覆盖多周期约束优先级混乱

4. 一键过约束脚本(Project / Non-Project 通用)

# 1. 定位需要过约束的时钟对
set worst_clk [get_clocks -of_objects [get_timing_paths -setup -max_paths 1]]
set worst_slack [get_property SLACK [get_timing_paths -setup -max_paths 1]]

# 2. 仅当 WNS ∈ [-0.5 ns, 0 ns] 才过约束
if {$worst_slack > -0.5 && $worst_slack < 0} {
    set over 0.3
    set_clock_uncertainty -setup $over $worst_clk
    puts "INFO: Over-constrained $worst_clk by ${over}ns"
}

# 3. 布局后**必须**回滚,否则影响最终报告
#    在 route_design 前放入 Tcl.pre
set_clock_uncertainty -setup 0 $worst_clk

在这里插入图片描述


5. 过约束与 Hold-Detour 的联动

  • 场景:布线后 Hold Slack 为 –0.55 ns,工具插入 LUT1 导致建立路径被推开
  • 官方方案(UG904 §2.4.1):
    1. phys_opt_design 前加 +0.4 ns 过约束;
    2. 使用 -hold_fix-aggressive_hold_fix
    3. 布线前 撤销过约束,避免建立时间过度优化。
  • 结果:Hold Slack 提升至 –0.12 ns,建立时间仍保持 +0.15 ns

6. 过约束的 3 条红线

  1. 不得超过 0.5 ns(UG949 明确警告);
  2. 不得用于异步路径set_clock_groups 已忽略);
  3. 必须在布线前回滚,否则
    – 最终报告虚高
    – 可能掩盖真实时序问题;
    – 下游PR流程无法复现结果。

7. 快速自查清单

检查项Tcl 命令通过标准
过约束量report_clock -of_objects $clkUSER_UNCERTAINTY ≤ 0.5 ns
是否回滚get_clock_uncertainty $clk布线前 = 0
优先级冲突report_exceptions -overlapset_max_delay 覆盖

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值