时序约束进阶六:Set_Clock_Groups详解

目录

一、前言

二、时钟间关系

[2.1 时钟关系分类](#2.1 时钟关系分类)

[2.2 时钟关系查看](#2.2 时钟关系查看)

三、set_clock_groups设置

[3.1 使用格式](#3.1 使用格式)

[3.2 优先级](#3.2 优先级)

[3.3 约束设置示例](#3.3 约束设置示例)

[3.4 约束效果查看](#3.4 约束效果查看)

四、Exclusive差异说明

[4.1 Asynchronous](#4.1 Asynchronous)

[4.2 Logically_exclusive与Physically_exclusive](#4.2 Logically_exclusive与Physically_exclusive)

[4.3 logically_exclusive和physically_exclusive等价场景](#4.3 logically_exclusive和physically_exclusive等价场景)

五、参考资料


一、前言

Vivado的时序分析工具默认会分析设计中所有时钟间相关的时序路径,如果对于一些时钟间的路径不需要分析,则可以使用set_clock_groups约束实现。

二、时钟间关系

2.1 时钟关系分类

两个时钟的关系可以是同步时钟,异步时钟,非扩展时钟。

同步时钟: 两个时钟的相位关系是可预知的,常见的是两个时钟来源于相同的根时钟或者共同的周期,如生成时钟和主时钟。

异步时钟:当两个是时钟的相位关系不可预知时,则为异步时钟,例如来源两个晶振的时钟,通过不同的输入端口进入到FPGA内部,无法知道两者的相位关系

非扩展时钟 :当两个时钟在1000个周期内仍无无法找到共同的边沿,在这种情况下,最差的setup关系在超过1000个周期上,但是时序分析工具将无法确认这是最差的情况。典型的例子是两个奇数倍分频的时钟,如clk0和clk1都是由MMCMs产生的生成时钟,周期分别为5.125ns和6.666ns。它们的上升沿在1000个周期内不存在重合。时序分析工具有一个0.01ns的setup路径裕量,尽管两个时钟有已知的相位关系,但它们的波形使得无法进行正确的时序分析。和异步时钟类似,slack值可以按常规方法计算,但计算出的值不一定正确。因此,非扩展时钟通常作为异步时钟。

set_clock_groups使用较多的场景即是对两个为异步时钟关系的时钟进行约束。

2.2 时钟关系查看

时钟Vivado中Report Clock Interaction可以查看时钟间的关系。

下图颜色方块中,横坐标表示目的时钟,纵坐标表示源时钟,黑色No path表示不存在时序路径,蓝色User ignored Paths为用户设置了不分析的约束,红色Timed(Unsafe)表示异步时钟或非扩展的时钟,颜色块下方的列表也显示了时序的详细信息。

三、set_clock_groups设置

3.1 使用格式

在Timing Constraints窗口中,Clocks列下选择Set Clock Groups,进入Set Clock Groups界面

Group name:设置时钟组的名称

Group 1: 添加属于Group 1中的时钟,点击最右侧的"+"可以设置多个组

The specified clocks are: 设置时钟组里的时钟与其他时钟的关系,可为asynchronous,logically exclusive,physically exclusive。

-asynchronous:约束为异步时钟组

-logically_exclusive:约束为逻辑互斥的时钟组

-physically_exclusive:约束为物理线路互斥的时钟组,设计中不能同时存在,最终表现的效果和-logically_exclusive是相同的。

**Command:**显示对应约束设置的tcl命令

约束命令示例:

set_clock_groups -name clk_group -asynchronous -group get_clocks {create_clk1 gen_clk_2}

3.2 优先级

异步时钟和非扩展时钟是没法正确地进行时序分析,它们之间的时序路径在分析时应该使用set_clock_groups进行忽略。相比于其他时序例外的命令,set_clock_groups的优先级最高,如果需要对异步时钟进行分析,则不能对该时钟使用set_clock_groups命令。

3.3 约束设置示例

以设计中存在4个时钟clk1,clk2,clk3,clk4为例,时钟之间均存在可分析的时序路径。对时钟进行不同的时钟组约束,约束后的分析结果如下,Y表示进行时序分析,N表示不进行时序分析,参数使用asynchronous。

a)场景1:单个时钟组clk_group单个时钟clk1

复制代码
set_clock_groups -name clk_group -asynchronous -group [get_clocks clk1]

clk1只和clk1进行时序分析,不与其他时钟进行分析,其他时钟间依旧进行分析

b)场景2:单个时钟组clk_group多个时钟clk1,clk2

复制代码
set_clock_groups -name clk_group -asynchronous -group [get_clocks {clk1 clk2}]

时钟组clk_group内部的时钟间clk1,clk2间会进行时序分析,和外部的时钟clk3,clk4不会进行时序分析

c)场景3:两个时钟组,每个时钟组都只有单个时钟

复制代码
set_clock_groups -name clk_group -asynchronous -group [get_clocks clk1] -group [get_clocks clk2]

设置多个-group时,groups之间的时钟如clk1和clk2不会进行时序分析

d)场景4:多个时钟组,多个时钟

复制代码
set_clock_groups -name clk_group -asynchronous -group [get_clocks {clk1 clk2}] -group [get_clocks {clk3 clk4}]

设置多个group时,group内部的时钟间会进行时序分析,如第一个-group内的clk1与clk2,第二个-group内的clk3与clk4,group间不会进行时序分析,如clk1和clk3

总结:set_clock_group中group内部的时钟只能组内间进行分析,不能跨组或与非约束中的时钟进行时序分析

3.4 约束效果查看

设置了约束后,同样在Clock Interaction中可以查看到约束是否生效,如clk1与clkin1,clkin1和clkin2设置了约束,下图中关系User Ignored Paths,图中蓝色块

另一个方式是查看时序报告中User Ignored Paths部分,如clk1和clkin1,在详细路径中Exception可以看到关系为Asynchronous clock Groups,说明设置了set_clock_groups约束

四、Exclusive差异说明

​Logically_exclusive和Physically_exclusive以及Asynchronous三个参数对于都能实现分析工具不会对设置的时钟组进行分析。

4.1 Asynchronous

​Asynchronous表示两个时钟无固定的相位关系,分析工具会进行时钟间的SI(信号完整性),使用场景如下

a) 在异步FIFO中

b) 普通异步路径

4.2 Logically_exclusive与Physically_exclusive

Logically_exclusive是两个时钟物理线路上可同时使用,但逻辑上不会同时存在,如两个时钟经过bufgmux输出。

Physically_exclusive是两个时钟在设计中不会同步存在, 如同一个时钟port定义了多个时钟,一个测试时钟,一个功能时钟,则两个时钟间不存在SI问题。

Logically_exclusive和Physically_exclusive看内容解释都有互斥不分析的含义,效果看都似乎一致,较难区分。

以下图为例,时钟CLK1和CLK2经过一个通过SEL控制的选择器传输到两个寄存器。默认情况,从信号完整性角度看,是会对CLK1和CLK2间的跨电容X4间的串扰进行检查。

对于这种情况如果准确的处理方式是使用Set_case_analysis约束,先将SEL设置为0进行分析,然后再设置为1进行分析,可以正确地处理所有串扰,但如果时钟较多时,这种方式不实用。为了能同时分析SEL为0和1的情况,使用set_clock_groups可以达到目的

复制代码
set_clock_groups -logically_exclusive -group {CLK1} -group {CLK2}

使用Logically_exclusive后时序分析将会忽略CLK1和CLK2间的时序路径检查,效果和在CLK1和CLK2之间设置了set_false_path约束相同。但是,时序分析工具仍会计算CLK1和CLK2间的电容X4的串扰延时。如果两个时钟不会同时在net上出现,此时计算的结果将是过于悲观的。为了使结果更准确,可使用-physically_exclusive,此时将不会计算电容X4的串扰延时。

复制代码
set_clock_groups -physically_exclusive -group {CLK1} -group {CLK2}

根据上图,虽然消除了电容X4带来的延时影响,但在选择器U1的输入CLK1和CLK2间的电容X1延时未考虑,最终的分析结果将会过于乐观。为了解决X1的影响,将在选择器U1的输出端定义CLK1和CLK2的生成时钟gCLK1和gCLK2,再对两个生成时钟gCLK1和gCLK2设置physically_exclusive关系,即可实现不会忽略CLK1和CLK2间X1电容的延时,忽略电容X4间的时延。

复制代码
create_generated_clock -name gCLK1 -source [get_ports CLK1] -divide_by 1 -add -master_clock [get_clocks CLK1] [get_pins U1/z]
create_generated_clock -name gCLK2 -source [get_ports CLK2] -divide_by 1 -add -master_clock [get_clocks CLK2] [get_pins U1/z]
set_clock_groups -physically_exclusive -group {gCLK1} -group {gCLK2}

4.3 logically_exclusive和physically_exclusive等价场景

对于MMCM/PLL的两个生成时钟clkout0,clkout1,连接到BUFGMUX的两个输入端口时,默认情况下,虽然clkout0和clkout1来自相同的时钟源,并且不会同时存在,但Vivado时序分析工具仍会分析clkout0,clkout1间的时序。

此时使用set_clock_groups约束,-logically_exclusive或-physically_exclusive是等价的,对于ASIC芯片需要考虑信号完整性,但对于FPGA芯片则无需考虑。因此,对于FPGA中set_clock_groups使用中无需过于区分Asynchronous,Logically_exclusive和Physically_exclusive的区别,更多的是在ASIC芯片设计中需要考虑

复制代码
set_clock_groups -name exclusive_group -physically_exclusive -group clkout0 -group clkout1

五、参考资料

《ug903-vivado-using-constraints-en-us-2022.2》

《PrimeTime user guide》

相关推荐
仲南音2 天前
Xilinx FPGA——时钟IP核MMCM、PLL
fpga开发
I'm a winner2 天前
基于Xilinx FPGA的LVDS高速串行通信系统(三)--数据训练及握手机制【文末源码】
fpga开发
upper20202 天前
coremark移植坑之-nostartfiles -nostdlib参数
学习·fpga开发·coremark移植·riscv设计
Eloudy3 天前
Vivado 纯命令行构建 FPGA 项目教程
fpga开发
Rambo.xia3 天前
AXI跨时钟域与数据一致性——CDC FIFO深度不够、写后读冒险、多Master仲裁、乱序返回,出了Bug根本查不出来
fpga开发·bug
upper20203 天前
FPGA部署卷积神经网络识别MINST图片
fpga开发·卷积神经网络·minst·minst识别·部署神经网络·神经网络识别图片
你是我的解忧王子3 天前
嵌入式 ADC采样 原始数据分析上层(平均值 波动率 正态分布 线性补偿 系统误差)
fpga开发·数据挖掘·数据分析
9527华安4 天前
FPGA纯verilog代码ISP图像处理培训教程,基于IMX214,提供工程源码+视频教程+FPGA开发板
图像处理·fpga开发·isp·imx214·mipi
千寻xun4 天前
二、实战篇-NVME SSD控制之ZYNQ实现(六)-读写NVME SSD硬盘数据
fpga开发·nvme·nvme ssd
千寻xun4 天前
二、实战篇-NVME SSD控制之ZYNQ实现(三)
fpga开发·nvme ssd·nvme协议