vivado中常用时序约束指令介绍

描述

在vivado中,我们常用的时序约束指令主要包括如下几个方面:

类型 命令 说明
时钟约束 create_clock 创建主时钟
时钟约束 create_generated_clock 创建衍生时钟
时钟约束 set_clock_groups 设置时钟组
时钟约束 set_clock_latency 设置时钟延时
时钟约束 set_clock_sense 设置时钟边沿敏感
时钟约束 set_clock_uncertainty 设置时钟不确定度
时钟约束 set_system_jitter 设置系统抖动
时钟约束 set_input_jitter 设置输入抖动
时钟约束 set_external_delay 设置外部延时
输入 / 输出信号接口约束 set_input_delay 设置输入信号延时
输入 / 输出信号接口约束 set_output_delay 设置输出信号延时
时序例外约束 set_false_path 设置虚假路径
时序例外约束 set_multicycle_path 设置多周期路径
时序例外约束 set_max_delay 设置最大延时
时序例外约束 set_min_delay 设置最小延时
时序断言约束 set_data_check 约束数据到数据的建立 / 保持时间检查
时序断言约束 set_bus_skew 设置总线偏斜断言
其他约束 set_case_analysis 设置信号为固定数值
其他约束 group_path 设置时序路径分组
其他约束 set_disable_timing 设置中断时序弧
其他约束 set_max_time_borrow 设置锁存器借用时间

1. create_clock(创建主时钟)

含义:定义设计中的根时钟(如外部晶振输入的时钟),是所有时序分析的基准。

使用方法:

create_clock -name clk_100mhz -period 10 [get_ports clk_in]

-name:指定时钟名称(自定义,便于识别)

-period:时钟周期(单位:ns,10ns对应100MHz)

[get_ports clk_in]:指定时钟源端口(FPGA的输入引脚)

关键参数:

-waveform {0 5}:定义时钟边沿位置(默认占空比50%,0ns上升沿,5ns下降沿)

-add:为同一端口添加多个时钟(如双沿采样场景)

2. create_generated_clock(创建衍生时钟)

含义:定义由主时钟通过分频、倍频或相位偏移生成的时钟(如PLL输出时钟),与主时钟存在确定的相位关系。

使用方法:

create_generated_clock -name clk_div2 -source [get_ports clk_in]
  -divide_by 2 [get_pins reg_div/Q]

-source:指定源时钟(主时钟的端口或引脚)

-divide_by 2:分频系数(此处为2分频)

[get_pins reg_div/Q]:衍生时钟的生成点(如寄存器输出引脚)

常用参数:

-multiply_by:倍频系数(如-multiply_by 2实现2倍频)

-phase:相位偏移(单位:deg,如-phase 90表示偏移90度)

-invert:时钟反转(实现180度相位偏移)

3. set_clock_groups(设置时钟组)

含义:将相互异步的时钟划分为不同组,告知工具这些时钟间无需进行时序分析(避免虚假时序违规)。

使用方法:

set_clock_groups -name async_groups -asynchronous
  -group [get_clocks clk_100mhz]
  -group [get_clocks clk_125mhz]

-asynchronous:标记组间时钟为异步关系

-group:指定时钟组(可包含多个时钟)

其他模式:

-physically_exclusive:互斥时钟(同一时刻只有一个时钟有效,如切换时钟源)

4. set_clock_latency(设置时钟延时)

含义:定义时钟从源到寄存器时钟端的传播延时(包括网络延时和器件固有时延),分为理想延时和实际延时。

使用方法:

# 设置时钟网络的理想延时(不考虑布局布线影响)

set_clock_latency 2.5 [get_clocks clk_100mhz]

# 设置输入/输出延时(相对于时钟源)

set_clock_latency -source 1.2 [get_clocks clk_100mhz]

无选项:默认指时钟到达寄存器的延时(目的地延时)

-source:指时钟从源到FPGA引脚的延时(源端延时)

5. set_clock_sense(设置时钟边沿敏感)

含义:指定时钟沿的采样方向(上升沿/下降沿),默认情况下工具自动识别,特殊场景需手动指定。

使用方法:

set_clock_sense -positive [get_clocks clk_100mhz]  # 上升沿敏感

set_clock_sense -negative [get_clocks clk_100mhz]  # 下降沿敏感

6. set_clock_uncertainty(设置时钟不确定度)

含义:考虑时钟抖动(jitter)和偏斜(skew)的综合影响,为时序分析预留额外余量,确保设计可靠性。

使用方法:

set_clock_uncertainty 0.5 [get_clocks clk_100mhz]

数值表示时钟不确定性的总量(单位:ns),工具会在建立时间和保持时间分析中自动减去/加上该值。

常用参数:-setup(仅对建立时间生效)、-hold(仅对保持时间生效)

7. set_system_jitter(设置系统抖动)

含义:定义外部系统引入的时钟抖动(如晶振抖动),与set_clock_uncertainty的区别在于:系统抖动是外部引入的,而不确定度包含内部偏斜。

使用方法:

set_system_jitter 0.3 [get_clocks clk_100mhz]

8. set_input_jitter(设置输入抖动)

含义:指定输入时钟的抖动特性(针对外部输入的时钟信号),影响时钟的不确定性计算。

使用方法:

set_input_jitter [get_clocks clk_ext] 0.2

第一个参数为外部时钟,第二个参数为抖动值(单位:ns)

9. set_external_delay(设置外部延时)

