目录
一、背景
二、时钟间关系
2.1 时钟关系分类
2.2 时钟关系查看
三、异步时钟组
3.1 优先级
3.2 使用格式
3.3 asynchronous和exclusive
3.4 结果示例
四、参考资料
一、背景
Vivado中时序分析工具默认会分析设计中所有时钟相关的时序路径,除非时序约束中设置了时钟组或false路径。使用set_clock_groups命令可以使时序分析工具不分析时钟组中时钟的时序路径,使用set_false_path约束则会双向忽略时钟间的时序路径
使用-group参数可以将一个时钟设置到多个时钟组中,如果时钟组中没有时钟,则时钟组为空组。只有至少两个组都是非空组,为有效组时set_clock_groups约束才有效。如果只有一个组有效,其他组是空的,流程将会报错。
二、时钟间关系
2.1 时钟关系分类
两个时钟的关系可以是同步时钟,异步时钟,非扩展时钟。
同步时钟: 两个时钟的相位关系是可预知的,常见的是两个时钟来源于相同的根时钟或者共同的周期,如生成时钟和主时钟。
异步时钟:当两个是时钟的相位关系不可预知时,则为异步时钟,例如来源两个晶振的时钟,通过不同的输入端口进入到FPGA内部,无法知道两者的相位关系
非扩展时钟:当两个时钟在1000个周期内仍无无法找到共同的边沿,在这种情况下,最差的setup关系在超过1000个周期上,但是时序分析工具将无法确认这是最差的情况。典型的例子是两个奇数倍分频的时钟,如clk0和clk1都是由MMCMs产生的生成时钟,周期分别为5.125ns和6.666ns。它们的上升沿在1000个周期内不存在重合。时序分析工具有一个0.01ns的setup路径裕量,尽管两个时钟有已知的相位关系,但它们的波形使得无法进行正确的时序分析。
异步时钟中,slack值可以按常规方法计算,但计算出的值不一定正确。因此,非扩展时钟通常作为异步时钟。
2.2 时钟关系查看
时钟Vivado中Report Clock Interaction可以查看时钟间的关系
下图颜色方块中,横坐标表示目的时钟,纵坐标表示源时钟,黑色No path表示不存在时序路径,蓝色User ignored Paths为用户设置了不分析的约束,红色Timed(Unsafe)表示异步时钟或非扩展的时钟,颜色块下方的列表也显示了时序的详细信息。
三、异步时钟组
3.1 优先级
异步时钟和非扩展时钟是没法正确地进行时序分析, 在它们之间的时序路径在分析时应该使用set_clock_groups进行忽略。相比于其他时序例外的命令,set_clock_groups的优先级最高,如果需要对异步时钟进行分析,则不能对该时钟使用set_clock_groups命令。
3.2 使用格式
在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是相同的。
约束命令示例:
set_clock_groups -name clk_group -asynchronous -group [get_clocks {create_clk1 gen_clk_2}]
3.3 asynchronous和exclusive
参数asynchronous表示创建异步时钟组,使用场景如数据在不同速率的时钟间通过FIFO进行传输时,使用异步时钟组隔离时序关系。
参数exclusive表示时钟组里的时钟为互斥关系,例如,同一个节点中存在多个时钟,当同一时间内只能一个时钟生效,常用在时钟多路复用上。
3.4 结果示例
以设计中存在4个时钟clk1,clk2,clk3,clk4为例,时钟之间均存在可分析的时序路径。对时钟进行不同的时钟组约束,约束后的分析结果如下,Y表示进行时序分析,N表示不进行时序分析,参数使用asynchronous。
a)场景1:
set_clock_groups -name clk_group -asynchronous -group [get_clocks clk1]
b)场景2
set_clock_groups -name clk_group -asynchronous -group [get_clocks {clk1 clk2}]
时钟组内部的时钟间进行时序分析,和外部的时钟不会进行时序分析
c)场景3
set_clock_groups -name clk_group -asynchronous -group [get_clocks clk1] -group [get_clocks clk2]
设置多个groups时,groups之间的clk不会进行时序分析
d)场景4
set_clock_groups -name clk_group -asynchronous -group [get_clocks {clk1 clk2}] -group [get_clocks {clk3 clk4}]
设置多个group时,group内部的时钟间会进行时序分析,group间不会进行时序分析
总结:set_clock_group中group内部的时钟只能组内间进行分析,不能跨组或与非约束中的时钟进行时序分析
四、参考资料
用户手册:ug903-vivado-using-constraints-en-us-2022.2.pdf
链接:https://pan.baidu.com/s/17AK_-J4wRXiFLtLTorlrwg?pwd=mylt
提取码:mylt