物理优化是对设计的negative-slack路径进行时序驱动的优化。而phys_opt_design 命令是用于对设计进行物理优化。这个命令可以在布局后的后置模式(post-place mode)中运行,也就是在放置所有组件之后;还可以在完全布线后的后置模式(post-route mode)中运行,即在设计完全布线之后。
一、phys_opt_design
phys_opt_design 语法
phys_opt_design [-fanout_opt] [-placement_opt] [-routing_opt] [-slr_crossing_opt] [-rewire] [-insert_negative_edge_ffs]
[-critical_cell_opt] [-dsp_register_opt] [-bram_register_opt] [-uram_register_opt] [-bram_enable_opt] [-shift_register_opt]
[-hold_fix] [-aggressive_hold_fix] [-retime] [-force_replication_on_nets <args>] [-directive <arg>]
[-critical_pin_opt] [-clock_opt] [-path_groups <args>] [-tns_cleanup] [-sll_reg_hold_fix] [-quiet] [-verbose]
phys_opt_design脚本示例:
open_checkpoint top_placed.dcp
phys_opt_design
write_checkpoint -force $outputDir/top_placed_phys_opt.dcp
report_timing_summary -file $outputDir/top_placed_phys_opt_timing.rpt
route_design
write_checkpoint -force $outputDir/top_routed.dcp
report_timing_summary -file $outputDir/top_routed_timing.rpt
phys_opt_design
write_checkpoint -force $outputDir/top_routed_phys_opt.dcp
report_timing_summary -file $outputDir/top_routed_phys_opt_timing.rpt
该phys_opt_design示例脚本会依次执行布局后的物理优化和布线后的物理优化。首先,从检查点(checkpoint)中加载已布局的设计,然后执行布局后的phys_opt_design物理优化。在优化完成后,保存检查点和时序结果。
接下来,对设计进行布线,并在布线过程中保存进度。布线完成后,执行布线后的phys_opt_design物理优化。最后,保存优化结果。
需要注意的是,无论是布局后还是布线后的物理优化,都使用了相同的phys_opt_design命令。在脚本中并没有显式地使用任何选项来指定模式(即布局后或布线后)。这意味着工具可能通过其他方式(比如检查点的状态或者设计数据库中的信息)来自动判断当前应该执行哪种类型的物理优化。
-verbose 选项
为了更好地分析物理优化的结果,可以使用 -verbose 选项来查看 phys_opt_design 命令执行的优化操作的额外细节。由于可能会产生大量的额外消息,这可能会使日志或控制台输出变得难以管理,-verbose 选项默认是关闭的。
另外,由于 phys_opt_design 命令是直接在内存中的设计上操作,每次运行都会基于当前的设计状态进行优化。因此,如果连续运行该命令多次,后一次运行将基于前一次运行的结果进行优化,而不是基于原始设计。这意味着每次优化都会累积之前优化的效果,可能会导致设计逐渐趋近于更理想的物理布局和布线。
二、物理优化约束
Vivado Design Suite在物理优化过程中会尊重 DONT_TOUCH 属性。它不会对具有这些属性的nets或cells进行物理优化。为了加速网络选择过程,具有 DONT_TOUCH 属性的nets会被预先过滤,并且不会被考虑进行物理优化。此外,Pblock 分配也会被遵守,这样复制的逻辑会继承原始逻辑的 Pblock 分配。时序异常也会从原始cells复制到复制的cells。
DONT_TOUCH 属性通常被放置在leaf cells上,以防止它们被优化。如果在一个hierarchical cell 上设置 DONT_TOUCH,则会保留cells的边界,但cells内部仍然可以进行优化。
工具会自动给那些 MARK_DEBUG 属性值为 TRUE 的nets添加值为 TRUE 的 DONT_TOUCH 属性。这样做是为了在整个实现流程中保持nets的完整性,以便在任何设计阶段都可以对其进行探测。这是 MARK_DEBUG 的推荐用法。然而,在极少数情况下,DONT_TOUCH 可能会过于限制,并阻止诸如复制和重定时等优化,从而导致时序收敛更加困难。在这些情况下,可以将 DONT_TOUCH 设置为 FALSE,同时保持 MARK_DEBUG 为 TRUE。移除 DONT_TOUCH 属性的后果是,具有 MARK_DEBUG 的nets可能会被优化掉,从而无法再被探测。如果 MARK_DEBUG nets被复制,只有原始nets会保留 MARK_DEBUG,复制的nets则不会。
三、物理优化报告
Tcl 报告命令 report_phys_opt 提供了 phys_opt_design 执行的每个优化的详细细节。它必须在与 phys_opt_design 相同的 Vivado 会话中运行,并且优化历史必须驻留在内存中。因此,如果需要报告,建议将 report_phys_opt 命令包含在 Tcl 脚本中,紧跟在最后一个 phys_opt_design 命令之后。
这些报告仅适用于布局后的 phys_opt_design 优化。报告是累积的,反映了所有 phys_opt_design 优化,包括多次运行 phys_opt_design 的结果。以下报告示例显示了涉及名为 pipeline_en 的寄存器的一个扇出优化的第一条记录。报告中显示了以下详细信息:
1、原始驱动器 pipeline_en 驱动了 816 个负载,并且包含这个高扇出网络的路径在时序上失败,最差负时序裕量(WNS)为 -1.057 ns。
2、驱动器 pipeline_en 被复制以创建一个新单元,名为 pipeline_en_replica。
3、816 个负载在 pipeline_en_replica 和原始驱动器 pipeline_en 之间被分配,其中 pipeline_en_replica 承担 386 个负载,原始驱动器 pipeline_en 承担剩余的 430 个负载。
4、在复制并布局 pipeline_en_replica 之后,pipeline_en_replica 路径的 WNS 为 +0.464 ns,而 pipeline_en 路径的 WNS 降低到零。
5、基于其减少的负载集合的位置,原始驱动器 pipeline_en 的放置位置被更改以改善 WNS。
这些详细的报告信息有助于我们理解优化过程,分析优化效果,并可能指导进一步的优化策略。