目录
一、前言
二、时钟间关系
2.1 时钟关系分类
2.2 时钟关系查看
三、set_clock_groups设置
3.1 使用格式
3.2 优先级
3.3 约束设置示例
3.4 约束效果查看
四、Exclusive差异说明
4.1 Asynchronous
4.2 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》