引言
当 FPGA 设计未能满足其时序约束(timing constraints)时,很自然要去仔细查看关键路径(critical path)。这个检查要在一个时序报告上进行,报告会显示路径上各个逻辑元件各自带来的延时。
如果你不是 Intel FPGA 的重度用户,搞清楚到底怎么才能拿到这份报告可能并不简单。更糟的是,你可能会在不知情的情况下,看了一份错误的报告。
首先要理清的概念是多边界时序分析。通常的验证方法是,在四种情况下确保时序约束都能满足,从而确认 FPGA 的时序没有问题:最低温度和最高温度,再分别配合“慢速”和“快速”时序模型。换句话说,分析共覆盖四种组合,也就是常说的四个边界条件(corner)。
因此,在检查关键路径时,必须把四个边界条件下的时序报告都看一遍。这一点经常被忽略。例如,TimeQuest 通常只默认生成单个边界条件的时序报告。
这篇文章就来介绍如何获得真正有意义的报告。示例以 Quartus Prime 17.1 Lite 为准。
我还想提另外两篇相关文章:一篇分析了输入/输出约束与这些时序报告之间的关系;另一篇则在 TimeQuest 上做了一些 Tcl 脚本实验。
重要提示:本文讲解的是如何为建立时间(setup)要求生成时序报告。但除此之外,系统还会为保持时间(hold)、恢复时间(recovery)和移除时间(removal)生成时序报告。这些报告同样有可能暴露出时序约束未能满足的问题。
用脚本快速生成多边界(multi-corner)报告
首先,把下面的 Tcl 脚本复制到一个文件里,例如 timing.tcl:
create_timing_netlist
read_sdc
update_timing_netlist
foreach_in_collection op [get_available_operating_conditions] {
set_operating_conditions $op
report_timing -setup -npaths 20 -detail full_path -multi_corner \
-panel_name "Critical paths"
}
注意,这个时序报告只限于建立时间(setup)分析。
别被 multi_corner 这个选项弄糊涂了:每次调用 report_timing 只覆盖一个边界条件。目前还不清楚这个选项到底有没有实际作用。
因此,脚本用 foreach_in_collection 循环遍历全部四种条件,为每个边界条件生成单独的报告。
下面开始实际操作:
- 在 Quartus 中,展开 Task(任务)面板里的 TimeQuest 组,打开 TimeQuest Timing Analyzer。
- 在 TimeQuest Timing Analyzer 中,从菜单栏选择 Script > Run Tcl Script…,然后选中那个 Tcl 脚本(例如 timing.tcl)。
- TimeQuest Timing Analyzer 的 Report(报告)面板中会新增一个名为 Critical paths 的条目。点击其中的 Multi-Corner Summary,主面板就会显示出路径列表及详细情况。
- 若要把这些路径的所有信息导出为文本文件,请右键点击 Multi-Corner Summary,然后选择 Export…。为输出文件指定一个以 .rpt 结尾的名字。不支持导出 HTML 报告(导出的 HTML 会是空文件)。
同一条目下还会有四个单独的报告,分别对应四个边界条件。在更早版本的 Quartus 中,只会有这四个报告(也就是说没有 Multi-Corner Summary)。
只生成 HTML / 文本报告
Quartus 能生成整洁的 HTML 报告,读起来比 TimeQuest 自带的 GUI 舒服得多。但遗憾的是,这类报告每次只能覆盖一个边界条件。下面这个脚本会生成四个独立的 HTML 报告,每个边界条件一个(不过会生成一大堆文件:JQuery 脚本、CSS 等等。功能虽然花哨,但它并不是一个多边界(multi-corner)报告)。
可以把下面这个脚本命名为 timing-html.tcl:
#project_open myproj
create_timing_netlist
read_sdc
update_timing_netlist
foreach_in_collection op [get_available_operating_conditions] {
set_operating_conditions $op
report_timing -setup -npaths 20 -detail full_path -multi_corner \
-file "timing_paths_$op.html" \
-panel_name "Critical paths for $op"
}
若要生成纯文本报告,把 -file 参数的后缀从 .html 改成 .rpt 或 .txt 即可。
注意脚本顶部被注释掉的 project_open 命令。如果去掉注释并把 myproj 换成实际工程名,就可以在纯 shell 命令行里生成 HTML 报告,例如用下面这样的命令:
$ /path/to/quartus/bin/quartus_sta -t timing-html.tcl
不过,我还没有找到用这种方式生成多边界(multi-corner)报告的办法。
为了让每次编译实现后都自动生成这些报告(这也是推荐做法),可以在 QSF 文件中加入下面这样一行:
set_global_assignment -name TIMEQUEST_REPORT_SCRIPT relative/path/to/timing-html.tcl
当 Tcl 脚本以这种方式被 QSF 文件调用时,脚本里不要再使用 project_open。
只用 GUI 操作
只用鼠标点一点,同样能得到多边界(multi-corner)报告:
- 在 Quartus 中,展开 Task(任务)面板里的 TimeQuest 组,打开 TimeQuest Timing Analyzer。
- 在 Timing Analyzer 的 Tasks(任务)面板里,双击 Update Timing Netlist。
- 还是在同一个面板,向下滚动到 Custom Reports 部分,双击 Report Timing…
- 此时会打开一个对话框。先选择 setup、hold、recovery 或 removal,其余选项保持默认即可,然后点击下方的 Report Timing 按钮。
- 在 Report(报告)面板中会新增一个名为 Report Timing 的条目。展开这个条目并右键点击它。在弹出的菜单中,点击 Generate in All Corners。
- 点击 Multi Corner Summary 组,然后可以按前面介绍的方法把报告导出。