衍生时钟约束
至芯
衍生时钟约束是 FPGA 时序约束中的关键技术,用于定义由主时钟经分频、倍频、相移等操作生成的衍生时钟属性,核心是向静态时序分析(STA)工具明确衍生时钟与主时钟的关联,确保时序分析的准确性,以下是其详细介绍:
衍生时钟又称生成时钟,是通过 FPGA 内部的时钟管理单元(MMCM、PLL)或寄存器、组合逻辑等电路,对主时钟进行分频、倍频、相移、改变占空比等变换后得到的新时钟。它并非独立时钟,其周期、相位等时序特性完全依赖于源时钟,而衍生时钟约束就是通过特定命令,将这种依赖关系告知 STA 工具,使其能正确识别该信号为时钟并分析相关时序路径。
若不约束,STA 工具会把衍生时钟当作普通数据信号,不会为其分配低偏移的全局时钟资源(如 BUFG),进而导致时钟抖动、偏移增大,严重影响时钟质量。
未约束的衍生时钟所驱动的寄存器路径,以及它与其他时钟域的交互路径,会被标记为未约束状态,STA 工具无法对这些路径做时序检查,极易隐藏时序违例问题,最终可能造成芯片工作异常。
约束明确了衍生时钟与主时钟的倍频、分频等关系后,STA 工具才能准确计算出衍生时钟的周期、边沿位置等参数,得出有意义的时序分析结果,为设计优化提供依据。
主流 FPGA 开发工具(如 Vivado)中,常用 creategeneratedclock 命令进行约束,其核心语法及参数如下:
-
-source:指定衍生时钟的源时钟节点,必须是主时钟或其他衍生时钟直接驱动的物理引脚,是约束的核心参数
-
-multiply_by:设置相对于源时钟的倍频系数,系数需大于等于 1
-
-divide_by:设置相对于源时钟的分频系数,系数需大于等于 1
-
-edges:通过主时钟的边沿列表定义衍生时钟波形,适用于复杂相位关系场景
-
(get_pins):指定衍生时钟的物理产生点,如 PLL 输出引脚、寄存器输出引脚等
若 100MHz 主时钟(周期 10ns)经寄存器二分频生成 50MHz 时钟,约束语句如下:
createclock -period 10.000 -name clk100m (getports clkin)
creategeneratedclock -name clk_50m \
-source (getports clkin) \
主时钟 50MHz 输入 PLL 后倍频为 200MHz,约束语句如下:
createclock -period 20.000 -name clk50m (getports clkin)
creategeneratedclock -name clk_200m \
-source (getpins pllinst/CLKIN) \
(getpins pllinst/CLKOUT1)
100MHz 主时钟经 MMCM 生成 35MHz 非整数分频时钟,可通过分频与倍频系数组合约束:
createclock -period 10.000 -name clk100m (getports sysclk)
creategeneratedclock -name clk_35m \
-source (getpins mmcminst/CLKIN) \
-divideby 20 -multiplyby 7 \
(getpins mmcminst/CLKOUT0)
MMCM、PLL 生成的衍生时钟,工具会自动推导约束,但自动生成的时钟名可能随设计层次变化。此时可手动指定时钟名,避免后续约束引用出错。
高速设计中,非整数分频时钟需提高周期精度。例如 35MHz 时钟,建议保留 6 位以上小数,约束语句可通过 TCL 计算实现精确周期约束。
当衍生时钟存在相移、占空比改变等情况,可使用 -edges 参数搭配 -edge_shift 参数,精准定义时钟边沿与源时钟的对应关系。
🌻亲爱的读者们,今天的分享就到这里啦!如果今天的内容对你有启发
记得点亮右下角的“❤️”或转发给需要的朋友,让温暖传递的更远!
生活或许没有标准答案,但每一次【分享】和【点赞】,都是我们相遇的印记。你最近有哪些感悟或故事?欢迎留言区聊一聊~~~