VIVADO异步时钟域约束(groups)

前言

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的使用,待后续的文章详解。

  • 7
    点赞
  • 134
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Vivado中,异步时钟约束需要特殊的处理,因为异步时钟间存在时序不确定性。下面是异步时钟约束的一般步骤: 1. 定义异步时钟:首先,需要在约束文件中定义异步时钟,并指定其输入引脚和时钟。例如,假设有两个异步时钟信号 `clk_async1` 和 `clk_async2`,可以使用以下约束语句进行定义: ``` create_clock -period <async1_period> [get_pins <input_pin_of_clk_async1>] create_clock -period <async2_period> [get_pins <input_pin_of_clk_async2>] ``` 其中,`<async1_period>` 和 `<async2_period>` 分别是异步时钟的周期,`<input_pin_of_clk_async1>` 和 `<input_pin_of_clk_async2>` 是异步时钟信号的输入引脚。 2. 创建异步时钟:接下来,需要创建异步时钟,并将相关的时序路径分配给相应的时钟。可以使用以下约束语句创建异步时钟: ``` create_clock -period <async1_period> [get_pins <input_pin_of_clk_async1>] -name <async1_clk_domain> create_clock -period <async2_period> [get_pins <input_pin_of_clk_async2>] -name <async2_clk_domain> ``` 其中,`<async1_clk_domain>` 和 `<async2_clk_domain>` 是异步时钟的名称。 3. 添加时序约束:对于与异步时钟相关的时序路径,需要通过时序约束来定义其时序要求。例如,如果有一个时序路径需要从异步时钟 `<async1_clk_domain>` 到主时钟 `<main_clk_domain>`,可以使用以下约束语句: ``` set_false_path -from [get_clocks <async1_clk_domain>] -to [get_clocks <main_clk_domain>] ``` 这将告诉综合器和布局布线工具忽略异步时钟到主时钟的时序路径分析。 需要注意的是,异步时钟约束需要谨慎处理,确保时序分析的准确性和设计的可靠性。在实际设计中,还可能需要考虑信号同步和异步复位等相关问题。建议参考Xilinx官方文档和手册,详细了解异步时钟约束的使用和最佳实践。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值