时钟和时钟组关系

发布时间 2023-05-21 23:32:11作者: luckylan

时钟

占空比定义为时钟信号的正相位时间在整个时钟周期内所占的百分比。因此对于由上图所所示的时钟波形的上升沿触发的电路,由于正相位占用了70%的时间(10ns中占用7ns),因此时钟信号的占空比为70%。时间量直接影响电路打开多长时间,从而影响电路的功耗。时钟信号的上升沿和下降沿之间不同的时间间隔称为高脉宽,这跟所设计电路处于高电平状态的时间一致。这同样适用于锁存器设计。

时钟占空比50%的原因

  • 1.如果同时用到了该时钟的上升沿和下降沿(A信号上升沿变化,B信号下降沿读取A),那么使用50%的时钟使得在这种情况下,使用两个沿工作的寄存器的建立时间和保持时间都达到最好。
  • 2.在设计中,ICG的时钟就是采用下降沿驱动的
  • 3.理想情况下,时钟不存在转换时间,但是实际时钟信号在不同电平之间切换时,由于供电电压、工艺变化、扇出负载大小和互连负载大小等因素,需要转换时间,对于非50%占空比的时钟,会使得时钟占空比越来越差。
  • 4.同时时钟结构中存在ICG,MUX,OCC,DIV等元件,这些元件的存在,也会使得时钟占空比变差。

 

时钟组

当一个设计有多个时钟时,这种设计的时序不仅取决于时钟的频率,还取决于时钟之间的共享关系。同步时钟是共享确定性相位关系的时钟。通常情况下,同步时钟共享同一个源。

另一方面,异步时钟是不共享固定相位关系的时钟。让我们考虑下图所示电路——如果两个时钟C1和C2是从不同的源生成的,那么它们被视为异步的。

图1 异步时钟域交叉

用于交互时钟的波形

 

由这些时钟中的每一个驱动的设计部分形成了一个时钟域。由异步时钟驱动的这些时钟域之间的接口信号被称为异步时钟域交叉或缩写为CDC。

在本章中,我们将了解如何指定本质上异步的时钟之间的关系,以及如何将它们分组到域中。但首先,让我们试着了解多频时钟设计对时序的影响。

setup和hold时序检查

让我们考虑上图。在这个简单的电路中,有一个启动触发器(F1),它启动数据,该数据进一步被捕获触发器(F2)捕获。setup被定义为在时钟的活动边沿之前数据需要可用的时间,hold是在时钟的活跃边沿之后数据必须保持稳定的时间,以便触发器正确地寄存数据。

设计需要确保启动触发器(F1)的活动边沿上的数据被捕获触发器的最近的跟随活动边沿(F2)捕获。这被称为setup 时序检查。图7.2显示了该设计的时钟波形。

让我们假设tF是从时钟到发射出发去去(F1)的Q引脚的延迟,并且tC是组合逻辑中的延迟。这意味着数据在时间tF+tC到达触发器 F2。让我们还假设时钟C1和C2的边沿完全对准,并且捕获触发器(F2)的setup要求是tSetup。由于下一个时钟在下一个边沿到达F2,这是tPeriod(时钟C2的周期),那么对于来自触发器F1的数据要被F2捕获,数据必须在F2的下一个活动边沿之前至少到达tSetup时间。这种setup 时序检查对信号到达F2的时序要求施加了上限,并且可以表示为:

tF+tC<tperiod–tsetup

一旦满足setup要求,为了正确捕获数据,还必须满足hold要求。这是通过hold 时序检查来测量的,该检查确保在启动时钟的有效边沿和捕获时钟的相同边沿之间满足hold时序。对于相同的设计,由于tF+tC是数据到达触发器 F2所需的时间,因此数据到达的时间必须大于触发器 F2的保持时间(tHold),使得当前数据不会破坏先前的数据。因此,该保持定时检查对信号到达F2的时序要求施加了下限,并且可以表示为:tF+tC>tHold

这是一个相当简单的情况,因为我们假设时钟C1和C2具有完全对齐的边缘。如果边没有对齐,方程会变得稍微复杂一点(尽管它们仍然来自同一个源)。如果tL是时钟从其源到达启动触发器的时间,tZ是时钟从源到达捕获触发器的时间。则setup和hold时序检查为:

快时钟到慢时钟

 

快时钟到慢时钟的波形

让我们考虑启动时钟的周期小于捕获时钟的周期的情况。让我们进一步假设C1具有10ns的周期和50%的占空比,并且C2具有15ns的周期。让时钟表示为:

create_clock -period 10 -name C1 -waveform {0 5} [get_pins F1/CK] create_clock -period 15 -name C2 -waveform {0 7.5} [get_pins F2/CK]

上图显示了这些时钟的波形。从中可以明显看出,波形在30ns之后自身重复。因此,任何分析都必须仅在30ns窗口内进行。对于setup时序检查,窗口内的启动/捕获组合出现在

1.在0时启动边沿,在15ns时捕获。

2.在10ns时启动边沿,在15ns捕获。

3.在20ns时启动边沿,在3ns捕获。

其中,第二对是限制性最强的,需要考虑进行setup 检查。

类似地,如果我们计算窗口内的所有后来的-检查对,我们将发现保持的最坏情况组合对应于0处的启动边缘和0处的捕获边缘。因此,选择0处的两条边进行保持检查。这确保了在启动触发器的时间单元0处的数据不被在时间0处的捕获触发器寄存。

慢时钟到快时钟

慢时钟到快时钟的波形

 

让我们看看另一个使用最严格检查的例子。如果时钟C1(15)和C2(10)的周期被反转,那么再次考虑到时间30ns的所有边沿对组合,并且使用最严格的对。因此,应该在15ns的发射边缘和20ns的捕获边缘之间进行setup 时序检查。
类似地,确定限制性最强的hold检查,对于两条边,该保持检查仍处于时间0。上图显示了这种情况下的波形。

在两个以上周期中周期同步的多个时钟

让我们考虑下图,其中时钟需要多个周期才能重新对齐。

  非整数倍时钟的波形


设时钟C1的周期为6ns,时钟C2的周期为10ns。假设时钟边沿在时间t=0处对准,则它们的边沿下一次对准将在时间t=30处,这是两个时钟周期的LCM。

 从波形中可以看出,有许多边沿可以进行setup和hold检查。但最严格的setup检查是在发射时间为18ns,捕获时间为20ns时。类似地,最严格的hold检查是当两条边都处于0时。

异步时钟 

从上面可以明显看出,对于多频率时钟,这些检查可能会变得相当复杂。如果时钟不共享相位关系,那么发射时钟和捕获时钟的到达相对于彼此将不具有确定性。
这意味着设置和保持时间要求可能在每个周期中都有所不同。
在分析异步时钟时,如果数据路径中有由这些时钟驱动的信号可能正在交互并创建异步时钟域交叉,这将成为一个大的时序问题。这可能会导致某些问题,如亚稳态。在图1所示异步时钟域交叉中,如果触发器F2的输入在被触发器F2捕获时发生变化,则F2的输出可能在一定时间段内不稳定。这被称为亚稳态,需要使用同步器来解决。

异步CDC的主要问题如下:对于每个边缘对,都有不同的时序要求。因此,在某个时候,会有非常小的余地。而且,由于检查应该在最严格的对上进行,因此,至少会有一些边沿,这将违反!
为了防止实施工具不必要地花费时间来满足此类路径上的时间,通常建议确定此类交叉点。这是使用set_clock_groups实现的。

logically exclusive 与 physically exclusive

 

数字电路中一般会有多个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。