---
title: FPGA静态时序分析（STA）实践指南：建立时间与保持时间的设计验证
url: "https://www.fpgalearn.com/33558.html"
kind: article
id: 33558
excerpt: 静态时序分析（Static Timing Analysis, STA）是保障FPGA设计在目标频率下稳定运行的核心流程。其中，建立时间（Setup Time）与…
published_at: 2026-04-18
author: 二牛学FPGA
tags: fpga, STA, 静态时序分析
word_count: 5639
source: "https://www.fpgalearn.com"
---

# FPGA静态时序分析（STA）实践指南：建立时间与保持时间的设计验证

> 标签：fpga、STA、静态时序分析
> 静态时序分析（Static Timing Analysis, STA）是保障FPGA设计在目标频率下稳定运行的核心流程。其中，建立时间（Setup Time）与…

> 静态时序分析（Static Timing Analysis, STA）是保障FPGA设计在目标频率下稳定运行的核心流程。其中，建立时间（Setup Time）与…

静态时序分析（Static Timing Analysis, STA）是保障FPGA设计在目标频率下稳定运行的核心流程。其中，建立时间（Setup Time）与保持时间（Hold Time）是STA理论的两大基石。本指南旨在提供从概念验证到深度理解的完整路径，通过结构化的实验步骤，帮助工程师掌握时序约束的编写方法，并有效诊断与修复时序违例问题。
## 快速上手：概念验证实验
通过以下步骤，您可以快速在工具中观察建立时间和保持时间裕量的变化，建立直观认识。
- **步骤一：**准备一个简单的两级触发器级联电路，中间包含组合逻辑。
- **步骤二：**在Vivado或Quartus中创建工程，选择目标器件（例如Artix-7 xc7a35t）。
- **步骤三：**编写基础约束文件（.xdc或.sdc），仅定义主时钟（例如：`create_clock -period 10.000 [get_ports clk]`）。
- **步骤四：**运行综合（Synthesis）与实现（Implementation）。
- **步骤五：**打开实现后的时序报告（如Vivado中的“Report Timing Summary”）。
- **步骤六：**查看“Setup”和“Hold”路径的时序裕量（Slack）。初始状态下两者应为正值。
- **步骤七：**修改时钟约束，将周期大幅减小（例如改为2ns），重新运行实现。
- **步骤八：**再次查看时序报告，观察“Setup Slack”是否变为负数（违例），而“Hold Slack”通常仍为正。
- **步骤九：**在RTL代码中，于两级触发器之间插入深度组合逻辑（如大型多路选择器），再次运行实现。
- **步骤十：**查看报告，可能观察到“Hold Slack”也变为负数，从而理解两种违例的不同触发条件。
## 前置条件与环境配置
| 项目 | 推荐值/说明 | 替代方案/注意点 |
| --- | --- | --- |
| **FPGA器件/板卡** | Xilinx Artix-7系列（如xc7a35t）或Intel Cyclone IV/V系列 | 任何具有明确数据手册的商用FPGA开发板均可，需知悉其速度等级（Speed Grade）。 |
| **EDA工具版本** | Vivado 2022.1 或 Quartus Prime 21.1 及以上 | 确保版本支持目标器件。不同版本报告界面略有差异，核心概念不变。 |
| **仿真器（可选）** | Vivado Simulator / QuestaSim / VCS | 用于行为级功能验证，STA主要依赖工具静态分析。 |
| **主时钟频率** | 初始建议100MHz（周期10ns） | 低频率易于满足时序，便于观察。后续可提高以制造违例。 |
| **复位方式** | 低电平有效的同步复位 | 异步复位需进行同步化处理，否则会影响时序分析模型。 |
| **约束文件** | 必须的：主时钟定义、输入/输出延迟 | 约束的完整性直接影响STA结果的准确性。虚拟时钟用于分析异步接口。 |
| **目标速度等级** | -1（商业级常见） | 速度等级（-1， -2， -3等）直接影响器件内部延迟，等级越高（数字越小）性能通常越好。 |
| **工作温度** | 商用温度范围（0°C ~ 85°C） | STA通常在典型（Typical）或最差（Worst）工艺角下进行，温度是“最差情况”参数之一。 |
## 目标与验收标准
- **功能点：**在EDA工具中成功执行静态时序分析，并正确解读时序报告的关键信息。
- **性能指标：**针对给定设计，能根据时钟频率要求，判断其是否满足建立时间和保持时间要求。核心验收指标为时序裕量（Slack）：`Setup Slack ≥ 0` 且 `Hold Slack ≥ 0`。
- **波形理解：**能在时序波形图（若工具支持）或通过理论分析，构建数据与时钟沿的相对时序关系，解释建立/保持时间违例的根本原因。
- **约束能力：**能够编写正确的主时钟、生成时钟以及输入/输出延迟约束，为STA提供准确的分析上下文。
## 实施步骤详解
### 阶段一：工程创建与基础RTL设计
创建一个包含清晰数据路径的简单设计，作为后续分析的基准模型。以下是一个两级寄存器流水线的示例：
```
// 示例：两级寄存器流水线，中间为组合逻辑
module setup_hold_demo (
    input wire clk,
    input wire rst_n,
    input wire [7:0] data_in,
    output reg [7:0] data_out
);

    reg [7:0] reg1;
    wire [7:0] comb_logic_out;

    // 第一级寄存器
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n)
            reg1 <= 8‘h0;
        else
            reg1 <= data_in;
    end

    // 中间组合逻辑（示例：加法器）
    assign comb_logic_out = reg1 + 8‘h01;

    // 第二级寄存器
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n)
            data_out <= 8‘h0;
        else
            data_out <= comb_logic_out;
    end
endmodule
```
### 阶段二：时序约束编写与迭代
时序约束是STA的“语言”。请按顺序创建并应用以下约束，观察其对时序报告的影响。
- **约束1：主时钟定义。**这是最基本的约束，为STA提供时间基准。
`create_clock -name sys_clk -period 10.000 [get_ports clk]`
- **约束2：输入延迟。**定义输入端口信号相对于时钟的到达时间。
`set_input_delay -clock sys_clk -max 2.000 [get_ports data_in]`
`set_input_delay -clock sys_clk -min 0.500 [get_ports data_in]`
- **约束3：输出延迟。**定义输出端口信号相对于时钟的要求稳定时间。
`set_output_delay -clock sys_clk -max 3.000 [get_ports data_out]`
`set_output_delay -clock sys_clk -min 1.000 [get_ports data_out]`
- **约束4：时钟不确定性。**为时钟抖动、偏移等预留裕量，是签核（Sign-off）的关键。
`set_clock_uncertainty -setup 0.200 [get_clocks sys_clk]`
`set_clock_uncertainty -hold 0.100 [get_clocks sys_clk]`
### 阶段三：运行分析与报告解读
在工具中运行实现并生成时序报告后，重点关注以下部分：
- **时序总结（Timing Summary）：**查看最差建立时间裕量（WNS, Worst Negative Slack）和最差保持时间裕量（WHS）。正值表示满足，负值表示违例。
- **违例路径详情：**点击违例路径，查看其“数据路径（Data Path）”和“时钟路径（Clock Path）”的详细分解。这能帮助您定位延迟的主要来源是逻辑（Logic Levels）还是布线（Net Delay）。
- **时钟偏移（Clock Skew）：**在路径报告中，关注发射时钟（Launch Clock）和捕获时钟（Capture Clock）的延迟差。过大的正偏移有利于保持时间但不利于建立时间，反之亦然。
## 验证结果与案例分析
| 场景描述 | 组合逻辑复杂度 | 典型 Setup Slack | 典型 Hold Slack | 结果分析与原因 |
| --- | --- | --- | --- | --- |
| 基础设计，时钟周期10ns | 低（简单加法） | 8.5 ns | 0.5 ns | 时序充裕，设计安全。 |
| 时钟周期缩短至5ns | 低（简单加法） | -0.3 ns (违例) | 0.7 ns | 建立时间违例。数据路径延迟相对于新时钟周期过长，数据无法在下一个时钟沿前稳定。 |
| 时钟周期10ns，但组合逻辑极短（直通） | 极低（直连或缓冲） | 9.0 ns | -0.1 ns (违例) | 保持时间违例。数据路径延迟过小，时钟偏移（Skew）可能导致新数据过早到达，覆盖了前一个周期应保持的数据。 |
| 时钟周期5ns，组合逻辑适中 | 中等（条件运算） | 0.2 ns | 0.15 ns | 设计处于性能边界。建立和保持时间均以极小正裕量满足，对工艺、温度变化敏感。 |
*测量条件：Xilinx Artix-7 xc7a35t-fgg484-1器件，Vivado 2022.1，使用上述约束，工作温度85°C。*
## 故障排查（Troubleshooting）
- **现象：**建立时间违例（WNS < 0）。
**原因：**数据路径延迟过长，或时钟周期过短。
**检查点：**查看违例路径的“Data Path”详情，识别是逻辑级数过多还是布线延迟过大。
**修复建议：**1) 降低时钟频率；2) 对长组合逻辑进行流水线切割（插入寄存器）；3) 使用寄存器输出；4) 尝试不同的综合策略（如Area优化可能减少逻辑级数）。
- **现象：**保持时间违例（WHS < 0）。
**原因：**数据路径延迟过短，时钟偏移影响显著。
**检查点：**检查违例路径起点和终点的时钟是否来自同一时钟根，查看时钟网络延迟（Clock Skew）。
**修复建议：**1) 在数据路径中插入小的缓冲逻辑（LUT1）或寄存器（插入流水线级）；2) 优化时钟约束，适当增加保持时间不确定性（`set_clock_uncertainty -hold`）；3) 检查是否因逻辑优化（如SRL化）意外缩短了路径。
- **现象：**时序报告中有大量未约束的路径。
**原因：**缺少输入延迟、输出延迟或生成时钟约束。
**检查点：**查看“Unconstrained Paths”数量。
**修复建议：**补全所有时钟域和I/O接口的约束。未约束路径的时序结果不可信。
- **现象：**改变优化策略后，一种违例消失但另一种违例出现。
**原因：**建立时间和保持时间要求存在内在矛盾，优化可能顾此失彼。
**检查点：**对比优化前后的WNS和WHS。
**修复建议：**需要平衡优化。通常优先解决建立时间违例（因其与频率直接相关），再通过插入缓冲解决可能新出现的保持时间问题。
- **现象：**后仿（门级仿真）出现亚稳态或功能错误，但STA报告通过。
**原因：**1) 约束不完整或不正确（如跨时钟域路径未设`false_path`或`set_max_delay`）；2) 复位/置位信号恢复/移除时间违例。
**检查点：**检查异步时钟域路径和复位信号的时序报告。
**修复建议：**对异步路径施加正确的约束，对异步复位进行同步化并检查恢复/移除时间。
- **现象：**同一设计在不同速度等级器件上时序结果差异巨大。
**原因：**速度等级直接影响单元延迟和布线延迟模型。
**检查点：**确认工程设置的器件型号和速度等级是否正确。
**修复建议：**始终针对目标器件的最差工艺角（Worst Case）进行时序签核。
## 扩展与下一步
- **参数化时序分析：**编写脚本（Tcl/Python）自动遍历不同时钟频率，生成频率-裕量曲线，找到设计的最大稳定工作频率（Fmax）。
- **跨时钟域（CDC）分析：**在设计中引入第二个时钟域，学习如何使用`set_false_path`、`set_max_delay`或使用专门的CDC约束（如Xilinx的`ASYNC_REG`）来安全处理异步信号，并利用工具（如Vivado的CDC报告）进行验证。
- **高级约束场景：**学习多周期路径（`set_multicycle_path`）、虚假路径（`set_false_path`）、以及针对DDR等接口的源同步（Source Synchronous）约束方法。
- **时序例外（Timing Exceptions）的深入理解：**理解如何正确使用例外约束来指导工具优化，避免对非关键或虚假路径进行不必要的优化，从而将资源集中在真正的关键路径上。
## 参考与附录
- **Xilinx 官方文档：**UG903 (Vivado Design Suite User Guide: Using Constraints)，UG906 (Vivado Design Suite User Guide: Design Analysis and Closure Techniques)。
- **Intel 官方文档：**Quartus Prime Handbook Volume 1: Design and Synthesis， Quartus Prime Timing Analyzer。
- **经典理论书籍：**《Static Timing Analysis for Nanometer Designs: A Practical Approach》 by J. Bhasker, Rakesh Chadha。
- **附录A：关键术语**
- **时序裕量（Slack）：**要求时间（Required Time）与实际到达时间（Arrival Time）之差。正值为裕量，负值为违例。
- **时钟偏移（Clock Skew）：**同一时钟信号到达电路中不同触发器时钟端的时间差异。
- **时钟不确定性（Clock Uncertainty）：**用于建模时钟抖动（Jitter）和额外偏移（Skew）的预留裕量。
- **数据到达时间（Data Arrival Time）：**数据从发射触发器出发，经过组合逻辑和布线，到达捕获触发器数据输入端的总时间。
- **数据要求时间（Data Required Time）：**为保证正确采样，数据必须在捕获触发器时钟沿之前保持稳定的最晚时间（建立时间要求），或之后必须保持稳定的最早时间（保持时间要求）。
