跳至正文

综合与时序分析的设计约束

《综合与时序分析的设计约束》

绪论

ASIC设计流程
  • 综合(逻辑综合)是RTL级描述传输级到门级表示的步骤,门级表示是用HDL描述功能硬件的等价实现
  • STA是检测设计满足预期时序需求的能力的办法,它是静态的而不需要模拟。
  • 大多数STA引擎要求设计师指定时序约束来模拟在外围如何表征芯片,以及在设计内部做何种假定来满足由芯片架构所设定的时序需求。
  • 本书使用的是SDC(Synopsys设计约束)的行业标准
  • 在综合阶段,许多假设都是关于时钟网络的,这是因为层次设计信息在此时是不可用的,只有完成布局规划后才可用。
  • 布局规划之后是时钟树综合,时钟树综合会尽量均匀地分配时钟,从而减少设计中不同部分间的时钟偏斜。
  • 布局规划、布局、布线等步骤称作设计布局

ASIC设计流程

FPGA设计流程
  • 布局布线是由时序约束驱动的,以满足IC的时序需求。

    FPGA设计流程

  • 从时序角度来说,RTL设计者会新建时序约束以进行综合。该阶段主要以基本单元内部延迟、时钟延迟、时钟偏斜等形式提供更多的精准时序

  • 在物理设计阶段,时钟假设(偏移和网络延迟)使得逻辑设计固化。时钟树综合能够用于平衡时钟树从而减小时钟偏斜

综合的基础知识

主要是一些与综合的相关问题和约束的必要性

综合的解释
  • 在电子设计中,综合是指完成特定功能的门级网表的实现
  • 对于设计而言,除了功能实现外,还必须考虑面积、功耗和速度(性能)。因此,约束是用来告诉综合工具---在实现相同功能的许多可能的实现方式中,应该选择哪一个以同时满足对面积、功耗和速度的要求。
  • 根据进入相同组合逻辑中不同输入的相对到达时间,综合工具可能需要在可用的选择中决定选用哪种设计,使得最后到达的信号必须通过最少的逻辑电路。换句话说,设计者需要使用约束来告诉综合工具各种输入信号的到达时间
IO缓冲
  • 驱动可以被认为是载流的能力。因此,更高的驱动意味着输出将切换得更快,并且可以连接更多的负载。
  • 无论是输入驱动大的负载(扇出锥fanout cone),还是输出驱动外部的大负载,都需要告诉综合工具,IO端口驱动外部输入信号的驱动能力或者可驱动外部负载的能力。
  • 约束可用于向综合工具传达输入输出端口所需驱动能力的信息。

时序分析与约束

在学习如何进行时序约束之前,需要先了解时序分析的基础知识。

基本上时序分析有两种,

  • 动态时序分析

    动态时序分析是指在输入端输入一组向量,并观察信号到达电路中各个点的时间。通过了解输入和观察到的信号间的时间差,即可知道信号经过特定路径所需的时间。因此,该过程依赖时序仿真,也依赖所施加的激励。

  • 静态时序分析(STA)

    静态时序分析不需要任何输入向量,仅通过分析电路拓扑来计算相同的信息。通常的时序分析指的即是静态时序分析

静态时序分析

  • STA的内容包括分析电路拓扑并计算电路中不同信号到达各个点的时间窗口(time window),然后将其与要求信号到达该点的时间进行比较。只要信号到达的时间满足范围要求,那么在STA看来设计就是可用的
  • STA工具的作用
    • 比较信号到达节点的时间和要求时间,以报告时序是否满足要求
    • 比较每个触发器上数据和时钟的到达时间与该触发器要求的建立和保持时间,以报告时序是否违规
  • 由于STA十分依赖于延迟计算,所以它的使用前提是综合以得到门级网表
  • 时序约束的作用
    • 约束作为声明
    • 约束作为断言
    • 约束作为指令
    • 约束作为异常。时序异常指的是在某些路径上已被约束满足某些时序,而由于某些原因,实际不需要满足这些时序,或者即是约束要求更宽松,也可以有效工作的情况。

