时序约束的可行性
• 您的约束条件是否干净无误?
现实可行的I/O约束条件
应用了所有必要的时序例外
• 如果不是,许多优化周期可能会浪费在可能不可行的时序路径上。
• 建议:
在运行compile_fusion之前,识别并处理不可行的路径。
处理不可行路径
• 不可行路径是指无法满足时序要求的路径(起点的到达时间>终点的所需时间):
缺少假路径或多周期路径约束
即使将单元和网络延迟设为零,输入或输出延迟约束仍不合理
compute_infeasible_path_overrides
用于识别不可行的时序路径
生成负的路径余量
将生成的路径余量应用于这些路径,以防止对它们进行优化
不可行路径示例
• 下面的例子用于在当前场景中识别不可行路径,并将路径余量异常写入到 out.tcl 文件中。
验证/调整路径余量异常后,通过引用 out.tcl 文件来应用它们。
■ 在报告中:arrival(到达时间)= 起点的到达时间,required(所需时间)= 终点的所需时间。
1fc_shell> compute_infeasible_path_overrides -verbose -output out.tcl
2****************************************
3Report : infeasible path
4Design : risc_core
5Version: V-2023.12-SP3
6Date : Mon Jun 10 06:49:20 2024
7****************************************
8
9 startpoint endpoint
10startpoint endpoint scenario group path arrival required infeasibility
11-------------------------------------------------------------------------------------------------------------------
12alu_clk_en alu/alu_cg/EN func::ss_125c **in2reg_default**
13 3.10 2.95 0.15
14data_clk_en data_path/data_cg/EN func::ss_125c **in2reg_default**
15 3.10 2.96 0.14
16rf_clk_en reg_file/ramc_cg/EN func::ss_125c **in2reg_default**
17fc_shell> sh cat out.tcl
18
19 #################################
20 # compute_infeasible_timing_paths
21 #################################
22
23set_path_margin -10000.00 -setup -comment SYNOPSYS_INFEASIBLE_PATH_OVERRIDE -scenarios func::ss_125c -from alu_clk_en -to alu/alu_cg/EN
24set_path_margin -10000.00 -setup -comment SYNOPSYS_INFEASIBLE_PATH_OVERRIDE -scenarios func::ss_125c -from data_clk_en -to data_path/data_cg/EN
25set_path_margin -10000.00 -setup -comment SYNOPSYS_INFEASIBLE_PATH_OVERRIDE -scenarios func::ss_125c -from rf_clk_en -to reg_file/ramc_cg/EN
不可行路径命令详情
• compute infeasible path overrides
命令默认针对当前场景执行。
根据需要使用
-corners
、-modes
或-scenarios
来指定角点、模式或场景。每个路径组识别出最差的10,000条路径。
可以使用`-max_paths`或 `-nworst` 来调整此数目。
默认情况下,该命令不直接应用路径余量。
建议生成输出文件(使用`-output`参数),检查并修正后,再通过source命令应用。
或者,可以使用`-apply_override_constraints`选项在命令执行时直接应用这些余量。
• 生成的`set_path_margin`命令:应用一个时序例外,该例外可通过
report_exceptions
命令报告。始终通过10,000时间单位来放宽路径的时序要求。
移除不可行路径
• 自动生成的路径余量例外会带有注解属性值 "* comment",其内容为 SYNOPSYS_INFEASIBLE_PATH_OVERRIDE
。
• 要移除这些已生成的路径余量,可使用命令:remove_path_margin -comment SYNOPSYS_INFEASIBLE_PATH_OVERRIDE
每个执行的 set_path_margin
命令都会在当前设计中创建一个异常对象,该对象可以通过其路径(使用 get_exceptions -from/-to
)来识别。每个路径余量异常都有一个注释属性,该属性会自动被赋予一个值 synopsys_infeasible_path_override
。这个注释属性的值可以用来仅通过上述的 remove_path_margin
命令从设计中移除路径余量异常。
你现在应该能够:
• 执行多角多模(MCMM)建立时间分析:
定义分析和优化所需的角点、模式和场景。
加载MCMM约束。
配置场景设置。
建模芯片内变异。
• 处理不可行的时序路径。
缩放组(Scaling Groups)
通过使用缩放组,Fusion Compiler能够在由四个.db
PVT条件界定的任何电压和温度之间进行插值,例如:
0.9V @ -20°C
0.8V @ 100°C
这使得在不必针对每个可能的工作电压和温度进行特性化的情况下,也能高效地进行多电压设计。
通常,这一功能在流片前最终设计阶段不被采用。
使用缩放组(Scaling Groups)
• 通过列出所需的.db
文件来定义缩放组(SGs):
实际的数据库文件不需要——数据库名称仅用于识别面板。
要查找名称,运行
report_lib
并查找“source.db库”。在一个SG中的所有.db文件里,工艺编号和标签必须相同。
• 接下来,您可以指定哪个SG应用于哪个corner:
默认情况下,所有SG都可以在所有角落中使用。
1define_scaling_lib_group -name my_sgl \
2{ss0p75vn40c.db ss0p95vn40c.db ss0p75vl25c.db ss0p95vl25c.db}
3# optional-ifyou only want to use the scaling group in a specific comer:
4set_scaling_lib_group my_sgl -corners ss_80c
5# Prevent any scaling groups from being used for analysis for corner ss_120c:
6set_scaling_lib_group -none -corners ss_120c
set_scaling_lib_group
命令允许在指定的角点中使用特定的缩放库组进行分析。工具会在这个组内的库之间进行电压、温度或电压和温度的插值。你可以为最大延迟分析、最小延迟分析或两者都设置缩放库(使用-min和-max选项)。在一个角点上,你可以设置多个允许的缩放库组。默认情况下,所有定义的缩放库组可以在每个角点上使用。
在上面的例子中,通过set_scaling_lib_group -none -corners ss_120c
禁用了特定角点的缩放功能,这意味着对于这个角点,将会进行VT匹配(电压和温度匹配)。
变化的来源
• 由于以下原因,器件的电气特性会发生变化:
■ 晶体管多边形形状的变化
■ 掺杂原子位置和密度的变化
■ 边缘的不规则性
早/晚与非高斯分布
• 设置(Setup)和保持(Hold)时序是在它们各自的晚(late)和早(early)分布尾部报告的。
• POCV通过早(early)和晚(late)结构来处理非高斯延迟分布,
■ 同时支持单一系数和LVF流程。
• 时序分析是利用估计的高斯分布进行的。
简而言之,即使面对非高斯分布的时序数据,POCV也能通过特定的早/晚结构来应对,这一处理方式同时兼容单一系数模型和LVF模型,并且在进行时序分析时,会采用估计的高斯分布模型来进行评估。
模拟OCV/使用最小/最大库
• 如果针对每个角点都有可用的“最小”和“最大”库来模拟芯片内变异,那么应如下所示指定这些库,而非应用set_timing_derate命令。
1current_corner SLOW
2set voltage 0.95 -object_list VDD
3set voltage 0.98 -object_list VDD -min
4set temperature 125
5set temperature 117 -min
6set process_number -late 1.10
7set process_number -early 1.08
8set process_label -late SLOW_MAX
9set_process label -early SLOW_MIN
如果需要工艺标签(例如,因为最小和最大库都使用了相同的工艺编号):
1set_process_label -late SLOW_MAX
2set_process_label -early SLOW_MIN