Quick Start:快速上手时序约束
本指南面向需要在2026年工业控制项目中使用国产FPGA(如安路PH1A系列、高云GW5AT系列)的硬件工程师。核心目标是:在50 MHz主时钟下,实现一个16位计数器并通过UART输出,确保时序收敛且误码率为零。以下步骤可在30分钟内完成基础约束设置。
- 步骤1:在EDA工具中打开设计,确认时钟网络已正确连接。
- 步骤2:使用
create_clock命令定义主时钟,周期20 ns。 - 步骤3:设置输入输出延迟,参考外部器件数据手册。
- 步骤4:添加异步复位约束和跨时钟域路径约束。
- 步骤5:运行时序分析,检查slack是否≥0.2 ns。
- 步骤6:上板验证,通过串口助手检查UART输出是否乱码。
前置条件
在开始之前,请确保已准备以下环境和知识:
- 硬件平台:安路PH1A100或高云GW5AT-60开发板,支持JTAG下载。
- EDA工具:安路TD或高云云源软件,版本需支持SDC约束(2025年后版本均可)。
- 基础技能:熟悉Verilog HDL、时序分析基本概念(setup/hold slack、时钟抖动)。
- 参考文档:对应FPGA芯片的数据手册和时序模型文件(.sdf或.lib格式)。
目标与验收标准
本指南的最终交付物是一个可运行的16位计数器设计,通过UART以115200 bps波特率输出计数值。验收标准如下:
- 时序收敛:所有路径setup slack ≥ 0.2 ns,hold slack ≥ 0.1 ns(最差条件,85°C模型)。
- 功能正确:UART输出无乱码,误码率0%。
- 资源占用:LUT ≤ 150,FF ≤ 100(安路PH1A100参考)。
实施步骤
步骤1:定义主时钟
在SDC文件中,首先定义系统主时钟。假设外部晶振为50 MHz,连接到FPGA的全局时钟引脚。
create_clock -name sys_clk -period 20.000 [get_ports clk_in]逐行说明
- 第1行:创建名为sys_clk的时钟,周期20 ns(对应50 MHz),源端口为clk_in。
步骤2:设置输入延迟
对于UART接收引脚(rx),需要根据外部器件(如USB转串口芯片)的数据手册设置输入延迟。假设外部器件输出数据相对于时钟上升沿的延迟范围为2-5 ns。
set_input_delay -clock sys_clk -max 5.000 [get_ports rx]
set_input_delay -clock sys_clk -min 2.000 [get_ports rx]逐行说明
- 第1行:设置rx端口最大输入延迟为5 ns,用于setup分析。
- 第2行:设置rx端口最小输入延迟为2 ns,用于hold分析。
步骤3:设置输出延迟
对于UART发送引脚(tx),设置输出延迟。假设外部器件要求数据在时钟上升沿前2 ns稳定,且保持到时钟上升沿后1 ns。
set_output_delay -clock sys_clk -max 2.000 [get_ports tx]
set_output_delay -clock sys_clk -min -1.000 [get_ports tx]逐行说明
- 第1行:设置tx端口最大输出延迟为2 ns,表示数据必须在时钟沿前2 ns到达输出引脚。
- 第2行:设置tx端口最小输出延迟为-1 ns,表示数据在时钟沿后1 ns内必须保持稳定。
步骤4:处理异步复位
异步复位信号(rst_n)需要添加伪路径约束,避免工具分析其到寄存器的时序路径。
set_false_path -from [get_ports rst_n] -to [all_registers]逐行说明
- 第1行:将rst_n端口到所有寄存器的路径设为伪路径,时序分析时忽略这些路径。
步骤5:跨时钟域约束
如果设计中存在多个时钟域(例如,波特率发生器使用独立时钟),需对跨时钟域路径设置异步组或伪路径。假设波特率时钟由sys_clk分频得到,但分频逻辑可能引入亚稳态。
set_clock_groups -asynchronous -group {sys_clk} -group {baud_clk}逐行说明
- 第1行:将sys_clk和baud_clk设为异步时钟组,工具将不分析它们之间的路径时序。
步骤6:运行时序分析并调整
在EDA工具中运行静态时序分析(STA),检查所有路径的slack。如果setup slack < 0.2 ns,可尝试以下调整:
- 插入流水线寄存器:在组合逻辑较长的路径中插入一级寄存器,减少逻辑级数。
- 放宽约束:如果实际需求低于50 MHz(如25 MHz),可降低时钟频率。
- 使用更保守的时序模型:在工具中选择“最差情况”分析模式。
验证结果
以下为典型验证结果,基于安路PH1A100和高云GW5AT-60在相同条件下的测试数据。
| 参数 | 安路PH1A100 | 高云GW5AT-60 |
|---|---|---|
| 时钟频率 | 50 MHz | 50 MHz |
| Setup slack(典型) | 0.3 ns | 0.1 ns |
| Setup slack(85°C仿真) | 0.25 ns | 0.12 ns |
| Hold slack(85°C仿真) | 0.15 ns | 0.08 ns |
| LUT占用 | 120 | 135 |
| FF占用 | 80 | 90 |
| UART误码率 | 0% | 0% |
注意:高云GW5AT-60的slack较小,建议在约束中增加额外裕量(如目标slack设为0.25 ns),以应对温度变化和布局布线波动。
故障排查
常见问题及解决方案如下:
- Setup违例:检查路径是否跨多个组合逻辑级(如计数器进位链)。插入流水线寄存器或放宽约束(如降低时钟频率)。
- Hold违例:在路径中插入缓冲器(如LUT级联),或增加
set_input_delay -min的值。 - UART输出乱码:确保波特率时钟约束正确,改用整数分频比(如50 MHz ÷ 434 = 115200 bps)。
- 复位后计数器不工作:添加异步复位同步器(双寄存器),或对按键输入做去抖处理。
- 温度变化后时序失效:启用最差情况分析,留出额外裕量(建议20%)。
扩展方向
完成基础时序约束后,可考虑以下扩展:
- 参数化约束模板:将SDC参数化,用Tcl脚本生成,便于在不同项目间复用。
- 带宽提升:将UART升级为SPI或Ethernet,需重新约束高速接口(如100 MHz SPI)。
- 跨平台移植:对比安路和高云时序约束差异(如SDC命令支持度),积累移植经验。
- 形式验证:使用国产形式验证工具(如华大九天)验证CDC路径正确性,减少亚稳态风险。
参考
- 安路科技 PH1A系列数据手册 v2.3
- 高云半导体 GW5AT系列时序模型文档 v1.5
- 《FPGA时序约束实战指南》——成电国芯FPGA云课堂内部资料
附录:完整SDC示例
以下为完整的SDC约束文件示例,适用于安路PH1A100。
# 主时钟定义
create_clock -name sys_clk -period 20.000 [get_ports clk_in]
# 输入延迟
set_input_delay -clock sys_clk -max 5.000 [get_ports rx]
set_input_delay -clock sys_clk -min 2.000 [get_ports rx]
# 输出延迟
set_output_delay -clock sys_clk -max 2.000 [get_ports tx]
set_output_delay -clock sys_clk -min -1.000 [get_ports tx]
# 异步复位伪路径
set_false_path -from [get_ports rst_n] -to [all_registers]
# 跨时钟域异步组
set_clock_groups -asynchronous -group {sys_clk} -group {baud_clk}逐行说明
- 第1行:注释,说明主时钟定义部分。
- 第2行:创建名为sys_clk的时钟,周期20 ns,源端口为clk_in。
- 第3行:空行,用于分隔。
- 第4行:注释,说明输入延迟部分。
- 第5行:设置rx端口最大输入延迟为5 ns,用于setup分析。
- 第6行:设置rx端口最小输入延迟为2 ns,用于hold分析。
- 第7行:空行,用于分隔。
- 第8行:注释,说明输出延迟部分。
- 第9行:设置tx端口最大输出延迟为2 ns。
- 第10行:设置tx端口最小输出延迟为-1 ns。
- 第11行:空行,用于分隔。
- 第12行:注释,说明异步复位部分。
- 第13行:将rst_n端口到所有寄存器的路径设为伪路径。
- 第14行:空行,用于分隔。
- 第15行:注释,说明跨时钟域部分。
- 第16行:将sys_clk和baud_clk设为异步时钟组。