时序路径

  • 时序路径是指信号可以继续穿过,不必等待其他触发条件的路径。沿着时序路径,信号仅在通过电路元器件时才有延迟

  • 起点和终点

    • 信号时序路径开始的点称为起点。对于给定的电路,所有输入都可以是起点

    对于寄存器,信号将从寄存器的Q引脚开始,然后向前传递。更严格说,时序从时钟源开始,然后到达触发器的clock引脚,接着进入触发器的Q引脚,然后继续向前。

    • 信号必须被定时(时序路径结束)的点称为终点。对于给定的电路,所有输出都可以是终点

    对于寄存器,输入D必须等待时钟触发的到达。也即能进一步传递信号的时序将取决于时钟的到达时间。因此时序路径在此结束。当然,此处的触发器输入D应该检查是否满足建立和保持时间要求。

    典型时序路径起点和终点

  • 打断路径

    用户可以通过指定一些启动条件(比如指定最大延迟)或检查条件(比如恢复-撤销检查)在设计的任何位置插入额外的起点和终点。那么通过在路径上指定起点或检查点,可以在该点打断路径。

功能路径和时序路径
  • 从起点到终点的过渡过程的路径拓扑称为时序路径,而功能路径是指信号流动的拓扑。

    时序路径举例

  • 在该图例中,功能路径描述:信号从I1到C1,再到F1的D引脚,之后如果正确触发时,再穿过F1到C2并一直向前

    但这不是时序路径,因为信号通过触发器是由时钟触发何时到达触发器所决定的。

    时序路径意味着当信号到达时,可以直到路径中下一个过渡过程将会发生的时间。

  • 时序路径指示过渡过程将会发生的顺序,而不必等待任何其他事件(比如触发时钟)的发生。

    功能路径表示值将会发生变化的顺序,值变化的时序可能仍受其他事件的控制。

时钟路径与数据路径
  • 流入触发器数据引脚的路径称为数据路径,可以是
    • 从一个触发器的输出到另一个触发器的输入
    • 从原始端口到触发器的数据输入引脚
    • 从触发器的输出到输出端口
  • 流入触发器时钟引脚的路径称为时钟路径

建立与保持

一般情况下,建立是指在时钟沿到达之前触发器D(任何其他同步)引脚上的数据应该稳定的时间;保持是指时钟沿到达之后数据应该保持稳定的时间

定义
  • 建立的通用定义:数据需要在一些参考事件之前建立并使之可用。对于触发器,参考事件是时钟触发。对于其他时序路径终点,参考事件可以是“期望数据在该点可用的时间”

  • 保持的通用定义:一些参考时间之后,数据需要保持并不被新数据干扰。对于触发器,参考事件是时钟触发。对于其他时序路径终点,参考事件是“允许数据在该点变化的时间”

  • 最大分析:建立检查可以确保移动最慢的数据也能及时到达并满足建立的标准。也即数据路径可以计算最大延迟

  • 最小分析:保持检查可以确保即使是移动最快的数据也不应该干扰到其他数据,同时期望数据保持稳定。也即数据路径可以计算最小延迟

裕度slack
  • 裕度是指任何超出要求的额外的余地。

    建立裕度 = 数据建立要求 - 最后一个到达的信号

    保持裕度 = 最早到达的信号 - 数据稳定要求

  • 正裕度意味着时序已经得到满足,而负裕度意味着时序尚未得到满足

  • STA用于进行建立和保持分析,并计算正在分析的路径裕度

  • 在STA中,工具将会通过路径来跟踪延迟(建立分析的最大值、保持分析的最小值),并跟踪信号要求的时间。然后将比较两个数值并提供裕度值(正或负)

  • 路径延迟(要求时间)的计算还考虑了时钟路径的延迟,该延迟将用于触发起点处的数据启动和终点处的数据捕获

SDC综述

SDC格式的约束大致可以分为以下几种:

  • 时序约束
  • 面积与功率约束
  • 设计规则约束
  • 接口约束
  • 特定模式和配置约束
  • 设计要求的异常
  • 其他命令

时钟

同步设计是指在控制信号触发下电路从一个状态过渡到另外一个状态,常见于边沿触发。
同步设计中作为触发器的控制信号称为时钟,设计触发所在的沿称为时钟的有效沿。

