Spyglass CDC工具使用
Spyglass CDC工具使用
执行SpyGlass CDC 分析
执行SpyGlass CDC 分析包含执行CDC验证,CDC验证是指检测设计中的CDC问题。
如果需要进行CDC校验,请执行以下步骤。
1.设置所需参数。关于SpyGlass CDC解决方案的所有参数,请参见“SpyGlass CDC参数”。
2.运行目标,如cdc_verify和cdc_verify_struct,以检测大量的CDC问题。
一开始你可能会发现大量违反cdc的行为。以一种系统的方式来处理它们是很重要的,这样你就可以快速地找到一些需要考虑的问题。以下问题涵盖了大多数重要的违例行为:
未同步交叉问题、
聚合收敛问题、
复位同步问题、
glitch问题、
同步控制交叉中的信号宽度问题
同步数据交叉中的数据保持问题
未同步的交叉问题
未同步的交叉问题首先看看Ac_unsync01和Ac_unsync02规则报告的未同步域交叉。
这些规则报告在时钟域交叉时可能出现同步失败的区域。要了解更多可能出现的问题,请参见Ac_sync_group规则报告的同步交叉的原因和Ac_sync_group规则报告的未同步交叉的原因。
要了解如何调试这些问题,请参见调试CDC问题。
要获取有关规则违例的更详细信息,请参见Ac_sync01、Ac_sync02、Ac_unsync01和Ac_unsync02。
下面的例子显示了不同步的交叉问题:
聚合收敛问题
当多个信号从一个域跨越到另一个域,但它们分别同步时,可能会发生收敛问题。例如,考虑以下图所示:
在上面的图中,即使X4和Y4分别正确地同步,您也不能确定当它们重新收敛时它们是否具有同时有效的值。
此外,当参数coherency_check_type设置为reset时,reset控制同步器的收敛性和一致性检查由Ac_conv规则执行,如下所示
有关此类违例类型的信息,参见Ac_conv01, Ac_conv02, Ac_conv03, Ac_conv04和Ac_conv05。有关调试此类问题的信息,请参见调试CDC问题。
复位同步问题
对于此类问题,请检查Ar_*规则违反情况。这些规则报告同步异步复位信号的违例行为。
由于复位通常是单位信号,您可能希望在Ac_sync01下报告它们。但是,复位通常需要不同的同步技术。例如,可以异步地断言异步复位,但必须同步地取消断言。
例如,下图显示了同步解除复位:
在上图中,复位是正确同步的,但它是同步解除的。
有关这些违例的信息,请参见Ar_asyncdeassert01, Ar_syncdeassert01, Ar_sync01和Ar_unsync01。有关调试此类问题的信息,请参见调试CDC问题。
Ar_cross_analysis01规则执行交叉检测和同步检查,并报告设计中复位路径中的所有时钟域交叉。用户不需要像Ar_sync规则那样在约束文件中指定复位定义。
glitch检查
Ac_glitch*或Clock_glitch*规则报告的任何违例行为。
这些规则突出了容易出现故障的逻辑,这些逻辑可能导致与同步问题非常相似的问题。
例如,下图显示了容易出现故障的再收敛组合逻辑:
有关这些违规的信息,请参见Ac_glitch01, Ac_glitch03, Clock_glitch02, Clock_glitch03, Clock_glitch04, Clock_converge01和Reset_sync01。有关调试此类问题的信息,请参见调试CDC问题。
同步控制交叉点信号宽度错误
检查是否违反Ac_cdc01规则。
这种违规表明信号或数据在从快速时钟域到较慢时钟域的交叉中存在潜在问题,其中发送的数据可能在捕获时钟到达时已经更改。
下图是信号宽度问题的示例:
同步数据交叉中的数据保持问题
检查是否违反了Ac_datahold01a。当使用数据同步结构但功能不正确时,就会出现此类违规所报告的信号。
考虑如下图所示的场景:
上面的场景描述了不正确同步的数据交叉。这里,当使能信号处于活动状态时,数据正在变化。有关调试此类问题的信息,请参见调试CDC问题。
时钟域交叉同步方案
同步方案是一种在设计中同步时钟域交叉的方法。以下是SpyGlass CDC考虑的同步方案:
同步方案 被认为是同步的交叉点
传统的多触发器同步方案 当触发器处于同步触发器的排列中时
同步单元同步方案 当目标对象是由sync_cell约束,synchronize_cells参数或synchronize_data_cells参数指定的同步单元实例时.
Synchronized使能同步方案 目的时钟域的第一个触发器被由目的时钟同步的信号使能,并且时钟交叉在数据路径上。
循环MUX同步方案 目的时钟域的第一个触发器由MUX驱动。
MUX- select同步(无再循环)同步方案 类似于再循环MUX同步方案,但MUX不是再循环MUX
延迟信号同步方案 其中交叉是由准静态约束指定的信号的扇出。
与门同步方案 与门存在于交叉点的数据路径上
glitch保护cell同步方案 目标域的第一个触发器是由glitch保护cell的实例驱动的,该cell的一个输入pin由同步触发器同步。
Clock-Gating cell同步方案 触发器的时钟路径有一个Clock-Gating cell,且该cell的一个输入是经过同步的。
限定符同步方案 限定符约束指定的有效限定符到达交叉点的源或目的地时,取决于其类型
使用限定符 -crossing的限定符同步方案 其中限定符 -crossing约束是在交叉输出上指定的
传统的多触发器同步方案
该方案将触发器处于同步触发器排列中的时钟交叉标记为同步。可以使用num_flops约束来设置同步链中的触发器数量。具体操作请参见控制同步器链中触发器的个数。
该方案的示例如下图所示:
在上述方案中,目标对象也可以是锁存器。若要禁用该方案,请将参数enable_multiflop_sync设置为no。
控制同步器链中触发器的数量
在上述场景中,同步器链中允许的触发器数量为3,因为num_flops约束的值为3。因此,f1, f2, f3被认为是同步器链的一部分,上图蓝色虚线中的结构被认为是限定词。
在这种情况下,f4和f5触发器是同步后触发器链的一部分,总体上被认为是这个多触发器同步限定符的同步触发器链的一部分。
同步单元同步方案
该方案将那些时钟交叉标记为同步的,其中目标对象是由以下任意一个指定的同步单元的实例:
sync_cell约束
synchronize_cells参数
使用该参数为标量控制点指定控制同步单元,即目标信号没有总线索引或范围描述的点。
synchronize_data_cells参数
使用此参数指定矢量控制交叉点的数据同步器单元,即用总线索引或范围描述目的地信号的交叉点。下图显示了该方案同步的交叉:
在此方案中:
源对象应为触发器或Black Box实例
目标对象应为以下任意对象:
- 设计单元实例(软实例)也就是说,设计对象可以是包含功能描述的单元实例。
- 黑盒实例(硬实例)也就是说,设计对象可以是不包含功能描述的单元实例。
- 这种区别是显著的,因为与硬实例不同,必须确定通过使用sync_cell约束或通过使用synchronize_cell或synchronize_data_cell参数指定的软实例来描述每个目的比特的触发器。否则,通过该方案,控制交叉不会被认为是同步的。
同步使能同步方案
该方案将这些时钟交叉点标记为同步,其中目标时钟域中的第一个触发器由与目标时钟同步的信号使能,并且时钟交叉点位于数据路径中。
当满足以下条件之一时,时钟域穿越被标记为已同步:
使能引脚由同步到目的时钟域的信号驱动。
在驱动使能引脚的任何一条路径上都存在有效的同步器,所有其他路径上的信号由主端口或目标时钟域触发器驱动,并且在任何路径上都没有不同步的交叉。
该方案允许源对象是触发器或黑盒实例。所有其他对象必须是触发器。
该方案还允许在使能同步器和使能目标触发器之间实现透明锁存。
当设置了enable_mux_dest_domain参数时,目的触发器的使能引脚是由来自与目的触发器相同时钟域的网络驱动的。
目的触发器的使能引脚由使用enable_sync_cell参数指定的同步器单元实例驱动。缺省情况下,该方案一直运行。取消enable_sync参数以禁用此方案。
循环MUX同步方案
该方案将目标时钟域的第一个触发器由MUX驱动的时钟交叉标记为同步。时钟域交叉通过一个MUX输入引脚发生,另一个MUX输入引脚由目标触发器输出驱动。
如果满足以下条件之一,则将时钟域交叉标记为已同步:
MUX选择引脚由同步到目的时钟域的信号驱动。
在驱动MUX选择引脚的任何一条路径中都存在有效的同步器,所有其他路径中的信号由主端口或目标时钟域触发器驱动,并且在任何路径中都没有不同步交叉。
该方案同步的交叉如下图所示:
该方案允许源对象是触发器或黑盒实例。所有其他对象必须是触发器。
该方案还允许在MUX的选择引脚同步器和选择引脚之间实现透明锁存。
缺省情况下,该方案一直运行。使用enable_mux_sync参数禁用该方案。
设置enable_mux_dest_domain参数,将目标时钟域的第一个触发器由一个MUX驱动,其中选择信号属于目标域(即由目标域的触发器驱动),这些时钟交叉视为同步的。
如果MUX的选择引脚是由使用enable_sync_cell参数指定的同步器单元实例驱动的,该方案还认为时钟交叉是同步的。
当可以接受相应的同步策略时,应该运行此方案规则。
MUX选择同步(无再循环)同步方案
该方案与再循环多路复用器同步方案相同,不同之处在于:
MUX不需要是再循环MUX。
MUX的所有选择信号必须在目的域中单独同步。
MUX的至少一条数据线应该没有源,并且该数据线应该来自目标域,或者应该绑定到常量或电源。见图6。
要通过只允许目标域而不允许常量或供应来限制此行为,请将enable_mux_sync参数设置为strict。
下图显示了此方案同步的交叉示例:
该方案允许在MUX的选择引脚同步器和选择引脚之间实现透明锁存。缺省情况下,不运行该方案。设置enable_mux_sync参数为mux_select、strict或all以运行此方案。
延迟信号同步方案
该方案将在设计约束文件中使用quasi_static关键字指定的扇出信号中的时钟交叉点标记为同步。
该方案允许源对象和目标对象是触发器或黑盒实例。只有在设计约束文件中提供有效的准静态约束时,才会运行此方案。注:常用参数不适用于本方案。
与门同步方案
与门同步方案检查时钟域交叉数据路径上的与门是否同步。
该方案将这些时钟交叉标记为同步,其中: 当enable_mux_dest_domain参数设置为yes时,与门的另一输入(输入引脚未接源触发器)由目的域时钟或任何不带同步器的目的域信号中的同步器触发器进行同步。
该方案允许同步器和数据路径与门输入引脚之间的组合逻辑。在这种情况下,组合逻辑的扇入锥应该来自目标域或基本的输入。透明锁存器(启用锁存器)也被认为是组合元件。
该同步方案通过enable_and_sync参数启用。
glitch保护单元同步方案
glitch保护单元同步方案将时钟域交叉标记为已同步,其中:当enable_mux_dest_domain参数设置为yes时,目的域的第一个触发器由一个glitch保护单元实例驱动(使用glitch_protect_cell参数指定),glitch保护单元实例的另一个输入(未连接到源触发器的输入引脚)由目的域时钟中的同步器触发器或任何没有同步器的目的域信号同步器触发器进行同步。
该方案允许同步器与数据路径中glitch保护单元实例的输入引脚之间的组合逻辑。但是,在连接到同步器和目标触发器的glitch保护单元之间不应该有其他glitch保护单元实例。透明锁存器(启用锁存器)也被认为是组合元件。
该方案只有在指定了有效的参数glitch_protect_cell时才能运行。该方案支持input和set_case_analysis约束。
时钟门控单元同步方案
时钟门控单元同步方案将这些时钟域交叉标记为同步,其中:目标触发器的时钟路径具有时钟门控单元,并且时钟门控单元实例的另一个输入(输入引脚未连接到时钟)是同步的或来自目标域信号,如果enable_mux_dest_domain参数设置为yes。
该方案允许同步器与时钟路径中时钟门控单元实例的输入引脚之间的组合逻辑。在时钟门控单元实例和目标触发器的时钟引脚之间不应该有其他组合门。透明锁存器(启用锁存器)也被认为是组合元件。
时钟门控单元可以通过以下三种方式进行识别:从.lib文件实例化的时钟门控单元具有一个属性clock_gating_integrated_cell。
使用clock_gate_cell参数指定时钟gating名称。从RTL中自动识别时钟门控结构。SpyGlass在RTL中识别出以下结构:CGLP结构(正边触发时钟门控),如下图所示:
CGLN结构(负边缘触发时钟门控),如下图所示:
锁存器的输出也可以有一个额外的或门扫描使能。这种结构也将得到承认。该同步方案通过enable_clock_gate_sync参数启用。
限定符同步方案
限定符同步方案将那些时钟域交叉标记为已同步,其中限定符约束指定的有效限定符根据其类型到达交叉的源或目的地。
有效的限定符包括:
基本port。
Black Box输出。
如果限定符约束中指定的类型为src,则属于源域的时序元件的输出。
如果限定符约束中指定的类型为des,则属于目标域的时序元件的输出。
根据限定符的类型,在扇入锥中只有源域或目的域的组合元件的输出。此方案通过提供可能无法自动识别的限定符来帮助减少错误违例。在检查所有其他同步方案后进行检查。
该方案同步的交叉如下图所示:
如果限定符到达preset/clear以外的源实例或目标实例的引脚,则该交叉被认为是该方案同步的。
限定符到达的实例应该是时序元件或输出端口。如果该实例是黑盒,则此方案会忽略它。
然而,该方案考虑了限定符到达目的地触发器实例并且源是black bx的情况,反之亦然。
限定符未传播的设计区域
限定符在设计中向前传播以跟踪交叉点。传播在以下设计区域停止:
时钟域交叉的源或目的地触发器
如果限定符约束中指定的类型为src,则在属于源以外的域的时序元件的输出处
如果限定符约束中指定的类型为des,则在属于目的地以外的域的时序元件的输出处
在blocked的路径上
在没有assume_path指定的Black Box处
在memories中
在时序元件的复位引脚处
具有指定用于严格检查的限定符的交叉
如果为限定符指定限定符约束的-strict选项,则约束行为将不同于此方案的默认行为。
它需要使能、再循环、基于AND的逻辑、GP单元和由限定符控制的时钟门单元;将不接受任何其他逻辑。
使用enable_and_sync、enable_mux_sync、enable_clock_gate_sync、启用_sync和故障检测单元参数来启用/禁用特定方案。
如果限定符是目标触发器的输出或交叉的同步器输出,那么它将与限定符约束中指定的-from_clk/-from_domain匹配源实例域。
使用限定符-crossing的限定符同步方案
假设您在交叉输出上使用由交叉限定符约束指定的限定符。在这种情况下,交叉被认为是同步的。
例如,考虑下图:
在上图中,当限定符约束的-crossing参数被指定时,交叉被认为是同步的。
限定符
是同步数据交叉的信号。通常,这将是一个传统的多触发器、同步单元、用户定义限定符或abstract_port同步交叉。
为了限定或同步数据交叉,限定信号在到达目的地之前收敛于源信号,或通过使能或时钟引脚同步目的地。这只适用于数据交叉。
限定符信号如下图所示:
限定符的类型
限定符有两种类型:检测到的限定符和用户定义的限定符。
检测到的限定符
它指的是spyglass推断的信号,通过使用常规多触发器同步方案(上图中的B1)或同步单元同步方案进行同步。
如果满足以下条件,该信号可以限定或同步数据交叉:
它具有来自单个时钟域的源信号(上图中的A1)。
在一个有效点上与数据交叉源(上图的A2)收敛,该有效点可以是以下任意一种:
目标的使能引脚
目标的时钟引脚在这种情况下,限定符出现在驱动目标时钟的时钟门控单元的使能引脚中。
有效的门根据ac_sync_mode参数的strict_gate和soft_gate选项认为门是有效的。
它与数据交叉的源(上图中的A2)具有与其源(上图中的A1)相同的时钟域。
用户自定义限定符
指以以下任何方式提供的信号:使用限定符约束指定的用户自定义限定符。用户自定义带有-sync active参数的abstract_port约束。在此约束中,-from参数应具有与源信号相同的源域时钟列表,-to参数应具有与目的触发器相同的目的域时钟列表。
潜在的限定符
由于在与源的汇合点存在无效的逻辑,或者信号本身没有同步而无法同步数据交叉的源信号的信号。以无效门收敛为例,如下图所示:
图2
同步器缺失的场景如下图所示:
图3
由SpyGlass推断出的潜在限定符是目的地满足以下条件的限定符:
目的地具有来自同一域的源信号(图2 /图3中的A1)。
目的端是同步的,但是在一个无效的门与源端收敛(图2中的G2)。
目的地是一个未同步的标量信号(图3中的B1)。
潜在限定符有助于识别故障的原因。如果失败被纠正,它可能会变成一个有效的限定符。
包含限定符的交叉的特殊情况
通过限定符进行同步和非同步交叉的特殊情况如下:考虑下图,其中一个源存在多个限定符
在上述情况下,具有限定符的源的第一次收敛发生在与门处。默认情况下,此门不被认为是有效的,并且在循环复用器上使用第二个限定符报告同步。
但是,如果ac_sync_mode参数设置为strict_gate, enable_and_sync参数设置为yes,或者ac_sync_mode参数设置为soft_gate,则认为与门是有效的门。在这种情况下,在第一个有效收敛处报告源的同步,即在与门处报告第一个限定符。
在与源合并之前,有效限定符与非同步交叉收敛,请考虑如下图所示的场景:
缺失同步器
在上面的例子中,源被Ac_sync01和Ac_sync02规则报告为一个有效的同步交叉。
本文主要介绍cdc_setup过程中的rules。
——clock_info1,reset_info1, setup_clock01,它们报告设计中的时钟树,复位树。
——CDC_setup_check,有Clock_info03a, Clock_info05a/b以及Clock_info18检查项
Clock_info01
报告设计中的时钟信号。spyglass可以识别出以下类型clock
描述 | 时钟类型 |
---|---|
普通输入时钟 | Primary Clocks |
黑盒(blackbox)或工艺库单元输出的时钟 | Black box clocks |
寄存器或工艺库单元输出的时钟 | Derived Clocks |
悬空的线或门控锁存器(门控未打开)输出的时钟 | Undrived Clocks |
除去以上情况,锁存器,三态器件或者组合逻辑输出的时钟 | Gated Clocks |
module top (d,q,clk1,sr):
input [3: 0]d;
input clk1, sr;
output [3: 0]q;
reg [3: 0]q:
reg clk3;
wire clk2, clk4, w1;
BB(clk1, clk2, w1);
always @(posedge clk1)
q[0]=d[0];
always @(negedge clk2
q[1]=d[1];
always @(posedge clk3)
q[2]=d[2];
always @(posedge clk1)
if(sr==1)
clk3=0:
else
clk3=-clk3;
always @(posedge clk4)
q[3]=d[3];
endmodule
clk1 是 Primary clock,clk2 是Black box clock,clk3 是Derived Clock,clk4 是Undrived Clocks
Reset_info1
报告设计中的同步复位,异步复位和清除信号
描述 | 复位类型 |
---|---|
普通复位 | Primary Presets/Clears |
黑盒(blackbox)或工艺库单元产生的复位 | Black box Presets/Clears |
寄存器产生的复位 | Derived Presets/Clears |
悬空的线产生的复位 | Undrived Presets/Clears |
锁存器,三态器件产生的复位 | Gated Presets/Clears |
Setup_clock01
报告时钟源,时钟使能信号以及clock cone。
设计中多个输入时钟通过选择器后只输出一个时钟,输出的时钟称为clock cone。
Clock_info03a
报告设计中未被约束的时钟引脚,以下几种情况会报违例。
- 时钟经过组合逻辑后被disable
- 约束文件中没有约束时钟引脚,且use_inferred_clocks参数被设置为No
- 时钟路径上有Blackbox,且Blackbox输出的时钟未约束
- 时钟在设计中没有传输
Clock_info05a/b
如果设计中有多个时钟经过选择器,则需要通过set_case_analysis命令来约束。
在上面的例子中,有clk1和clk2两个输入时钟,经过选择器后输出一个时钟。如果不对选择器进行约束,就会报违例。可将约束文件修改为:
clock -name clk1
clock -name clk2
set_case_analysis -name sel1 -value 0
set_case_analysis -name sel0 -value 0
Clock_info18
报告设计中未约束的引脚。
约束文件中一定要约束以下引脚:输入引脚(包括时钟,复位信号),输出引脚以及BLACKBOX的引脚。
- 对于顶层的输入输出引脚,可在约束文件中通过以下命令约束:input,output,clock,reset,set_case_analysis,abstract_port。
- 对于BLACKBOX的引脚可通过以下命令约束:clock,reset,abstract_port,assume_path以及signal_in_domain。
CDC_verify_struct过程
主要检查设计中是否有未同步的信号,是否有毛刺。在多时钟设计中,要考虑哪些信号需要同步?用什么同步方法?如果处理不当,则会在设计中引入亚稳态或者数据丢失。亚稳态产生的根本原因是建立时间或保持时间不够。下面先简单介绍CDC常用同步方法,再介绍CDC_verify_struct中的rules。
同步方法
note:相位差单位为纳秒
哪些信号需要同步
时钟有效跳变沿的相位差是固定的,称为同步时钟。如下图clk1和clk2,虽然两者频率不一样,但有效边沿(上升沿)之间的相位差固定为T, 2T, 3T,因此可称为同步时钟。
无法判定两个时钟有效边沿相位差,称为异步时钟。不同DPLL或晶振的时钟一定是异步时钟。信号跨异步时钟传输时如果不做同步处理,很容易引起亚稳态和数据丢失。如下图所示。
同一个DPLL或晶振的时钟称为同源时钟。同源时钟根据频率和相位可以分为:
- 同频零相位差时钟
- 同频恒定相位差时钟
- 非同频可变相位差时钟,包括整数倍时钟和分数倍时钟。
只要设计中的时钟不都是同频零相位差,就要考虑信号传输时是否会引入亚稳态,是否有数据丢失。
常用同步方法 跨时钟域传输的信号可以分为两类: 控制信号的传输(通常为单bit),常用二级同步器。
数据信号的传输(通常为多bit),常用握手信号,异步FIFO方法。
AC_unsync01/02
报告跨时钟传输中未同步的信号。如果此项违例,应检查:
- 如果源寄存器和目的寄存器都在同一个IP模块中,使用ip_block约束此模块;
- 如果源寄存器或目的寄存器在black_box中,使用abstract_port或assume_path约束black_box端口;
- 如果源寄存器是个静态信号,使用quasi_static对源寄存器进行约束;
- 如果源寄存器是控制信号,检查信号是否通过一个有效同步器(qualifier);
- 如果源寄存器是数据信号,检查是否使用异步FIFO或握手信号;
AC_sync01/02
报告设计中已经同步的信号。这项规则只是报告信息,不会报告违例。
AC_conv01/02/03
报告设计中的聚合问题。聚合问题有可能会引起数据一致性(data coherency)问题,即同步前的数据与同步后的数据不一致。
AC_conv01规则报告信号经过同步器+寄存器后聚合违例:
-
不同信号经过同步器后又经过不同数量的寄存器,最终在同一个逻辑门处聚合
在上面例子中,第一根信号经过二级同步器后经过一个寄存器,第二个信号经过二级同步器后经过两个寄存器。这两个信号最终在同一个逻辑门处聚合。为什么这样会有问题?假设两个信号在clk1时钟域有00->11的跳变,那么经过clk2时钟域的一堆寄存器后,在逻辑门处看到信号会有00->10->11的跳变,显然这样是不行的。如果确保两根信号不会同时跳变,就没有问题,例如00->01或00->10的跳变就不会有问题。 -
同一个信号经过多个同步器后又经过不同数量的寄存器,最终在同一个逻辑门处聚合。这种情况与上述情况类似。
-
特殊情况下不会报违例:两个信号由同一个控制信号控制
如果spyglass报出违例,但通过检查发现设计没有问题,可使用 cdc_false_path , quasi_static, cdc_filter_conherency等命令约束。
AC_conv02规则报告信号经过同步器后聚合违例,且聚合后又通过寄存器:报告不同信号经过同步器后在同一个逻辑门处聚合问题
注意这里报告违例的地方与AC_conv01不同,仔细看两张图。一个是在寄存器之后聚合,一个是在寄存器之前聚合。这里为什么会出问题?假设clk1时钟与信号有011->100跳变,由于各个路径延时不同,经过同步器后可能会产生011->110->100等奇怪的跳变。如果这个信号是个计数器,那么这样同步肯定有问题。解决办法就是使用格雷码编码,在同步之前,先将二进制编码转换成格雷码,再经过同步器。可以参考异步FIFO中的格雷码指针同步。上述例子中,sync[0:3]是使用格雷码同步的信号,sync_1是经过二级同步器同步的信号,它们在同一个逻辑门处聚合,spyglass会报出这里违例。如果确定sync_1与sync[0:3]信号没有关系,即这样的设计没有问题,可使用如下约束脚本
cdc_filter_coherenct -unrelated sync[0:3] sync_1
gray_signals -nam sync[0:3]
- 报告同一个信号经过多个同步器后在同一个逻辑门处聚合问题
AC_conv03规则检查不同时钟域信号经过同一个时钟域同步器后聚合问题。
AC_glitch03
报告设计中的毛刺。
竞争: 组合逻辑电路中,同一信号经不同的路径传输后,到达电路中某一会合点的时间有先有后(每条途径的组合逻辑污染延时不同),这种现象称为逻辑竞争,而因此产生输出干扰脉冲的现象称为冒险。
冒险: 信号在器件内部通过连线和逻辑单元时,都有一定的延时。延时的大小与连线的长短和逻辑单元的数目有关,同时还受器件的制造工艺、工作电压、温度等条件的影响。信号的高低电平转换也需要一定的过渡时间。由于存在这两方面因素,多路信号的电平值发生变化时,在信号变化的瞬间,组合逻辑的输出有先后顺序,并不是同时变化,往往会出现一些不正确的尖峰信号,这些尖峰信号称为"毛刺"。如果一个组合逻辑电路中有"毛刺"出现,就说明该电路存在冒险。
毛刺: 数字电路中常将毛刺定义为采样间越过逻辑门限一次以上的任何跳变,主要是指电路输出波形中含有时间很短有规律或没有规律的脉冲而又对设计没有用处或产生其他影响,一般都要考虑去除毛刺。
脉冲: 在电子技术中,脉冲信号是一个按一定电压幅度,一定时间间隔连续发出的脉冲信号,在单位时间内所产生的脉冲个数就称为频率。例如手电筒打开灯亮,这是直流,不停的开关灯亮、熄,就形成了脉冲,开关速度的快慢也就是脉冲频率的高低。
The reason for 竞争冒险: 数字电路中的竞争与冒险出现在组合逻辑电路中。由于延迟时间的存在,当一个输入信号经过多条路径传送后又重新会合到某个门上,由于不同路径上门的级数不同,或者门电路延迟时间的差异,导致到达会合点的时间有先有后,从而产生瞬间的错误输出。
The judgement for 竞争冒险: 只要输出端的逻辑函数在一定的条件下能简化成 Y = A + A’ 或者 Y = A·A’,那么就可以判断存在竞争-冒险现象。
The resolve of 竞争冒险: 接入滤波电容、引入选通脉冲、修改逻辑设计等等。
在下图设计中,D0与I1信号达到与门时间不同,C0处容易输出毛刺,如果该毛刺恰好被CLK2时钟域的寄存器采到,则设计容易出错。应将CLK1的组合逻辑修改成寄存器输出。
Clock_sync05/06
Clock_sync05报告输入信号被多个时钟域下寄存器采样,如下图中,输入信号在clka和clkb中被采样。
Clock_sync06报告输出信号由多个时钟域信号组合而成。若确保设计没有问题,可使用set_case_analysis或quasi_static命令加强对输入信号的约束。
setup_quasi_static
准静态寄存器是指设计中的输入信号、寄存器、线网在芯片工作开始时改变,但在接下来的工作中保持为0或1。
setup_quasi_static报告设计中spyglass推断出的准静态寄存器和约束脚本约束的静态寄存器。应仔细检查信号是否满足准静态寄存器的定义。如果信号被spyglass错误推断为准静态寄存器,那么当芯片工作时,该信号变化可能会引起功能出错。
CDC_verify检查
下面介绍CDC检查最后一个过程CDC_verify(functional cdc checks)。主要检查:a)数据完整性;b) 格雷码编码;c) FIFO上溢或下溢;d) 握手协议。
AC_cdc01a
检查快时钟到慢时钟同步数据传输是否丢失。
如下图所示,快时钟域信号只维持一个时钟周期,很难被慢时钟域采到,造成数据丢失。
解决办法是在快时钟域添加extender,使信号至少维持一个慢时钟周期
AC_datahold01a
检查数据被另一个时钟域采样时是否稳定。与ac_cdc01a规则相似,区别ac_cdc01a检查单bit,ac_datahold01a检查多bit数据。FIFO,握手以及门控同步模块不会检查。
AC_conv01
报告来自同一域的信号,这些信号在同一目标域中同步,并在任意数量的时序元件之后收敛
AC_conv02
检查在同一目的域中同步并在时序元件之前收敛的同域信号。使用该规则检查同一目的域中同步的同一域信号的组合收敛情况。
执行该规则的前提条件如下:
可以通过以下方式指定时钟信号:
- 使用时钟约束。
- 通过将use_interred_clocks参数设置为yes来启用时钟信号的自动生成。
- 通过使用上述两种方法的组合。
AC_conv03
检查在同一目的域中同步并收敛的不同域信号
对于不同的路径,只报告一次违例。
对目的域相同但源域不同的同步器进行收敛性检查。
然而,该规则停止检查门以外的地方,不同的域信号收敛。该场景如下图所示:
AC_conv04/05
检查跨时钟传输中没有聚合也没有使用格雷码编码的多bit控制信号,使用此规则检查同步时钟域交叉点以控制总线信号中的一致性问题。
(1)检查是否使用格雷码编码。下图中q[1;0]信号源没有采用格雷码编码。
(2)检查不同bit信号是否使用不同的同步方式。如下图src_bus[0]采用多级同步器方式同步,src_bus[1]采用同步控制信号方式
(3)检查不同bit信号是否使用同一个同步控制信号。如下图src_bus[0]与src_bus[1]采用不同的同步控制信号。
AC_fifo01
检查设计中的FIFO是否会上溢或下溢
AC_handshake01/02
(1)检查REQ-ACK信号是否满足四相握手协议: REQ拉高->ACK拉高->REQ拉低->ACK拉低
(2)检查是否会有数据丢失