随着技术的发展,数字电路的集成度越来越高,设计也越来越复杂。很少有系统会只工作在同一个时钟频率。一个系统中往往会存在多个时钟,这些时钟之间有可能是同步的,也有可能是异步的。如果一个系统中,异步时钟之间存在信号通道,则就会存在CDC(clock domain crossing)问题。
SpyGlass CDC分析使你能够识别设计中的CDC问题。SpyGlass CDC tool是一种 Formal Check Methodology工具, 相比写case跑仿真来找CDC问题, 靠SpgGlass能更早,更全,更快的发现CDC问题. 它能够:
- 管理多时钟域设计
- 系统地处理CDC问题
- 检查和报告任何不同步的信号: 时钟和复位
当SOC design涉及的clock domain太多,用到很多第三方IP,及涉及人员水平参差不齐时, 用SpyGlass CDC来做检查来保证RTL质量是十分必要的.
一、基本流程
在工程的block-level和SOC 集成的两个不同阶段, 所适用的CDC Goal也是有所不同的。Block-Level关心的是模块内部, 只有模块内检查没问题后才能做deliver. 而SOC集成主要关心的是模块间interface的CDC问题。
1、block level
各个步骤的说明如下:
(1)Creating SpyGlass CDC Setup:指定constraints(SGDC file)、parameters 及其他指定用于该project的定义来精准运行SpyGlass CDC检查。
可以使用‘sdc2sgdc’ 命令来将 block-level SDC 转化成相应的SGDC 约束文件。运行 “cdc_setup_check”goal 能够生成constraints, 但生成的constraint一定要designer仔细review下再用。运行‘cdc_setup’后工具可以理解整个design的architecture, 解决一些block-box的问题,并自动生成‘autoclock.sgdc’及autoreset.sgdc作为 constraint的base来使用。 合理设置parameter可以极大的减少CDC error/warning的数量。
(2)Verifying SpgGlass CDC Setup: :检查setup的正确性和完整性。在进行下一步时一定要修掉该stage报的violation,如确保所有flip-flop都有时钟。“set_case_analysis”参数合适定义来确保多时钟源的flip-flop有指定的时钟选择。时钟的周期,有效沿及domain都需要合适定义。
(3)Performing Clocks and Reset Integrity Checks:修掉时钟和复位不完整定义的问题,确保时钟和复位都被合理定义,并且确保clock/reset没有glitch和race。
(4)Performing Block-Level CDC Verification: 要修掉所有的violations, error和warning都要review,必要时可以waive掉。 清理violation是有先后优先级顺序的。优先级如下:
- Ac_sync_group Rule violations; rule Ac_unsync01(for scalar unsync) 和 Ac_unsync02(for vector data unsync),增加constraint或设置cdc_false_path, 不要靠waive来修,也可以定义static,quasi-static来解决.
- Convergence violations: rule Ac_conv01,Ac_conv02,Ac_conv03,Ac_conv04 and Ac_conv05.
- Glitch violations: Ac_glitch* 和 Clock_glitch*
- Data hold violation: rule Ac_cdc01, 表明 signal/data从快时钟到慢时钟发送时hold不住。
- Data hold issues in synchronized data crossing: rule Ac_datahold01a
- Violations related to data correlation and race conditions: Rule Ac_cdc08, Ac_conv01 and Ac_conv02
- Violations related to reset synchronization and deassertion: Rule Ar_unsync01, Ar_sync01,Ar_asyncdeassert01,Ar_syncdessert01,Reset_sync02
- violations related to FIFO recognition and verification: Rule Ac_fifo01, SpgGlass可以识别通常的FIFO结构。 也可以在constraint file(SGDC)中指明fifo。
(5)Performing SOC-Level CDC Verification:在soc level进行CDC检查,可以发现所有structural issues。
(6)Signing-off SpyGlass CDC Verification:检查报告,清干净问题和sign-off 。
2、SOC level
不同于block level flow, 在Hierarchy Verify Flow中使用abstract view来专注于模块边界的问题,从而减少CDC verify的运行时间。block owner deliver 已经verified的模块给SOC集成team,SOC integration team在abstract view上不用再担心block内的问题。如果有些block 是不可用的,可以为这些block产生abstract views, 从top-level移植constraints到block-level,考虑添加‘ip_block' constrain 到这些block.
二、流程介绍
在执行SpyGlass CDC 分析之前,需要检查必要的先决条件。进行SpyGlass CDC分析的先决条件如下:
- 成功运行design-read流程
- 确保设计包含最少数量的非预期的black box
- 在设计中为实例化的技术库单元提供相应的技术库(.lib)
- 在设计中指定有关时钟的信息,以及复位信息(如果可能的话)
建议在开始运行SpyGlass CDC之前,从设计规范、IPs或芯片引线收集这些信息。如果没有这些信息,SpyGlass CDC也能够提供自动检测时钟和复位,但是会推断出额外的时钟和复位,最好是能够预先明确所有的时钟和复位信息。
1、CDC setup
创建设置意味着在执行CDC验证之前指定设计信息,例如时钟、重置和停止模块。设置的质量决定了SpyGlass CDC分析的质量。错误或不完整的设置可能会导致许多违例或掩盖一个真正的设计错误。
可以通过以下流程建立SpyGlass CDC设置:
- 将时钟生成模块指定为black box
- 为设计指定时钟和复位
- 为设计生成时钟和复位
- 使用设置管理器
1) 将时钟生成模块指定为black box
对时钟生成模块(比如PLL)的内部执行SpyGlass CDC分析非常复杂,而且对整体SpyGlass CDC分析几乎没有价值。将这些块标记为黑盒子,除非你有详细的SGDC约束来定义这些模块的时钟特性。标记PLL时钟生成模块为black boxes的方法是,在project file中设置如下命令:
set_option stop <blocks>
一旦你设置这些模块为black boxes:
- 将时钟约束定义在这些模块的输出pin上
- 将输出时钟和输入定义为同一个时钟域,除非两者之间没有相位关系
2) 为设计指定时钟和复位
如果知道设计中的时钟和复位,可以执行以下步骤来指定他们:
在SGDC中定义CLOCK和RESET的约束:
clock -name “clk_sys”reset -name “rst_n” –value 0
在此流程还需要检查约束的完整性:
- 通过运行SpyGlass CDC 方法的Goals来分析设计
- 检查The Clock-Reset-Summary Report.
- 在The Clock-Reset-Summary Report 的Section D: Cases not checked for clock domain crossings Section里面列出了unconstrained clocks.
- 修改SGDC来指定The Clock-Reset-Summary Report里列出的时钟信号;
- 修改SGDC后重复步骤2;
3)为设计生成时钟和复位
如果不知道设计中的时钟和复位,可以执行以下步骤来生成:
1. 运行cdc_setup goal:这个步骤产生了autoclocks.sgdc和autoresets.sgdc两个SGDC文件,包含了推断的时钟和复位。
2. 检查和修改生成的SGDC文件:这些文件可能包括一些除了真正的时钟和复位的控制信号。因此,你必须检查这些文件中的每个推断的时钟和复位,并删除不是真正的时钟和复位信号。建议查看Setup_clock01和Reset_info01规则信息,以查看这样的推断信号。
3. 在SpyGlass中指定修改过的autoclocks.sgdc 和 autoresets.sgdc文件,并通过运行相应的Goal来分析设计。默认情况下,autoclocks.sgdc文件中生成的clock 假定为一个单独的时钟域。在这种情况下,CDC Verification Rules 报告了对每对时钟信号之间的时钟域交叉的违例。
但是,工具可能会将设计中的一些时钟信号视为来自同一域。在这种情况下,工具会认为触发器之间的数据传输没有同步问题。我们可以通过约束中的clock 关键字来修改时钟域的信息。通过修改clock的-domain参数为同一个值来指定所有相同时钟域的clock到同一个时钟域。注意-domain的参数可以是有效的字符串或者时钟名。
2、Verifying SpgGlass CDC Setup
Setup的主要目标是保证clock和reset被正确定义,必须保证所以error都被修复了,才能进行下一步,不然后续会有很多意想不到的错误。通过运行cdc_setup_check来进行。
3、Performing Clocks and Reset Integrity Checks
这个步骤必须确保时钟和复位被正确定义,并且它们没有glitches、竞争和其他故障。
通过运行clock_reset_integrity goal来修复时钟和复位的完整性。
4、Performing CDC Verification
CDC验证是指在设计中检测CDC问题。
要执行CDC验证,请执行以下步骤:
- 设置所需的参数(parameters)
- 运行Goals,例如cdc_verify和cdc_verify_struct,以检测大量的CDC问题。
最初可能会发现大量违反CDC的情况。以一种系统的方式来处理它们是很重要的,这样就可以快速地处理一些需要考虑的问题。
下列列出了大多数重要的违例种类
1)未同步的跨时钟域问题 (Unsynchronized Crossings Issues)
首先,通过查看Ac_unsync01 和Ac_unsync02来检查未同步的跨时钟域问题。
未同步就进行跨时钟域设计会产生亚稳态,这是最基本的CDC问题。
2) 聚合问题(Convergence Issues)
聚合问题发生在多个信号(可能是同一个时钟域也可以是不同的时钟域)从一个时钟域跨到另一个相同的时钟域,但是这些信号是分开同步的。这样你在使用这些同步过的信号的时候,就不能确定他们是不是同时有效,这样有可能就有问题。几种情况如下:
有关此类违规类型的信息,一般查看Ac_conv01、Ac_conv02、Ac_conv03、Ac_conv04和Ac_conv05。
3)复位同步问题
对于此类问题,请检查违反Ar_*规则的情况。这些rules报告同步异步复位信号的违规行为。
由于复位通常是单比特信号,你可能希望在Ac_sync01下报告它们。但是复位的同步往往不同,比如常见的异步复位同步释放,输入是拉高的。
例如,下图显示了一个复位同步释放:
有关这些违规的信息,请参见Ar_asyncdeassert01、Ar_syncdeassert01、Ar_sync01和Ar_unsync01。
4)毛刺问题
检查通过Ac_glitch*或Clock_glitch*规则报告的所有违例。
这些规则突出了容易出现毛刺的逻辑,这些逻辑可能导致与同步问题非常类似的问题。
5)跨时钟信号宽度错误(Signal Width Errors in Synchronized Control Crossings)
请检查Ac_cdc01 rule 违例。
这种违例通常发生在信号从快时钟穿越到慢时钟,信号在慢时钟还没采样到的时候已经发生变化。下图是信号宽度问题的例子:
6)数据跨时钟的保持时间问题
请检查Ac_datahold01a 违例。
在使用同步器,但功能不正确的情况下,会出现此类违规报告的信号。考虑如下的情况:
上图是一种不正确的跨时钟同步器的情况。这里,数据在enable有效的时候发生了变化。
5、调试CDC问题
在调试CDC问题之前,需要保证setup是正确的。
在正常规模的设计上跑SpyGlass CDC,一般会有大量的违例。大部分违例是因为:
- 错误或者不完备的setup
- 配置信号,通常不应报告为CDC错误
注意:千万不要通过waiving的方式解决CDC的问题,这样十分危险,可能wave掉了真正的CDC问题。每一条waver都必须反复check。
1)使用电子表(Using Spreadsheets)
当存在许多违规行为时,这些违规行为中的很大一部分是由一小部分的根本原因造成的。
分析它们的推荐方法是使用电子表格查看器。执行以下步骤来使用电子表格查看器调试大部分的违规:
1. 打开电子表查看器
通过右键单击违例标题(rule的大类,比如Ar_unsync01)并从快捷菜单中选择电子表格查看器选项来打开电子表格。如下图所示:
2. 筛选和排序数据
在电子表格视图中使用筛选和排序来区分共同因素和违例。要过滤或排序数据,右键单击列标题并从快捷菜单中选择一个适当的选项,如下图所示:
每一列单击可以排序,右键可以过滤:
3. 检查常见原因或者来源
在电子表格中查找常见原因或常见来源。这些很可能指向一个单一的根本原因。
4. 根据源来进行过滤
如果您正在使用静态信号的命名方法,请在电子表格中按源名称进行筛选。比如筛选所有的配置寄存器。例如,下图显示了如何为源指定过滤条件(_cfg):
查看过滤后的列表并解决根本原因,以消除大量违例。
2)使用增量示意图(Incremental Schematic)
示意图使你能够理解和隔离冲突的根本原因。
你可以查看电子表格中出现的多个相关违规的示意图。为此,请执行以下步骤:
1.通过按下<Ctrl>键盘键在电子表格中选择违规。
2.执行下列操作之一,打开增量示意图:
- 单击电子表格中某一行的Schematic列中的链接。
- 单击电子表格工具栏中的增量示意图按钮。
也可以右键直接选择Incremental Schematic
下图为增量示意图:
3)在示意图中查看调试数据
在示意图中调试SpyGlass CDC解决违例时,以下信息非常有用:
- clock 路径中的net的时钟域信息
- reset 路径中的net的复位域信息
- 数据或者控制信号的时钟域信息
- 数据或者控制信息的准静态信息
注意:必须将enable_debug_data参数的值设置为yes,才能查看SpyGlass CDC解决方案规则的上述调试数据。
4)基于实例来过滤违例
在处理大型设计时,设计师会被分配特定的设计实例。在这种情况下,设计师需要关注特定实例中报告的违规情况。为了帮助设计人员快速定位特定实例上的违规,SpyGlass CDC提供了基于实例的过滤机制。在此机制中,设计人员可以基于实例筛选违规。
5)解决多种CDC共同的违例问题
在大量的SpyGlass CDC违例中,大多数是以下情况:
- 不正确的设置
- 可以安全忽略的明显问题
本节描述了以下很多违例行为常见的根本原因:
- Crossing发生或者结束于black box
- 错误的Case Analysis设置
- 源Flip-Flops产生静态信号
- 噪声
在关注rule相关的问题之前,应该首先考虑解决上述问题。解决了上述问题并重新运行SpyGlass CDC之后,您应该会看到更小、更易于管理的问题集。
注意:处理CDC问题时,千万不要通过waving。如果你采用这种方法,就有可能掩盖一个真正的问题。
(1)Crossing发生或者结束于black box
SpyGlass CDC分析依据如下:
- 能够通过路径进行跟踪
- 一定程度的功能性理解
在black box的上游和下游都无法实现上述目标。
要消除这个问题,特定的约束为SpyGlass CDC提供一个部分模型,如下所述:
- 使用以下方法为black box的输入输出分配一个域:
- 对black box输出使用abstract_port约束
- 对black box输入使用signal_in_domain约束
- 使用assume_path约束对从black box输入到输出建模为直通路径。
(2)错误的Case Analysis设置
检查否正确地设置了set_case_analysis约束。
例如,你可能会看到错误的原因是,所有的功能模式和所有的测试模式都是同时激活的,而实际上这些模式中的许多模式永远不会同时激活。要把test相关的信号用set_case_analysis约束。
(3)源Flip-Flops产生静态信号
如果源触发器产生一个静态信号,可能不需要同步。比如说配置信号,这些信号通常在开机/启动时设置,然后不再更改。可以从芯片架构师获得关于哪些信号属于这种情况,并使用准静态约束quasi_static 来约束这些信号。
(4)噪声(Noise)
在SpyGlass CDC验证的主要挑战之一是管理大量的违规。你可以通过特定的设置和设置检查步骤来降低这些“噪声”的干扰。