时钟的一些属性

  • 时钟周期是指经过特定时间之后时钟信号将重复之前的动作。

  • 电路的速度意味着设备能在给定周期内有更多的时钟信号有效沿,也即从给定的有效沿开始,在下一个边沿触发器有效之前,能够更快地到达下一个稳定状态。

  • 时钟信号从状态0变化到状态1时称为上翻转,之后进入正相位。反之,则称为下翻转,之后进入负相位。

  • 占空比定义为时钟信号的正相位时间在整个时钟周期内所占的百分比。

create_clock

说明时钟信号指令的BNF(Backus-Naur form)为

create_clock -period period_value
[source_objects]
[-name clock_name]
[-waveform edge_list]
[-add]
[-comment comment_string]

定义时钟周期

-period选项用于定义时钟周期。时钟周期的值必须大于0。

标识时钟源
  • create_clock通常在时钟源的设计对象中进行声明。源对象可以是端口、引脚或网络。

  • 若在网络中定义时钟,则需确保网络中有驱动信号(引脚或端口),否则时钟信号将没有信号源。

  • 一个时钟信号可能有多个时钟源。如支持时钟切换冗余或者不同操作模式中。

命名时钟
  • 每个时钟定义都会给时钟信号命名。用-name选项可以给指定字符串作为时钟名称。当-name选项没有明确指定字符串且时钟已被声明时,将有工具自动命名。
指定占空比
  • 时钟信号的占空比由-waveform选项指定。该选项是一个典型的有序实数对,也即至少包含一对数,分别表示时钟信号的上升沿和下降沿。

  • 如果不指定的话,默认时钟信号占空比为50%,等价于{0 T/2}。

  • -waveform选项中的两个数字表示的是一个完整的时钟周期,因此必须是单调递增的(先上升沿再下降沿)。

  • 此外,有些应用中会使用多对数来表示多个脉冲的叠加,以模拟复杂的时钟波形。如下所示,

    create -period 10 -name CLK -waveform {3 5 8 9} [get_ports C3]

    复杂时钟波形

同源多时钟
  • 通常为满足多I/O速度协议等需求,需要在时钟源指定多个时钟,也即在相同的对象中指定多个不同的时钟。

    create_clock -name C1 -period 10 [get_ports CLK]
    create_clock -name C2 -period 15 [get_ports CLK] -add

    同源多时钟

  • 此种情况下,需要为多出来的同源时钟进行强制命名并添加-add,也即每个时钟信号都需要唯一的名称进行区分。

  • 这是因为工具并不知道如何对应用于同一源时钟的多个对象命名,因此需要强制使用-name。此外若不指定-add的话,会导致最后一个时钟定义覆盖之前的时钟定义。

  • 时钟信号是应用于对象的属性,具有唯一的波形和周期。相应的,即使定义在同一个应用对象(端口/引脚)上的不同波形也表示的是不同的时钟信号。这即是时钟信号需要给定唯一名称的原因。

注释时钟
  • 从SDC1.9开始,许多SDC指令增加了-comment选项,仅表示使用字符串用作注释文档,不影响综合和时序

    create_clock -period 10 -name clk [get_ports clk]\
    -comment "Clock for USB block generated by PLL"

虚拟时钟

  • 上述所进行的是在实际电路单元中模拟时钟信号,而在诸如端口或引脚被电路单元外部的时钟信号所触发或依赖的情况下,用户需要定义的电路单元的约束是没有时钟信号所需的端口或引脚的。

  • 为了获取这些位于电路单元之外或片外的时钟信号特征,需要用到虚拟时钟的概念

  • 虚拟时钟是指物理上在特定电路单元中不存在的时钟,但它表示影响该电路单元时序的外部触发器

  • 用create_clock模拟虚拟时钟时,是没有源对象的。例如

    create_clock -period 10 -name v_clk -waveform {0 5}

其他时钟特征

  • 大部分设计都需要多个时钟,而为每个时钟都设置单独的时钟发生器是不可行的。
  • 通常在设计中是利用基本时钟来生成多个时钟信号。那么当多个衍生时钟在设计中交互时,需要考虑各个模拟的时钟信号之间的偏离、延迟、相位关系等多个特征。留此做后续分析。

时钟规格的重要性

  • 对于由时钟信号触发的同步设计,有很多顺序元素(触发器、寄存器、同步存储器等)。
  • 在设计中绝大多数的时序路径都是从一个顺序元素到另一个顺序元素
  • 通常情况下,大多数路径都是同步路径,也即路径的起点和终点都是使用同一根时钟触发。因此当定义好一个时钟后,设计中的无数路径即相应得到时序需求