含义:定义FPGA外部电路的延时(输入信号从外部源到FPGA引脚,或输出信号从FPGA引脚到外部目的地的延时),用于接口时序分析。

使用方法:

# 输入信号:外部电路到FPGA引脚的延时(占时钟周期的30%)

set_external_delay -input 3 [get_clocks clk_100mhz]

# 输出信号:FPGA引脚到外部电路的延时(占时钟周期的20%)

set_external_delay -output 2 [get_clocks clk_100mhz]

10. set_input_delay(设置输入信号延时)

含义:定义外部输入信号到达FPGA引脚后,相对于时钟沿的有效建立时间窗口,用于确保输入数据在时钟采样前稳定。

使用方法:

set_input_delay -clock clk_100mhz -max 3 [get_ports data_in]

set_input_delay -clock clk_100mhz -min 0.5 [get_ports data_in]

-clock:指定采样该输入信号的时钟

-max:输入信号的最大延时(数据最晚到达时间)

-min:输入信号的最小延时(数据最早到达时间)

单位为 ns,需根据外部电路延时特性设置(通常占时钟周期的 20%-30%)

11. set_output_delay(设置输出信号延时)

含义:定义 FPGA 输出信号到达外部器件所需的延时,确保外部电路能在其时钟沿前稳定采样数据。使用方法:

set_output_delay -clock clk_ext -max 2.5 [get_ports data_out]

set_output_delay -clock clk_ext -min 0.3 [get_ports data_out]

-clock:指定外部电路的采样时钟

数值表示输出信号相对于外部时钟的延时,需匹配外部器件的建立 / 保持时间要求

12. set_false_path(设置虚假路径)

含义:标记无需进行时序分析的路径(通常是异步时钟域间路径或逻辑上不可能激活的路径),减少工具分析开销。使用方法:

# 异步时钟间的路径

set_false_path -from [get_clocks clk_100mhz] -to [get_clocks clk_125mhz]

# 特定端口到模块的路径

set_false_path -from [get_ports reset] -to [get_cells *]

-from/-to:指定路径的起点和终点(时钟、端口、单元等)

典型应用:复位信号路径、异步时钟域跨域路径、测试模式专用路径

13. set_multicycle_path(设置多周期路径)

含义:允许数据在多个时钟周期内完成传输(适用于慢路径),工具会放宽时序要求。
使用方法:

# 建立时间:允许3个时钟周期完成传输

set_multicycle_path 3 -setup -from [get_clocks clk_fast] -to [get_clocks clk_slow]

# 保持时间:对应调整为2个周期(通常比setup少1)

set_multicycle_path 2 -hold -from [get_clocks clk_fast] -to [get_clocks clk_slow]

-setup/-hold:分别设置建立时间和保持时间的多周期数

常用于跨时钟域数据传输或低速外设接口(如 SPI、I2C)

14. set_max_delay(设置最大延时)

含义:为特定路径指定最大允许延时(覆盖默认时钟约束),确保关键路径不超时。使用方法:

set_max_delay 8 -from [get_ports ctrl_in] -to [get_ports ctrl_out]

数值为路径允许的最大延时(ns),常用于对响应速度有严格要求的路径

15. set_min_delay(设置最小延时)

含义:为特定路径指定最小允许延时,防止因路径过短导致的保持时间违规(信号变化过快)。使用方法:

set_min_delay 0.8 -from [get_cells reg1/Q] -to [get_cells reg2/D]

确保数据在采样时钟沿后保持稳定的最短时间,避免竞争冒险

16. set_data_check(数据到数据的建立/保持时间检查)

含义:定义两个数据信号间的相对时序关系(非时钟触发),常用于握手信号或异步接口。使用方法:

# data信号需在valid信号有效后至少1ns建立,且保持2ns

set_data_check -setup 1 -hold 2 -from [get_ports valid] -to [get_ports data]

检查数据信号相对于控制信号的稳定性,确保握手逻辑可靠

17. set_bus_skew(总线偏斜断言)

含义:约束总线内各信号的最大 skew(偏斜),确保总线信号同步变化(如并行数据总线)。

使用方法:

set_bus_skew 1.2 [get_ports data_bus[*]]

数值为总线内任意两个信号的最大允许延时差,防止因布线长度差异导致的采样错误

18. set_case_analysis(设置信号为固定数值)

含义:强制指定信号为恒定值(0或1),用于简化逻辑分析或验证特定工作模式。使用方法:

set_case_analysis 1 [get_ports enable]  # 强制enable信号为高电平

常用于排除未使用的逻辑分支,优化综合结果

19. group_path(时序路径分组)

含义:将相似路径归类,便于集中设置时序约束或查看分析报告。使用方法:

group_path -name axi_path -from [get_clocks axi_clk] -to [get_clocks axi_clk]

set_max_delay 10 [get_paths -group axi_path]  # 为分组设置统一约束

提高约束管理效率,尤其适用于大型设计

20. set_disable_timing(中断时序弧)

含义:切断特定逻辑单元间的时序弧(Timing Arc),工具将忽略该路径的时序分析。
使用方法:

set_disable_timing -from A -to Y [get_cells mux1]

适用于冗余逻辑或测试模式下的无效路径,避免误导性时序违规报告

21. set_max_time_borrow(设置锁存器借用时间)

含义:为锁存器(Latch)指定最大允许的时间借用(Time Borrow),平衡前后级路径延时。使用方法:

set_max_time_borrow 2 [get_cells latch1]

锁存器可通过延长前级数据有效时间 “借用” 后级的时序余量,此命令限制最大借用值

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分