当前位置:首页 > EDA > 电子设计自动化
[导读]在FPGA设计中引入多个时钟(系统时钟、PLL输出、用户自定义时钟)后,SDC(Synopsys Design Constraints)书写错误是导致时序分析失真或违例误判的头号原因。本文归纳Vivado下多时钟约束最常见的五个错误,并给出修正模板。



在FPGA设计中引入多个时钟(系统时钟、PLL输出、用户自定义时钟)后,SDC(Synopsys Design Constraints)书写错误是导致时序分析失真或违例误判的头号原因。本文归纳Vivado下多时钟约束最常见的五个错误,并给出修正模板。


错误1:遗漏主时钟(create_clock)或约束错误端口


Vivado只认create_clock定义的时钟为"Primary Clock"。若差分时钟只约束P端、或忘记约束PLL输入,所有衍生时钟均无基准。


❌ 错误示例


# 只对N端创建(错误)

create_clock -name sys_clk -period 10 [get_ports clk_n]



✅ 修正


# 差分时钟对,只对P端创建

create_clock -name sys_clk -period 10.000 -waveform {0 5} [get_ports clk_p]


# 单端时钟

create_clock -name sys_clk -period 10.000 [get_ports clk]



验证:report_clocks 中应看到 sys_clk 列出。


错误2:手工对PLL输出 create_clock(应让工具推断或用 create_generated_clock)


手动给MMCM/PLL输出加create_clock会破坏与输入时钟的相位关系,造成时序误报。


❌ 错误示例


create_clock -name clk_50m -period 20 [get_pins mmcm/CLKOUT0]



✅ 修正


# 推荐:让 Vivado 从 MMCM/PLL 自动推断

# 若必须显式,用 create_generated_clock:

create_generated_clock -name clk_50m \

   -source [get_pins mmcm/CLKIN1] \

   -divide_by 2 \

   [get_pins mmcm/CLKOUT1]



错误3:跨时钟域未设时钟组或false_path(导致大量虚假违例)


两个异步时钟域(如sys_clk与adc_clk)若无同步电路,应声明为异步,否则Vivado按同步分析报Setup/Hold违例。


❌ 后果


Timing Report 中出现大量 From: sys_clk To: adc_clk 红色违例——实际不可信。


✅ 修正


set_clock_groups -asynchronous \

   -group [get_clocks sys_clk] \

   -group [get_clocks adc_clk]


# 若有多组异步对,可分别写或合并:

# set_clock_groups -asynchronous -group [get_clocks {sys_clk clk_50m}] -group [get_clocks adc_clk]



若某路径确有同步(双FF同步器),可单独加false_path而不影响整体分析。


错误4:输入/输出延迟(set_input_delay / set_output_delay)引用错时钟


多时钟系统中常把input_delay错误地绑到sys_clk而非随外设实际采样时钟。


❌ 错误示例(ADC用adc_clk采样但约束绑sys_clk)


set_input_delay -clock sys_clk -max 3.0 [get_ports adc_data*]



✅ 修正


set_input_delay -clock adc_clk -max 2.5 -min 1.0 [get_ports adc_data*]

set_output_delay -clock dac_clk -max 3.0 [get_ports dac_data*]



错误5:虚拟时钟(Virtual Clock)缺失导致I/O约束无效


当FPGA端口受上游/下游器件时钟约束(但此外部时钟不在FPGA内),需先定义虚拟时钟再绑input_delay。


❌ 错误:直接引用不存在时钟


set_input_delay -clock ext_adc_clk ...   ;# ext_adc_clk未定义 → Warning



✅ 修正


# 定义虚拟时钟(无物理端口)

create_clock -name virt_adc_clk -period 20.000


set_input_delay -clock virt_adc_clk -max 2.8 -min 1.2 [get_ports adc_dat*]

set_output_delay -clock virt_dac_clk -max 3.2 [get_ports dac_dat*]



快速检查清单(每次添加新时钟后跑)


# 1. 列出所有时钟

report_clocks -file reports/clocks.rpt


# 2. 检查未约束输入/输出

report_timing -from [all_inputs] -warn_on_violation

report_timing -to   [all_outputs] -warn_on_violation


# 3. 检查跨时钟组

report_clock_interaction -file reports/cdc_interaction.rpt



结语


多时钟约束五忌:忘主时钟、手写给PLL输出create_clock、跨时钟不声明异步、I/O延迟绑错时钟、缺虚拟时钟。按上述修正模板书写SDC,并用report_clocks与report_clock_interaction闭环验证,你的Vivado时序分析才能真正可信。



本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
换一批
延伸阅读

在Xilinx FPGA设计中引入XDMA、Video DMA、AXI Interconnect等IP核后,IP输出与用户逻辑常处于不同频率或相位——这就是典型的时钟域交叉(Clock Domain Crossing,...

关键字: Vivado 时钟域交叉 CDC

在Xilinx FPGA开发中,综合与布局布线通过并不代表设计能正常工作。静态时序分析(STA)才是判定设计能否在目标频率下稳定运行的最终依据。本文以Vivado为例,带你走完从基础时钟约束、I/O约束到Setup/Ho...

关键字: Vivado 时序约束

在FPGA设计中,时序收敛是决定设计能否稳定上板的关键。Vivado工具通过WNS(Worst Negative Slack,最差负时序裕量)和TNS(Total Negative Slack,总负时序裕量)这两个核心指...

关键字: Vivado 时序约束

在复杂的FPGA系统设计中,算法验证与硬件实现之间往往存在巨大的鸿沟。本文将深入探讨如何利用Tcl脚本构建自动化桥梁,实现Matlab/Simulink算法仿真与Vivado硬件验证的无缝衔接。

关键字: EDA Tcl脚本 Vivado

在200MHz以上时钟频率的FPGA设计中,时序收敛已成为决定项目成败的关键。某5G前传单元项目曾因时序违例导致六轮迭代失败,最终通过系统化优化将开发周期缩短40%。本文将结合Vivado 2025最新特性,揭示解决建立...

关键字: 时序收敛 Vivado

在FPGA设计中,时序收敛是工程师面临的终/极挑战。当系统时钟频率突破200MHz时,建立时间(Setup Time)往往成为阻碍设计成功的"后一公里"难题。本文将深入解析Vivado和Quartus工具链中的物理优化策...

关键字: Vivado Quartus FPGA 时序收敛

在高速通信系统设计中,SERDES(串行器/解串器)接口的信号完整性直接影响数据传输的可靠性。Xilinx FPGA的IBERT(Integrated Bit Error Ratio Tester)工具通过眼图分析技术,...

关键字: Vivado 高速SERDES IBERT眼图

在这里,我们提供了一个关于如何生成静态比特流的分步教程。我们以Sobel边缘检测算法为例来演示这一过程。但是,对于您可能想要创建的其他模块,步骤是相同的。

关键字: Sobel算法 静态比特流 Vivado

该图说明了使用axis - stream接口的FFT IP核的输入和输出数据格式。FFT处理复杂数据,其中每个样本由16位实部和16位虚部组成。这些组件被连接成一个32位数据字,虚数部分占据最高有效位16位,实数部分占据...

关键字: FFT IP核 Vivado GitHub存储库

学习如何在Vivado中使用CORDIC IP实现数控振荡器(NCO) !

关键字: 数控振荡器 Vivado FPGA
关闭