1. TimeQuest时序分析入门

在FPGA设计里,RTL功能正确并不等于电路能在目标频率下稳定工作。逻辑综合与布局布线会把代码映射成真实的查找表、触发器和互连资源,信号在芯片内部的传播需要时间。只要某条路径的延迟超过了时钟允许的窗口,触发器就可能采到不稳定的值,表现为偶发错误、上板后概率性失效,甚至在实验室正常、量产批次出问题。TimeQuest静态时序分析(STA)要解决的正是这件事:在不依赖激励向量的前提下,穷举所有时序路径,判断它们是否满足建立、保持等时序要求。

时序约束与签核:先定义“合格线”,再逐条核对

时序约束的本质,是把设计者的时钟、输入输出和例外意图,翻译成工具能够计算的“合格线”。没有约束,STA无法判断一条路径是否合格,因为工具不知道时钟周期是多少、外部器件何时给出数据、哪些路径本来就不需要按时钟节拍工作。常见的约束对象包括:

  • 时钟定义:用 create_clock 描述时钟周期、占空比与波形,例如 50 MHz 对应 20 ns 周期。
  • 时钟特性:用 create_generated_clock 描述分频、倍频或门控产生的派生时钟,用 set_clock_uncertainty 描述抖动与余量。
  • 输入输出延迟:用 set_input_delay、set_output_delay 描述FPGA边界之外器件带来的到达时间与需求时间。
  • 时序例外:用 set_false_path、set_multicycle_path、set_max_delay/set_min_delay 描述异步跨时钟域、慢速采样、复位释放等特殊路径。

签核(sign-off)则是约束建立之后的一次“判定动作”:在特定工艺角、电压和温度条件下运行STA,检查建立时间(Setup)、保持时间(Hold)、恢复/移除(Recovery/Removal)、脉冲宽度等检查项是否全部通过,并确认没有未约束路径、没有未满足的例外。签核通过意味着设计在时序层面达到了可交付状态;签核不通过,就必须回到约束或RTL/布局去修正。需要强调的是,签核不是“跑一次报告”,而是约束质量、分析覆盖率和结果判读三者的综合结论。

SDC文件:约束的载体与可复现的工程资产

SDC(Synopsys Design Constraints)是业界通用的时序约束描述格式,TimeQuest通过读取SDC文件获得全部约束信息。它采用Tcl语法,因此可以写变量、条件判断和循环,便于参数化和复用。一个典型的SDC片段如下:

# 主时钟:50 MHz,周期20 ns
create_clock -name clk_50m -period 20.000 [get_ports {clk}]

# 输入抖动与余量
set_clock_uncertainty -setup 0.150 [get_clocks clk_50m]
set_clock_uncertainty -hold  0.080 [get_clocks clk_50m]

# 输入延迟:数据相对时钟的到达时间
set_input_delay -clock clk_50m -max 3.500 [get_ports {din[*]}]
set_input_delay -clock clk_50m -min 1.200 [get_ports {din[*]}]

# 输出延迟:下游器件对FPGA输出的需求
set_output_delay -clock clk_50m -max 4.000 [get_ports {dout[*]}]
set_output_delay -clock clk_50m -min 0.800 [get_ports {dout[*]}]

# 异步跨时钟域路径不做时序检查
set_false_path -from [get_clocks clk_a] -to [get_clocks clk_b]

SDC文件的价值在于“可复现”:同一份约束可以随工程进入版本管理,在综合、布局布线、签核各阶段重复使用,避免每次手工设置导致结果不可比。约束写得越贴近真实系统,STA结论越可信;反之,约束过松会掩盖问题,约束过紧会浪费面积和功耗。

TimeQuest在Quartus流程中的位置

在Quartus完整流程中,TimeQuest并不是孤立工具,而是嵌入在“综合—布局布线—时序分析—编程”链路中的分析环节。综合阶段生成网表,布局布线阶段确定实际延迟,TimeQuest在此基础上读取SDC并计算路径时序。它既可以作为独立GUI启动,也可以在命令行中通过 quartus_sta 运行,便于脚本化和回归。下图给出TimeQuest在Quartus流程中的位置,以及约束、网表、报告三者的输入输出关系。

TimeQuest 在 Quartus 流程中的位置与数据流 RTL 设计 .v / .sv / .vhd 综合 Analysis & Synthesis 布局布线 Fitter TimeQuest STA 时序分析 / 签核 编程 .sof SDC 约束文件 create_clock / set_input_delay set_false_path / set_multicycle_path 约束输入 布局布线后网表 .vo / 延迟信息 实际走线延迟 网表输入 时序报告 Setup / Hold / Recovery Slack 正负与路径明细 分析输出 签核判断 Slack ≥ 0 且无未约束 通过 / 返回修正 结果判读 不通过则修正约束或设计 启动方式 GUI: Tools → TimeQuest CLI: quartus_sta

启动方式与基本操作路径

在Quartus Prime中启动TimeQuest通常有两种方式。图形界面方式:先完成综合与布局布线,然后选择 Tools → TimeQuest Timing Analyzer,在打开的界面中通过 File → Read SDC File 载入约束,再执行 Tasks 面板中的 Update Timing Netlist、Report All Summaries 等任务。命令行方式适合批量回归:

quartus_sta -t my_project.sta
# my_project.sta 中可写:
# read_sdc my_constraints.sdc
# update_timing_netlist
# report_timing -setup -npaths 20
# report_timing -hold  -npaths 20

无论哪种方式,基本操作顺序都是:读入网表 → 读入SDC → 更新时序网表 → 生成报告。报告中最关键的指标是Slack,定义为“需求时间减去到达时间”。Setup检查中 Slack ≥ 0 表示满足建立要求,Hold检查中 Slack ≥ 0 表示满足保持要求。若某条路径 Slack 为负,报告会给出数据路径、时钟路径和延迟分解,可据此定位是逻辑级数过多、布线拥塞还是约束本身不合理。

初学时建议先只写主时钟约束,运行一次 Report All Summaries,观察未约束路径数量与 Slack 分布,再逐步补充输入输出延迟和时序例外。这样更容易理解每条约束对报告的影响。
不要把“编译通过”当作“时序通过”。Quartus编译成功只说明设计能映射到器件,并不代表满足时序。必须显式运行TimeQuest并确认所有检查项 Slack 非负、无未约束路径,才算完成时序签核。