1.主时钟约束
1.1 核心定义
主时钟代表进入 FPGA 芯片的原始时钟源,一般来自:
- 外部晶振输入 FPGA 顶层端口
- 外部时钟发生器输出到 FPGA 引脚
⚠️ MMCM/PLL 输出的时钟不属于主时钟,属于派生时钟 generated_clock,用
create_generated_clock。
主时钟(实体时钟、Primary Clock):真实物理时钟源,时钟源绑定 FPGA 端口 / 内部引脚,用来驱动 FPGA 内部寄存器逻辑、时钟树综合 CTS、内部 reg‑to‑reg 时序分析。
命令:
create_clock带上端口 / 引脚对象
- 时钟会传播进时钟网络,工具计算时钟树延迟、抖动、skew
- 可以生成派生时钟
create_generated_clock(MMCM/PLL 输出) - 不能用来精准建模外部芯片独立时钟的 IO 延迟
1.2完整语法
create_clock ‑name <时钟名称> ‑period <周期ns> [-waveform {rise_time fall_time}] [-add] [get_ports / get_pins / get_nets 物理对象]参数详解
period:时钟周期,定义频率waveform:设置初始相位、占空比;不写默认{0 T/2},50% 占空比add:同一个端口创建多个时钟(差分时钟、多模式时钟)
标准主时钟
#100MHz,端口clk,默认50%占空比,0ns上升沿 create_clock -name clk_100m -period 10 [get_ports clk] # 100MHz,上升沿2ns,下降沿7ns;占空比50%,相位偏移2ns create_clock -name clk_phase -period 10 -waveform {2 7} [get_ports clk]主时钟配套约束
# 1.源延迟:时钟从板上晶振到达FPGA引脚的PCB延时 set_clock_latency -source 1.2 [get_clocks clk_100m] # 2.时钟抖动 set_clock_jitter 0.3 [get_clocks clk_100m] # 3.时钟不确定性(时序余量) set_clock_uncertainty 0.5 [get_clocks clk_100m]1.3时钟特性约束
在FPGA中,时钟信号通常由芯片外部的晶振产生,通过时钟引脚输入芯片内部。随后,时钟信号经过芯片内部的一系列处理,如PLL、自定义的分频/倍频逻辑等,来生成所需的时钟频率信号。
实际的时钟的七个关键特性:
①时钟周期(clock period):两个相邻时钟上升沿的时间间隔,单位 ns。通常表示为一个完整的时钟周期。决定最高工作频率、建立时间余量基础。
频率是周期的倒数,公式为:频率=1/T_period。
②时钟占空比(clock duty cycle):高电平持续时间与时钟周期之比,表示时钟信号在一个周期内高电平持续时间的占空比。默认工具 50%;非 50% 时钟用-waveform指定
create_clock -name clk -period 10 -waveform {2 7} [get_ports clk]③时钟相位(clock phase):时钟沿相对于时间零点 (0 ns) 的偏移量,影响时钟边沿的相对时间位置。waveform 本质就是设置时钟初始相位,常用于多时钟、同源相位偏移接口
④时钟转换时间(clock transition time):时钟信号从低电平转换为高电平或从高电平转换为低电平所需的时间。
⑤时钟延时(clock latency):时钟信号从生成到到达目标位置所花费的时间,分为源延迟 Source‑Latency、网络延迟 Network‑Latency
- 源延迟 source latency:时钟从时钟源(外部晶振 / PLL)到达 FPGA 芯片引脚的延时,PCB 走线延迟。
- 网络延迟 network latency:时钟进入 FPGA 后,从端口走到寄存器时钟引脚的延时(时钟树延迟)
⑥时钟偏斜(clock skew):同一个时钟信号,到达不同寄存器时钟端的时间差,通常由时钟路径不同引起。
- 全局 skew:芯片上最远两个寄存器时钟到达时间差
- 分为有用偏斜、有害偏斜
- CTS 时钟树综合目标:减小时钟 skew
Jitter:同一个寄存器,时钟沿每次飘多少(随时间波动)
Skew:同一时刻,不同寄存器之间时钟到达时间差(空间差)
⑦时钟抖动(clock jitter):时钟边沿的短期不稳定性,导致时钟边沿的实际到达时间与预期时间存在偏差。时钟沿偏离理想位置的不确定性偏差,是时序余量杀手。
- 周期抖动 (Period Jitter):单周期和理想周期的偏差
- 长期抖动 (Long‑term Jitter):多个周期累积偏差
- 输入抖动 (Input Jitter):晶振带来,外部引入 FPGA
- 系统抖动 (System Jitter):PLL/MMCM 产生的抖动
2虚拟时钟约束
2.1 核心定义
虚拟时钟(Virtual Clock):仅时序参考标尺,无物理载体,不绑定任何端口、引脚、网线,不会驱动 FPGA 内部任何触发器;唯一用途:作为 set_input_delay /set_output_delay 的参考时钟,做 FPGA 与外部芯片之间接口时序检查。
虚拟时钟是一个数学上理想的时钟波形,在硬件电路中没有对应的走线、引脚、端口。 FPGA 芯片不会收到这个时钟信号,工具不会对它做时钟树布线,时钟不会传播到任何寄存器。
命令:
create_clock不带端口 / 引脚对象,只写‑name
- 不会经过时钟树综合,无内部时钟延迟
- 只用于 IO 边界时序检查,绝对不能当做内部寄存器驱动时钟
2.2 完整语法
create_clock ‑name <虚拟时钟名字> ‑period <周期> [-waveform {rise fall}] #后面【绝对不能】加 get_ports / get_pins示例
#外部ADC芯片时钟,时钟信号没有接入FPGA引脚 create_clock -name vclk_adc -period 202.2 什么时候必须用虚拟时钟
场景 1:外部器件时钟没有接到 FPGA 的任何引脚
外部 ADC、DAC、传感器在板上自己产生时钟,该时钟并没有连到 FPGA 引脚,FPGA 只能收到数据信号,收不到对方时钟。 此时 IO 延迟的参考时钟只能创建虚拟时钟,否则工具没有时钟基准做建立 / 保持检查。
#外部芯片50MHz时钟,未输入FPGA create_clock -name vclk_ext -period 20 set_input_delay -max 8 -clock vclk_ext [get_ports data_in] set_input_delay -min 2 -clock vclk_ext [get_ports data_in]场景 2:外部发送时钟 和 FPGA 接收时钟同源,但存在额外 PCB 偏移(同频异相)
晶振输出,一路给到外部芯片,另一路给到 FPGA 引脚;两条 PCB 走线长度不一样,时钟到达两边时间不一样。 如果直接拿 FPGA 主时钟做 input_delay 参考,工具会忽略外部 PCB 时钟延迟,时序分析错误。
解决方案:
- 创建 FPGA 引脚主时钟(供内部逻辑使用)
- 创建虚拟时钟代表外部芯片收到的时钟,给虚拟时钟加上
‑source延迟模拟 PCB 差值
# FPGA收到的真实时钟 create_clock -name clk_fpga -period 10 [get_ports clk] #虚拟时钟,代表外部芯片侧时钟 create_clock -name vclk_ext -period 10 #外部时钟比FPGA时钟晚1.5ns到达 set_clock_latency -source 1.5 [get_clocks vclk_ext] #IO延迟约束使用虚拟时钟 set_input_delay -max 5 -clock vclk_ext [get_ports data_in]场景 3:FPGA 输出数据,下游芯片采样时钟独立(无随路时钟)
FPGA 发送数据,下游芯片用自己的时钟采样,下游时钟并没有来自 FPGA。
set_output_delay必须以虚拟时钟作为参考。
create_clock -name vclk_dac -period 10 set_output_delay -max 4 -clock vclk_dac [get_ports dac_data]如果直接用 FPGA 内部 MMCM 生成时钟去做 input_delay 参考:此时工具会自动叠加上 FPGA 内部时钟树延迟,造成 IO 时序结果悲观失准。
场景 4:多异步接口,外部时钟频率与 FPGA 时钟频率相同,相位未知
为了保守、安全地检查 IO 时序,单独建虚拟时钟,当做异步时钟域处理。
3.区别
create_clock命令既可以创建主时钟(真实时钟),也可以创建虚拟时钟;唯一区分标志:命令后面有没有绑定物理对象(端口 / 引脚)
# 主时钟:绑定FPGA顶层端口clk,有物理源头 create_clock -name clk_100M -period 10 [get_ports clk] # 虚拟时钟:无任何物理节点,‑name之后不带任何端口/引脚/net create_clock -name vclk_ext -period 10核心本质区别
- 主时钟:真实时钟源,工具会生成时钟树、传播时钟、驱动寄存器,参与片内 Reg‑to‑Reg 时序检查。
- 虚拟时钟:纯时序标尺,硬件不存在该时钟信号,不会在 FPGA 内部传播,不会驱动任何触发器,不做时钟树综合 CTS;唯一使命:作为
set_input_delay/set_output_delay的参考时钟,检查 FPGA 和外部芯片之间的 IO 时序。
| 对比 | 主时钟(Primary Clock) | 虚拟时钟(Virtual Clock) |
|---|---|---|
| 创建时是否绑定物理引脚 / 端口 | ✅ 必须绑定 | ❌ 禁止绑定任何物理对象 |
| 硬件是否真实存在 | FPGA 引脚上真实存在 | 仅时序模型,硬件不存在 |
| 时钟是否在 FPGA 内部传播 | ✅ 可以传播到寄存器 | ❌ 不会传播 |
| 时钟树综合 CTS | ✅ 参与,工具生成时钟树布线 | ❌ 不参与,无时钟树资源消耗 |
| 能否驱动内部触发器 | ✅ 是片内寄存器时钟源 | ❌ 绝对不能驱动寄存器 |
| 典型用途 | 片内 reg‑to‑reg 时序分析、内部逻辑、PLL 输入 | IO 边界时序:set_input_delay /set_output_delay 参考基准 |
| 时钟延迟设置 | source latency + network latency 均可设置 | 仅推荐设置 source latency |
| 是否支持派生时钟 create_generated_clock | ✅ 支持 | ❌ 不支持 |
| IO 时序风险 | 直接用于 IO 会带入 FPGA 内部时钟树延迟,时序分析出错 | 无内部时钟树延迟,IO 时序分析精准 |