数字电路中一般会有多个clock,这些clock 相互之间有些是同步的,需要做 timing check 的,有些是异步的,不需要做 timing check 的,还有些是互斥的,需要 exclude 掉的,这些关系就需要在 sdc 中声明出来,告诉工具哪些需要 check, 哪些不需要。
sdc 中的命令 set_clock_group 就是用来声明 clock 之间的关系,具体用法如下:
异步asynchronous时钟,不做 timing check
比如在下图这个电路中,如果 C1 和 C2 这两个 clock 是异步的,那么一般是不需要 check 这条 path 的,

此时就可以用如下命令来告诉工具:
set_clock_group -asynchronous -group C1 -group C2
2. logically exclusive
如果一个电路中有两个 clock, 但是有一个选择信号控制这两个 clock,在这里,两个时钟无论其来源如何都不会相互作用,但它们在设计中共存。即,F1或者F2又用在了其他同一个设计中的时序电路。如下图

这样的两个 clock 是应该声明成 logical exclusive 的,命令如下:
create_clock -period 10 -name C1 -waveform {0 5} [get_ports C1]
create_clock -period 20 -name C2 -waveform {0 12} [get_ports C2]
set_clock_groups -logically_exclusive -group C1 -group C2
3. physically exclusive
考虑下图;这里,时钟C1和C2在逻辑上是互斥的;无论如何,两个生成的时钟GC1和GC2是互斥的,它们不能在同一网络上共存。因此,时钟GC1和GC2被认为是物理上互斥的。

串扰
当时钟相互排斥时,即使它们不交互,信号之间也可能存在干扰,导致不必要的影响。这通常是深亚微米技术中出现的问题,可能是由于多种原因,如较低的几何形状对较高的布线密度的要求、设备之间的相互作用或信号之间的耦合电容。这导致了一种称为串扰的现象。如下图所示。

串扰生成的glitch
在该图中,相邻网络之间的耦合电容会导致信号上出现不必要和意外的活动。此活动可能是一个小glitch,可能会影响时序分布。受到影响的信号被称为受害者,而造成影响的信号则被称为攻击者。如果攻击者与受害者同时切换,则串扰会影响受害者信号的时序。根据攻击者和受害者的切换方向,受害者处的转换可能较慢(影响setup关系)或较快(影响保持关系)。

串扰导致受害者slew恶化
这被称为攻击者和受害者之间的时间窗口关系,并指示攻击者和受害者的切换可能重合时的重叠时间段。
由于串扰影响时序,因此它对设置和保持定时检查有直接影响。让我们考虑 串扰导致受害者slew恶化的图,这是串扰生成的glitch的示意图,没有电阻和电容。如果攻击者网络在与受害者相反的方向上进行切换,那么受害者网络上的转换可能会恶化,从而增加其延迟。这将影响设置时间。类似地,在与受害者相同的方向上接通攻击者网络可以改善相邻受害者网络的转换,从而减少其延迟。这将影响保持时间。
从信号完整性的角度来看,如果互斥时钟没有串扰问题,那么它们被认为是物理互斥的。
正确的设置和保持要求确保了可靠数据捕获的时间。然而,对于异步时钟来说,考虑到时钟的相位关系不是确定性的,这可能是乏味的,并且不可能满足要求。对于互斥的时钟来说,试图满足要求是没有意义的,因为时钟之间不会相互通信。为了指示定时工具忽略异步或互斥时钟之间的任何定时路径或串扰分析,SDC提供set_clock_groups命令。该命令的BNF语法为:
set_clock_groups [- name group_name] [- group clock_list] [- logically_exclusive ] \
[- physically_exclusive ] [- asynchronous ] [- allow_paths ] [- comments comment_string]
-name选项用于为时钟组提供唯一的名称。时钟被分为多个组,这些组是使用-group选项指定的。
当时钟互斥但它们之间可能存在耦合交互时,会使用-logically_exclusive选项。

上图中的时钟之间的分组可以表示为:
create_clock -period 10 -name C1 -waveform {0 5} [get_ports C1]
create_clock -period 20 -name C2 -waveform {0 12} [get_ports C2]
set_clock_groups -logically_exclusive -group C1 -group C2
尽管上述set_clock_groups在技术上是正确的,作者建议从C1和C2创建组合生成的时钟,然后建立它们之间的时钟组关系。这有助于在后期修改设计的情况下重用,以应对时钟C1和C2在设计的其他部分(F3和F4之间)存在交互,例如下图所示的电路。