生成时钟

通常设计中需要用到多个时钟。在多时钟交互时,异步时钟是不能共享确定相位关系的时钟信号,只有同步时钟会共享固定相位关系,往往同步时钟产生自同一个时钟源。

来源于同一主时钟的时钟称为生成时钟或派生时钟(衍生时钟),产生方式有几种:

  • 时钟分频器
  • 时钟乘法器
  • 时钟门控

时钟分频器

  • 时钟分频器可以产生一个比原始时钟源频率更低的时钟信号。

  • 典型的时钟分频器是2位纹波计数器。即第一个触发器由外部时钟脉冲提供时钟,然后每个后续触发器由前一个触发器的Q或 Q' 输出提供时钟。

    2位纹波计数器

时钟乘法器

  • 时钟乘法器是一种通过频率增加和周期减少来获得更快时钟速度的电路。

  • 下图是一个实现时钟倍频的时钟乘法器电路,更常用的是PLL实现倍频

    时钟乘法器倍频

时钟门控

  • 时钟门控可以用于减少触发器或寄存器因时钟触发而改变不必要的状态时产生的功耗。也即时钟信号要等到逻辑电路使能后才有效。

    门控时钟

  • 相应可由奇数个反相器链实现的时钟门控来创建需要的时钟脉冲,也即反相器链的延迟差。

    时钟门控产生时钟

create_generated_clock

设定生成时钟命令的BNF(Backus-Naur form)为

create_generated_clock [source_objects] //定义生成时钟的对象
-source clock_source_pin
[-master_clock master_clock_name]
[-name generated_clock_name]
[-edges edge_list]
[-divide_by factor]
[-multiply_by factor]
[-invert]
[-edge_shift shift_list]
[-duty_cycle percent]
[-combinational]
[-add]
[-comment comment_string]

定义生成时钟的源
  • -source选项可以指明生成时钟是由哪个主时钟的源引脚派生的。
  • 源对象指的是生成时钟设定在哪个位置(source_objects),而生成时钟的源指的是哪个是获得生成时钟的参考信号(clock_source_pin)
  • 一个源对象可以具有多个时钟。在主时钟源引脚有多个时钟扇入时,为表明是由哪个主时钟派生而来的,需要用-master_clock选项定义
设定生成时钟的特性
  • 设定生成时钟特性的选项有三个,实际三个只取其一

    • -edges,是一个对应源时钟边沿的整数列表,表明生成时钟的上升沿和下降沿的顺序,至少3个(奇数个)整数表示一个完整生成时钟的周期。换句话说源时钟的两个上升沿(或下降沿)确定(触发)生成时钟的两个边沿,相应三个上升沿(或下降沿)确定生成时钟的三个边沿,而一个时钟的完整周期就是由三个边沿确定的。

    生成时钟图

    对应sdc定义为

    create_generated_clock -name GCLK3 -source [get_ports CLK]
    -edges {2 4 6} [get_pins FF1/Q]
    create_generated_clock -name GCLK4 -source [get_ports CLK]
    -edges {4 6 8} [get_pins FF1/QBAR]

    • -divide_by,表示生成时钟通过某个因子进行分频而得

    • -multiply_by,表示生成时钟通过某个因子进行倍频而得

  • 任何使用-divide_by或-multiply_by表示的生成时钟都可以用-edges来表示,反之未必。

  • 若要对生成的时钟取反,可使用-invert选项,仅仅影响生成时钟的起始是上升沿还是下降沿开始

  • 当倍频来生成时钟时,可以-duty_cycle选项设定占空比,该选项只能配合multiply_by来使用

时钟沿位移
  • 生成时钟的时钟沿可能受时间的影响发生位移。
  • -edge_shift选项可用一组浮点数来表示对应在时间单元内每一个时钟沿的位移,-edge_shift个数必须同-edges个数相等
