前言
VIVADO默认情况下会对工程中的所有的时钟路径进行时序分析,包括同时钟域和异步时钟域。如果工程中存在异步时钟域,且异步时钟域之间没有信号交互,或者有交互的信号之间已经通过异步时钟同步化处理,则可通过set_clock_groups或set_false_path命令,定义异步时钟域,禁止VIVADO分析异步时钟域之间的时序关系,改善工程的布局布线,同时提高工具的布局布线效率。
一、同步时钟和异步时钟
同步时钟:两个是时钟之间的相位关系是可预测的,那么这两个时钟是同步时钟。通常同步时钟有一个共同的时钟源,并且有一个共同的周期。
异步时钟:无法判定两个时钟间相位关系时,则可以称这两个时钟为异步时钟(asynchronous clocks)。两个来自不同晶振的时钟,一定是异步时钟。通常情况下设计中不同的主时钟肯定是异步时钟,因此可以将这两个主时钟及其衍生时钟约束成不同的时钟组。
不可扩展时钟:当两个时钟无法保证在1000个时钟周期内重新对齐,则认为这两个时钟是不可扩展时钟。例如,有一个共同的时钟产生5.125 ns和6.666ns周期的两个时钟,这两个时钟在1000个时钟周期内上升沿不可重新对齐,则认为这两个时钟为不可扩展时钟。在进行时钟约束时,这两个时钟可以认为时异步时钟。
简单概括:两个时钟的源相同,即可认为是同步时钟,否则,即为异步时钟。
二、set_clock_groups与set_false_path的不同
set_clock_groups命令和set_false_path都是异步时钟域声明的语法,两者略有不同:
set_clock_groups命令是双向的,例如:
set_clock_groups -name async_clk0_clk1 -asynchronous -group {clk0} -group {clk1}
该约束下,clk0到clk1、clk1到clk0都将不被分析。
set_false_path命令是单向的,例如:
set_false_path -from [get_clocks CLKA] -to [get_clocks CLKB]
该约束下,CLKA到CLKB不被分析,但CLKB到CLKA仍然会被分析。
三、set_clock_groups语法
异步时钟和不可扩展时钟无法安全计时。 在分析过程中可以使用 set_clock_groups 命令忽略它们之间的时序路径。
set_clock_groups [-name <arg>] [-logically_exclusive] [-physically_exclusive]
[-asynchronous] [-group <args>] [-quiet] [-verbose]
选项 | 含义 |
---|---|
-name | 对时钟分组的命名 |
-logically_exclusive | 指定逻辑上互斥的时钟组 |
-physically_exclusive | 指定物理独占时钟组 |
-asynchronous | 指定异步时钟组 |
-group | 时钟列表 |
-quiet | 忽略命令错误 |
-verbose | 命令执行期间暂停消息限制 |
注意:
1、-logically_exclusive、-physically_exclusive 和-asynchronous 是互斥的参数。
2、-group如果仅指定了一组时钟,则该组与设计中的所有其他时钟独占或异步。
四、用法举例
1、将src_clk和sync_clk驱动的所有单元分为两个组,并且这两个时钟组相互异步。
set_clock_groups -group src_clk -group sync_clk -asynchronous
2、将src_clk和sync_clk以及他们各自产生的时钟,均为单独的时钟组,并且这些时钟组相互异步。
set_clock_groups -group [get_clocks -include_generated_clocks src_clk] \
-group [get_clocks -include_generated_clocks sync_clk] -asynchronous
注意:上述示例中,src_clk 和 sync_clk 以及它们所有生成的时钟都是异步的。 否则,生成的时钟将相互计时,并与另一个主时钟进行计时。
3、将src_clk和sync_clk组合在一起,成立一个时钟组,并且该时钟组与工程中的其他时钟异步。
set_clock_groups -async -group [get_clocks {src_clk sync_clk}]
五、get_clocks参数
get_clocks命令用于获取当前工程中的时钟列表。工程中的时钟列表可通过report_clocks命令获取。
通过Flow Navigator窗口的Open Implementation Design打开工程实现,然后在Tcl Console窗口中输入report_clocks命令,即可获得工程中的时钟列表,选择对应的时钟即可。
注意:使用**-include_generated_clocks** 命令时,所使用的参数应该为Generated Clocks列表下的Master Clock对应的时钟。
更多关于get_clocks的使用,待后续的文章详解。