这将被修改为:
create_clock -period 10 -name C1 -waveform {0 5} [get_ports C1]
create_clock -period 20 -name C2 -waveform {0 12} [get_ports C2]
create_generated_clock -name GC1 \ -source [get_ ports C1] [get_ pins mux1/A] -combinational
create_generated_clock -name GC2 \ -source [get_ ports C2] [get_ pins mux1/B] -combinational
set_clock_groups -logically_exclusive -group GC1 -group GC2
当时钟在设计中不共存时,使用-physically_exclusive选项。上图中的时钟之间的分组可以表示为:
create_clock -period 10 -name C1 -waveform {0 5} [get_ports C1]
create_clock -period 20 -name C2 -waveform {0 12} [get_ports C2]
create_generated_clock -name GC1 -divide_by 1 \ -source [get_pins mux1/A] [get_pins mux1/Z] -combinational
create_generated_clock -name GC2 -divide_by 1 \ -source [get_pins mux1/B] [get_pins mux1/Z] -combinational -add
set_clock_groups -physically_exclusive -group GC1 -group GC2
可以看出,对于由C1驱动的F1和由C2驱动的F2的组合,不必考虑触发器F1和F2之间的时序,反之亦然,但是 时钟C1和C2也驱动触发器F3和F4,因此,我们不能简单地应用下面的命令:
set_clock_groups -logically_exclusive -group C1 -group C2
此命令将禁用时钟C1的F3和和C2的F4之间的时序路径 。通过在多路复用器的输出端定义一个combinational generated clock ,以针对相关的时钟禁用触发器F1和F2之间的局部时序路径分析,而不影响触发器F3和F4。
如果在同一个设计对象上定义了多个时钟(使用-add选项),那么它们在物理上应该是互斥的。时钟在物理上不兼容的另一种情况是系统时钟和测试时钟都应用在同一个端口上。
异步选项用于时钟之间不共享一个相位关系关系时。应该理解,异步交叉也需要同步器,纯粹是为了功能可靠性。
参数-logically_exclusive、-physically_exclusive和-asynchronous互斥。
在单个set_clock_groups 命令中只能使用一个选项。但是,您可以在多个命令中指定时钟之间的关系,这些关系可能不同。
这三个选项中的每一个都表示不能考虑时钟组之间的时序路径。但是对于串扰分析,它们有不同的含义。
如果时钟组是logically_exclusive的,那么时钟之间的串扰分析就像计算任意两个同步时钟一样。如果时钟组是physically_exclusive的,则不会在时钟之间进行串扰分析。如果时钟组是异步的,则假定时钟具有无限时间窗口,在此窗口中攻击者和受害者可以一起切换。
当时钟组定义为异步时,用户希望维护串扰分析,但不希望禁用时钟之间的时序路径,那么可以使用-allow_paths选项来实现。此选项只能与-asynchronous选项一起使用。这通常只用于信号完整性检查的上下文中,而不用于STA。
在一个set_clock_groups命令中可以有多个组。组中的时钟列表意味着与其他组中的所有时钟在逻辑上或物理上是互斥的或异步的。如果只指定一个组,则表示该组中的所有时钟与设计中的其他时钟在逻辑上或物理上是互斥的或异步的。需要注意的最重要的事情之一是,该命令只指定不同组中时钟之间的关系。同一组中的时钟没有隐含关系。让我们考虑下面的命令
set_clock_groups -asynchronous -group [get_clocks {clk1 clk2 clk3}] \ -group [get_clocks {clk4 clk5 clk6}]
此命令意味着:
- 1.clk1与clk4、clk5和clk6异步。
- 2.clk2与clk4、clk5和clk6异步。
- 3.clk3与clk4、clk5和clk6异步。
- 4.在clk1、clk2和clk3之间不能假设任何关系。
- 5.在clk4、clk5和clk6之间不能假设任何关系
在指定时钟组时,设计者必须注意以下事项:
- 1.如果在一个组中定义时钟,并不意味着它们是同步的。组内时钟之间的关系可以在其他地方定义(比如在另一个set_clock_group命令中或通过工具默认值定义)。
- 2.使用不正确的选项(-physically_exclusive、logicaly_exclusive、-asynchronous)定义时钟组可能不会影响时序,因为所有受影响的时序路径都会被忽略,但它会影响信号完整性分析。
- 3.仅仅因为在设计中定义了主时钟和其他时钟之间的时钟组关系,并不意味着这种关系会被从主时钟派生的生成时钟继承。所有关系都应明确指定。
- 4.时钟分组的最佳方法是
- (a)如果设计中有两个或多个时钟共存,但没有相位关系,那么它们在set_clock_group中被指定为-asynchronous。
- (b) 如果两个或多个时钟在设计中共存,但有一个电路只能在其中选择一个,那么它们在set_clock_group中被指定为-logically_exclusive。
- (c) 如果两个或多个时钟在设计中不能共存,那么它们在set_clock_group中被指定为-physicaly_exclusive。