多个同源时钟
  • 若多个时钟都收敛于一个生成时钟对应的特定源时钟,则由该时钟源引脚派生的生成时钟具有与源相关的每个时钟的特性(继承)。

  • 如图所示,若CLK为有两个特性不同的时钟(来自C1和C2)收敛到该MUX端口,在将CLK端口作为内部电路的源时,应当在同一个对象上设定多个生成时钟(分别继承)。

    create_clock -name C1 -period 10 [get_ports CLK]
    create_clock -name C2 -period 15 [get_ports CLK] -add

    //基于C1特性的生成时钟

    create_generated_clock -name GC1 -divide_by 3 -source [get_port CLK]
    -master_clock C1 [get_pins FF2/Q]

    //基于C2特性的生成时钟

    create_generated_clock -name GC2 -divide_by 3 -source [get_port CLK]
    -master_clock C2 [get_pins FF2/Q] -add

  • 此时可见,即是两个生成时钟是同源的(即CLK端口),但两个波形也是不同的。同样,两种波形都位于对象FF2/Q上也是合乎逻辑的。

  • 若想得到两个生成时钟的综合分析和STA,则如上所示需要加-add。同样的由于时钟名称是唯一定义的,所以-add必须和-name选项一起使用。

  • -master_clock用于关联生成时钟和生成该时钟的特定源对象。

使能组合电路路径
  • 在源同步接口中,时钟随着数据作为输出。源同步接口优点:时钟和数据按相同的路径传输,因此两者的延迟相同。此时只要如图所示的两条线路的延迟差接近0,那么对数据边沿捕获而言,实际线路的延迟并不重要。

    源同步接口图

  • 在源同步接口中,DATAOUT引脚的延迟应根据CLKOUT设定,在此组合路径中,需使用-combinational将生成时钟定义在CLKOUT上。也即

    create_generated_clock -name CLKOUT -combinational
    -source [get_pins FF1/Q] [get_ports CLKOUT]

  • 若从源引脚到生成时钟的路径是纯组合电路,又同时存在时序电路的话,常用-combinational选项来定义生成时钟以阻隔时序电路。因为组合电路是始终有效的,而时序电路靠时序驱动,否则定义的生成时钟将会失效。

生成时钟注意事项

  • 若定义一个生成时钟,应确保其是由特定源对象所生成的(有源)。

  • 若多个时钟收敛于同一个时钟源引脚时,应确保在定义生成时钟时已经设定了主时钟-master_clock。

  • 若同一引脚上存在多个源,需设定对应多个生成时钟约束,并加-add以防止覆盖。

  • 避免时钟收敛于组合电路路径,该情况下可能导致脉冲。若时钟收敛于多种路径(组合电路+时序电路)时,需注意禁用时序电路路径。

  • 若要生成的时钟的特性是基于源时钟的特性而构成时,通常直接create_clock,而不必要create_generated_clock

时钟组

当设计中有多个时钟交互工作时,仅正确定义时钟并不能满足要求,同样需要定义各个时钟之间的关联关系。

同步时钟往往是同源的,共享确定的相位关系。但异步时钟由不同的源生成,不共享固定的相位关系。

在设计中往往是每一个部分都有一个时钟形成的时钟域驱动,相应的由异步时钟驱动时钟域连接的信号称为跨越异步时钟域(CDC)。

首先讲解多频时钟如何影响设计中的时序

建立和保持时序检查

  • 建立定义为在时钟有效沿到达之前要求数据有效的时间,保持定义为时钟有效沿到达之后要求数据稳定的时间。

    CDC示意图

  • 若同源时钟C1和C2的边沿完全对齐,有建立时间要求t~setup~,保持时间要求t~hold~,总延迟为从C1时钟到触发器Q端的源时钟路径延迟t~F~和数据路径延迟t~C~之和,也即t~F~+t~C~。

    相应允许的最长建立时间为F2下个时钟沿到达之前, 即t~F~ + t~C~ < t~period~ - t~setup~

    相应允许的最小保持时间为数据到达的时间,即t~F~ + t~C~ > t~hold~,否则当前数据会干扰前一个数据

  • 若同源时钟C1和C2的边沿不对齐,有时钟从源到发送触发器(源时钟路径)时间t~L~,从源到捕获触发器(目标时钟路径)时间t~Z~,那么对应检查为 t~L~ + t~F~ + t~C~ < t~Z~ + t~period~ - t~setup~,t~L~ + t~F~ + t~C~ > t~Z~ + t~hold~

