时序约束进阶六: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》

相关推荐
怪小庄吖1 小时前
翻译:How do I reset my FPGA?
经验分享·嵌入式硬件·fpga开发·硬件架构·硬件工程·信息与通信·信号处理
海涛高软18 小时前
FPGA同步复位和异步复位
fpga开发
FakeOccupational1 天前
fpga系列 HDL:verilog 常见错误与注意事项 quartus13 bug 初始失效 reg *** = 1;
fpga开发·bug
zxfeng~1 天前
AG32 FPGA 的 Block RAM 资源:M9K 使用
fpga开发·ag32
whik11941 天前
FPGA 开发工作需求明确:关键要点与实践方法
fpga开发
whik11942 天前
FPGA开发中的团队协作:构建高效协同的关键路径
fpga开发
南棱笑笑生2 天前
20250117在Ubuntu20.04.6下使用灵思FPGA的刷机工具efinity刷机
fpga开发
我爱C编程2 天前
基于FPGA的BPSK+costas环实现,包含testbench,分析不同信噪比对costas环性能影响
fpga开发·verilog·锁相环·bpsk·costas环
移知2 天前
备战春招—数字IC、FPGA笔试题(2)
fpga开发·数字ic
楠了个难2 天前
以太网实战AD采集上传上位机——FPGA学习笔记27
笔记·学习·fpga开发