大数跨境
0
0

[SDC约束命令--set_clock_groups]

[SDC约束命令--set_clock_groups] Lily说跨境
2025-10-21
12
导读:SDC约束命令 set_clock_groups

1 set_clock_groups

1.1 概念

  set_clock_groups命令用于定义时钟组之间的关系,在没有设置clock group之前,STA工具会报所有的clock作为同步处理,即会进行分析SETUP/HOLD建立时间满足关系。增加group 是在原来同步的基础上增加异步描述,不在描述中的还保持同步关系。

命令格式如下:

Bash
set_clock_groups [选项] -group {时钟列表1} -group {时钟列表2} ...

常用选项:

-asynchronous:指定时钟组之间是异步的,即它们没有固定的相位关系,工具不会检查这些时钟组之间的时序路径。

-physically_exclusive:指定时钟组在物理上是互斥的,即它们不能同时存在(例如,通过一个MUX选择的两个时钟)。

-logically_exclusive:指定时钟组在逻辑上是互斥的,即它们不会同时有效(例如,功能时钟和测试时钟)。

基本常用的是:-asyncchronus

1.2 基本用法

异步时钟组

当两个时钟来自不同的源且没有确定的相位关系时,它们之间的时序路径不需要检查(因为无法保证建立和保持时间)。假设设计中有 clk1 clk2 clk3 clk4 clk5 clk6共六个时钟。如下写法:

Bash
set_clock_groups -asynchronous \
                 -group {clk1   clk2}    \
                 -group {clk3 clk4}

含义:clk1clk2在同一个组内,它们之间的路径需要检查;clk3clk4在另一个组内,它们之间的路径也需要检查;但两个组之间的路径不检查。

只有从clk1  clk_3/clk_4 check timing;

只有从clk2 clk_3/clk_4 check timing;

只有从clk3 clk_1/clk_2 check timing;

只有从clk4 clk_1/clk_2 check timing

其他clk两两之间都是同步的,需要做STA时序分析;

等价效果:

Bash
set_false_path -from [get_clocks [list   clk_1 clk_2]] -to \
   [get_clocks [list clk_3 clk_4]]
 
   set_false_path -from [get_clocks [list clk_3 clk_4]] -to \
   [get_clocks [list clk_1 clk_2]]

互斥时钟组

当两个时钟在物理上不能同时存在时(例如,通过MUX选择),使用-physically_exclusive

Bash
set_clock_groups -physically_exclusive   \
    -group {clkA} \
    -group {clkB}

这表示clkAclkB不会同时存在,因此它们之间的路径不需要检查。

逻辑互斥时钟组

当两个时钟在逻辑上不会同时有效时(例如,功能模式和测试模式),使用-logically_exclusive

Bash
set_clock_groups -logically_exclusive \
    -group {func_clk} \
    -group {test_clk}

含义

功能模式时只有func_clk有效

测试模式时只有scan_clk有效

它们之间的路径不需要检查时序

注意事项

同一个时钟可以出现在多个组中,但通常一个时钟只在一个组内。

如果不使用set_clock_groups,工具默认会检查所有时钟之间的路径。

该命令通常用于跨时钟域(CDC)路径的约束,避免不必要的时序检查。

1.3 作用

为什么需要set_clock_groups

1.避免伪路径(False Path)泛滥

不用为每个跨时钟域路径单独设置set_false_path

通过分组一次性定义所有相关时钟的关系

2.提高时序分析效率

工具会跳过无关时钟域之间的路径分析

减少计算量,加快时序收敛

3.确保CDC路径正确处理

明确标记异步路径,提醒设计者添加同步器

避免工具在这些路径上报不必要的时序违例

1.4 示例

1.假设设计中有三个时钟:

 clk1clk2是同步的(同源且相位关系确定)

 clk3是另一个异步时钟

约束如下:


set_clock_groups -asynchronous \
    -group {clk1 clk2} \
    -group {clk3}

这表示:

 clk1clk2之间的路径需要检查(因为它们在同一组)

 clk1/clk2clk3之间的路径不检查(异步)

总结:

set_clock_groupsSDC中用于管理时钟关系的关键命令,它帮助设计者明确哪些时钟之间的路径需要检查,哪些不需要(异步或互斥)。正确使用该命令可以避免不必要的时序违例报告,并确保STA分析的正确性。

2. 复杂SoC时钟分组

定义时钟
   create_clock -name sys_clk -period 10 [get_ports clk_sys]
   create_clock -name audio_clk -period 20 [get_ports clk_audio]
   create_clock -name usb_clk -period 8 [get_ports clk_usb]

   # 
定义测试时钟
   create_clock -name test_clk -period 15 [get_ports clk_test]

   # 
设置时钟组关系
   set_clock_groups -asynchronous \
    -group {sys_clk} \
    -group {audio_clk} \
    -group {usb_clk}

   set_clock_groups -logically_exclusive \
    -group {sys_clk audio_clk usb_clk}   \
    -group {test_clk}

含义:

sys_clkaudio_clkusb_clk三者互相异步;

所有功能时钟与测试时钟test_clk逻辑互斥;

1.5 最佳实践

1.在顶层约束文件中集中统一定义:在顶层SDC文件中集中管理所有时钟关系

2.与时钟定义配合使用:在create_clock后立即设置时钟组关系

3.文档化时钟关系:添加注释说明时钟分组的原因

    使用report_clock_groups来验证约束是否生效;

组内时钟是同步的:需要做STA时序检查;序分析工具(如PrimeTime)会检查这些时钟之间的所有路径的建立时间和保持时间。这些路径必须满足正常的时序约束,不需要特殊的CDC同步器。

组间时钟是异步的:需要做CDC检查;时序工具会跳过这些路径的常规时序检查,但CDC检查工具(如SpyGlass)会标记这些路径为跨时钟域路径。这些路径必须插入适当的同步器(如两级触发器、握手协议等),以确保数据安全传输。


【声明】内容源于网络
0
0
Lily说跨境
跨境分享库 | 每天一点跨境干货
内容 46933
粉丝 2
Lily说跨境 跨境分享库 | 每天一点跨境干货
总阅读278.5k
粉丝2
内容46.9k