高速到低速时钟
  • 对于发送和捕获时钟约束

    create_clock -period 10 -name C1 -waveform {0 5} [get_pins F1/CK]
    create_clock -period 15 -name C2 -waveform {0 0.75} [get_pins F2/CK],有波形图如下。

    高速到低速时钟

  • 可见波形在公共时间30ns后会出现重复,也即分析检查是在30ns(两时钟周期的最小公倍数)一个公共周期内。于是可行的发送/捕获窗口为

    0ns发送 / 15ns捕获

    10ns发送 / 15ns捕获

    20ns发送 / 30ns捕获

    可见第二条是约束性最强的,以此可以进行建立检查。同时约束性最强(保持时序最坏的组合)的保持检查位于0ns时刻。

低速到高速时钟
  • 对于发送和捕获时钟约束

    create_clock -period 15 -name C1 -waveform {0 0.75} [get_pins F1/CK]
    create_clock -period 10 -name C2 -waveform {0 5} [get_pins F2/CK],有波形图如下。

低速到高速时钟

此时约束性最强的建立检查位于15ns发送/20ns捕获窗口,相应约束性最强的保持检查仍位于两时钟沿时间为0ns时刻。

异步时钟
  • 若时钟之间不共享相位关系,也即发送时钟和捕获时钟彼此之间没有固定关系(没有公共周期),意味着在每个周期内的建立和保持时序要求都可能不同。

  • 在CDC(Clock Domain Crossing)下未做处理会导致亚稳态(若触发器的输入在捕获过程中发生改变,那么该触发器的输出可能在某段时间内不稳定)。

  • 在CDC下,通常利用set_clock_groups单独设定跨时钟域操作。

逻辑和物理独立时钟

  • 逻辑独立:对于某些时钟,尽管其在设计中共存,但除了它们的源以外彼此之间并不交互

    逻辑独立时钟

    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

  • 对于如图所示时钟结构,C1和C2是逻辑独立,而对应的生成时钟GC1和GC2并不共存于同一个网络下,因此认为是物理独立的。

    物理独立时钟

    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_pins mux1/A] [get_pins mux1/Z] -combinational
    create_generated_clock -name GC2\
    -source [get_pins mux1/B] [get_pins mux1/Z] -combinational -add
    set_clock_groups -physically_exclusive -group GC1 -group GC2

    上述约束通过定义一个组合生成时钟,使得时序工具按set_clock_groups禁用触发器F1和F2之间相关时钟的本地时序电路路径分析,而不影响触发器F3和F4的时序分析。

串扰

  • 在深亚微米技术中,尽管设计上时钟是相互独立且并不交互的,但是由于某些原因仍可能导致信号之间出现干扰。

  • 例如位置较低的几何形状要求较高的布线密度、设备之间或信号之间耦合电容的相互影响,使得信号或干扰从一个电路或通道传播到另一个电路或通道(串扰)。

  • 由于串扰影响时序,其对所进行的建立和保持时序检测也有直接的影响。例如下所示,若干扰源网络的转换方向和受扰网络相反,会导致受扰网络的信号斜率变低,从而增加延迟,影响到时序。

    串扰影响时序

set_clock_groups

为了让时序工具能忽略任何异步或互斥时钟之间的时序路径或串扰分析,可用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选项区分,时钟并不共存时可使用-physically_exclusive选项,时钟间不共享相位关系时使用-asynchronous选项。三者仅选其一,表明时钟组之间的时序电路路径是不必考虑的。
  • 设计中共存多个时钟,却没有相位关系,则应设定为-asynchronous;若设计中共存多个时钟,并且电路仅选择其中之一,则应设定为-logically_exclusive;若设计中不能共存多个时钟,则应设定为-physically_exclusive。
  • 一个set_clock_groups命令可设定多个组。多组时钟列表意味着本组时钟同其他组的时钟保持逻辑独立、物理独立或异步关系。​单独一组时钟列表意味着本组时钟同设计中所有其他时钟均保持逻辑独立、物理独立或异步关系。

时钟组相关的注意事项

  • 定义时钟组并不意味着组内时钟就是同步的。组内时钟间的关系仍可另外定义。

  • 若表示组间关系时使用了错误的选项,可能不会影响时序,但会影响信号完整性分析。

  • 即便定义了主时钟和其他时钟间的时钟组关系,这种关系也不会被主时钟派生出的生成时钟所继承。