FPGA 时钟约束实战:create_clock 与 create_generated_clock 详解
概述
在 FPGA 设计中,时钟约束是整个时序分析体系的基石。正确的时钟约束是时序收敛的前提,所有其他约束(如 I/O 延迟、时序例外)都建立在它之上。如果没有准确的时钟定义,综合工具无法优化设计,布局布线也无法满足时序要求,最终可能导致硬件功能异常。
本文将深入讲解 create_clock 和 create_generated_clock 的核心用法,涵盖主时钟、衍生时钟及虚拟时钟的定义,并通过实际案例展示如何处理多时钟域、PLL/MMCM 配置及时钟组划分,帮助工程师建立完整的约束体系。
一、时钟约束基础概念
1.1 为什么需要时钟约束
时钟约束不仅仅是告诉工具频率那么简单,它在设计流程中扮演多重角色:
- 指导综合优化:综合器知道目标频率后,会选择更快的逻辑实现或插入流水线寄存器。
- 指导布局布线:工具会根据时钟路径规划布线资源,减少时钟偏斜(Clock Skew)。
- 静态时序分析(STA):没有时钟约束,Setup/Hold 检查都无法进行。
- 定义时钟域关系:在多时钟系统中,明确哪些时钟是同步的,哪些是异步的。
1.2 时钟约束的分类
FPGA 中的时钟主要分为三类,每类对应不同的约束方法:
1.2.1 主时钟 (Primary Clock)
直接从外部输入的时钟信号,通常来自晶振或时钟芯片。
# 50MHz 系统时钟
create_clock -period 20.000 -name clk_sys [get_ports sys_clk]
# 125MHz 以太网时钟
create_clock -period 8.000 -name clk_eth [get_ports eth_rx_clk]
1.2.2 衍生时钟 (Generated Clock)
由内部逻辑产生的时钟,如 PLL 输出、分频器等。它们与源时钟有确定的频率和相位关系。
# PLL 2 倍频输出
create_generated_clock -name clk_200m \
-source [get_pins pll_inst/CLKIN1] \
-multiply_by 2 \
[get_pins pll_inst/CLKOUT0]
1.2.3 虚拟时钟 (Virtual Clock)
不驱动 FPGA 内部逻辑,主要用于定义 I/O 接口的参考时钟,例如外部 ADC 的时钟。
# 外部 ADC 时钟(不进入 FPGA)
create_clock -period 10.000 -name virt_adc_clk
set_input_delay -clock virt_adc_clk -max 2.0 [get_ports adc_data[*]]
二、主时钟约束 (create_clock) 详解
2.1 基本语法与参数
create_clock \
-period <周期值> \
[-name <时钟名>] \
[-waveform {上升沿 下降沿}] \
[-add] \
[get_ports <端口名>]
- -period: 单位纳秒 (ns)。例如 100MHz 对应 10.000ns。
- -name: 建议指定有意义的名称,避免使用默认端口名。
- -waveform: 自定义波形,控制占空比。格式为
{上升沿时间 下降沿时间}。 - -add: 用于同一端口定义多个时钟(如模式切换场景),需配合时钟组使用。

