芯片设计进阶之路:SpyGlass CDC流程深入理解
------------------------------------------
随着技术的发展,数字电路的集成度越来越高,设计也越来越复杂。很少有系统会只工作在同一个时钟频率。一个系统中往往会存在多个时钟,这些时钟之间有可能是同步的,也有可能是异步的。如果一个系统中,异步时钟之间存在信号通道,则就会存在CDC(clock domain crossing)问题。
如下图中,CLKA和CLKB之间没有固定的相位关系,是异步时钟。前半部分设计属于时钟域CLKA,后半部分设计属于时钟域CLKB。DA信号从时钟域CLKA进入到时钟域CLKB,是一个跨时钟域的信号,这条path也会被称为CDC path。
CDC(Clock Domain Crossing)的前端设计中最常见的问题, 在RTL中要恰当的处理每个异步的控制信号和数据信号, 否则就会出现亚稳态,造成严重的function false.
SpyGalss是目前业界唯一可靠的RTL Sign off解决方案,可以帮助客户在设计早期发现潜在问题,保证产品质量,极大的减少设计风险,降低设计成本。
包含五大模块:lint, CDC(跨时钟域检查), LP(低功耗),Constraint(约束),DFT(可测试性)。
SpyGlass CDC分析使你能够识别设计中的CDC问题。SpyGlass CDC tool是一种 Formal Check Methodology工具, 相比写case跑仿真来找CDC问题, 靠SpgGlass能更早,更全,更快的发现CDC问题. 它能够:
1.管理是多时钟域设计
2.系统地处理CDC问题
3.检查和报告任何不同步的信号: 时钟和复位
SpyGlass CDC与静态时序分析相比:
1.STA对async interface不太好使,只适合sync模块分析
2.CDC paths 总是需要设置成false paths
3.一般在design的后期在netlist level做才有意义
SpyGlass CDC与功能仿真相比:
1.黑盒测试很难穷举(exhaust)
2.白盒测试需要assertions
3.需要覆盖CDC的所有test branches
4.很难幸运的覆盖所有,一般只能发现部分问题
5.一般在design后期才发现问题
当SOC design涉及的clock domain太多,用到很多第三方IP,及涉及人员水平参差不齐时, 用SpyGlass CDC来做检查来保证RTL质量是十分必要的.
在工程的block-level和SOC 集成的两个不同阶段, 所适用的CDC Goal也是有所不同的. Block-Level关心的是模块内部, 只有模块内检查没问题后才能做deliver. 而SOC集成主要关心的是模块间interface的CDC问题.
一些基本的概率如下:
●Rule: 是SpyGlass 进行RTL分析的最小单位.
●Goal: 是一系列相关Rule的集合,组合起来完成RTL分析的某个特定任务. user可以用GuideWare定义好的Goal, 也可根据工程项目要求来选择一系列rule的集合形成自定义Goal. GUI里面点Goal的button来选择设定, 也可在Prj file 里定义.
●Sub-Methodology: 是一系列相关Goal的集合, 用以达成某方面特定目标, 如完成CDC check.
目前包括 SpyGlass CDC/Constraints/DFT/Power/TXV Methodology
其他术语 :
●SGDC : Constraints 文件, 主要包含clock和reset等约束信息.
●Waiver : 用以过滤一些结果的文件.
●Severity : report结果中分Fatal, Error, Warning和INFO四等级信息.
●Parameter: 可以在进行RTL分析之前设定某些参数, 对检查过程进行一些约束
SpyGlass的功能模型总结如下图:
Figure3.1 SpyGlass Functional Model
设置阶段(setup stage)
在设计的设置阶段你可以:
●添加设计文件、SGDC文件、预编译文件和技术文件。
●指定影响SpyGlass运行的各种设计读取选项。例如,你可以在设计中指定顶层模块、更改语言、指定宏等等。。
●运行design-read流程来执行第一级的HDL分析。在进入下一阶段之前,必须解决此阶段报告的致命错误(FATAL)。
Spyglass 可以运行在BATCH 或者 GUI 模式。通常模式下是在batch模式下执行分析,在GUI模式下进行debug。
采用BATCH模式,这些设置都会添加到工程(Project)文件中,Project一般定义了以下内容:
下面是一个Project文件 training.prj的列子:
需要读入的文件及命令如下:
SDC文件可以直接被SpyGlass读取,自动转换成SGDC,需要设置以下内容完成sdc2sgdc的转换:
set_option sdc2sgdc yes
sdc_data –file “test.sdc”
下面是一个SGDC文件的例子
目标(Goal)设定和运行阶段
在此阶段,你将选择并运行目标。目标是规则的集合。
你可以选择规则,也可以指定规则执行的顺序。
在SpyGlass CDC分析期间,你可以在不同的阶段运行不同的SpyGlass CDC目标。在每个阶段中,修复所报告的违例并转移到下一个阶段。使用这种分步骤的方法可以帮助你了解一些需要考虑的CDC问题。
如果不遵循这个分步骤的方法,你可能会看到大量违反CDC的情况,其中大多数是由于不正确的设置或没有修复前几个阶段的违例引起的。
SpyGlass CDC 的目标和规则如下图所示
SpyGlass CDC 分析流程
SpyGlass CDC分析可以分为以下几个阶段:
1.创建SpyGlass CDC设置
2.修复时钟和复位完整性问题
3.执行CDC验证
4.调试CDC问题
在执行SpyGlass CDC 分析之前,请检查必要的先决条件。
进行SpyGlass CDC分析的先决条件如下:
●成功运行design-read流程
●确保设计包含最少数量的非预期的black box
●在设计中为实例化的技术库单元提供相应的技术库(.lib)
●在设计中指定有关时钟的信息,以及复位信息(如果可能的话)
建议在开始运行SpyGlass CDC之前,从设计规范、IPs或芯片引线收集这些信息。如果你没有这些信息,SpyGlass CDC也能够提供自动检测时钟和复位,但是会推断出额外的时钟和复位,最好是能够预先明确所有的时钟和复位信息。
创建设置意味着在执行CDC验证之前指定设计信息,例如时钟、重置和停止模块。设置的质量决定了SpyGlass CDC分析的质量。错误或不完整的设置可能会导致许多违例或掩盖一个真正的设计错误。
可以通过以下流程建立SpyGlass CDC设置:
●将时钟生成模块指定为black box
●为设计指定时钟和复位
●为设计生成时钟和复位
●使用设置管理器
将时钟生成模块指定为black box
对时钟生成模块(比如PLL)的内部执行SpyGlass CDC分析非常复杂,而且对整体SpyGlass CDC分析几乎没有价值。
将这些块标记为黑盒子,除非你有详细的SGDC约束来定义这些模块的时钟特性。
标记PLL时钟生成模块为black boxes的方法是,在project file中设置如下命令:
set_option stop <blocks>
一旦你设置这些模块为black boxes:
●将时钟约束定义在这些模块的输出pin上
●将输出时钟和输入定义为同一个时钟域,除非两者之间没有相位关系
如下面的列子所示:
FIGURE 1. Defining Clock Outputs as in the Same Domain
为设计指定时钟和复位
如果知道设计中的时钟和复位,可以执行以下步骤来指定他们:
1.在SGDC中定义CLOCK和RESET的约束
clock -name “clk_sys”
reset -name “rst_n” –value 0
1.通过运行SpyGlass CDC 方法的Goals来分析设计
2.检查The Clock-Reset-Summary Report.
3.在The Clock-Reset-Summary Report 的Section D: Cases not checked for clock domain crossings Section里面列出了unconstrained clocks.
4.修改SGDC来指定The Clock-Reset-Summary Report里列出的时钟信号;
5.修改SGDC后重复步骤2;
为设计生成时钟和复位
如果不知道设计中的时钟和复位,可以执行以下步骤来生成:
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的参数可以是有效的字符串或者时钟名。
例如,下面的例子中clk1和clk2是同一个时钟域,clk3是不同的时钟域。
current_design myDU
clock -name clk1 -domain A
clock -name clk2 -domain A
clock -name clk3 -domain B
选项 –domain的参数是可选的,如果没有设定,那么时钟域的名字就是时钟自己。所以下面的例子clk1和clk2是同一个时钟域(clk1), clk3是不同的时钟域(clk3):
current_design myDU
clock -name clk1
clock -name clk2 -domain clk1
clock -name clk3
这个步骤必须确保时钟和复位被正确定义,并且它们没有glitches、竞争和其他故障。
你必须通过运行clock_reset_integrity goal来修复时钟和复位的完整性。
Setup的主要目标是保证clock和reset被正确定义,必须保证所以error都被修复了,才能进行下一步,不然后续会有很多意想不到的错误。
CDC验证是指在设计中检测CDC问题。
要执行CDC验证,请执行以下步骤:
1.设置所需的参数(parameters)
有关SpyGlass CDC解决方案的所有参数的详细信息,请参阅Parameters in SpyGlass CDC.。
2.运行Goals,例如cdc_verify和cdc_verify_struct,以检测大量的CDC问题。
最初你可能会发现大量违反CDC的情况。以一种系统的方式来处理它们是很重要的,这样你就可以快速地处理一些需要考虑的问题。
下列列出了大多数重要的违例种类:
●Unsynchronized Crossings Issues
●Convergence Issues
●Reset Synchronization Issues
●Glitch Issues
●Signal Width Errors in Synchronized Control Crossings
●Data Hold Issues in Synchronized Data Crossings
对于所有其他违规行为,请搜索SpyGlass CDC文档以查找其规则名称的违例行为。
详细的请参考 Rules in SpyGlass CDC.
未同步的跨时钟域问题 (Unsynchronized Crossings Issues)
首先,通过查看Ac_unsync01 和Ac_unsync02来检查未同步的跨时钟域问题。
未同步就进行跨时钟域设计会产生亚稳态,这是最基本的CDC问题。
下面的例子是一种未同步信号直接跨时钟域的情况:
FIGURE 3. Unsynchronized crossing causing metastability problem
聚合问题(Convergence Issues)
Convergence issues can occur when multiple signals cross from one domain to another but they are separately synchronized. For example, consider the following figures:
聚合问题发生在多个信号(可能是同一个时钟域也可以是不同的时钟域)从一个时钟域跨到另一个相同的时钟域,但是这些信号是分开同步的。这样你在使用这些同步过的信号的时候,就不能确定他们是不是同时有效,这样有可能就有问题。几种情况如下:
FIGURE 4. Convergence Issues
此外,当将coherence _check_type参数设置为reset时,Ac_conv规则会执行复位控制同步器的收敛性和一致性检查,如下图所示。
FIGURE 5. Convergence Issues of Reset Control Synchronizers
有关此类违规类型的信息,请参见Ac_conv01、Ac_conv02、Ac_conv03、Ac_conv04和Ac_conv05。
有关调试此类问题的信息,请参阅Debugging CDC Issues.
复位同步问题
对于此类问题,请检查违反Ar_*规则的情况。这些rules报告同步异步复位信号的违规行为。
由于复位通常是单比特信号,你可能希望在Ac_sync01下报告它们。但是复位的同步往往不同,比如常见的异步复位同步释放,输入是拉高的。
例如,下图显示了一个复位同步释放:
FIGURE 6. Reset that Deasserts Synchronously
有关这些违规的信息,请参见Ar_asyncdeassert01、Ar_syncdeassert01、Ar_sync01和Ar_unsync01。有关调试此类问题的信息,请参阅 Debugging CDC Issues。Ar_cross_analysis01规则执行crossing检测和同步检查,并在设计中报告reset路径中的所有时钟域crossing。用户不需要像Ar_sync规则所要求的那样在约束文件中指定reset定义。
毛刺问题
检查通过Ac_glitch*或Clock_glitch*规则报告的所有违例。
这些规则突出了容易出现毛刺的逻辑,这些逻辑可能导致与同步问题非常类似的问题。
例如,下图显示了容易出现毛刺的重新聚合的组合逻辑:
FIGURE 7. Glitch-prone reconverging combinational logic
关于这个违例更多的信息可以参考:Ac_glitch01, Ac_glitch03, Clock_glitch02, Clock_glitch03, Clock_glitch04, Clock_converge01, and Reset_sync01.
跨时钟信号宽度错误(Signal Width Errors in Synchronized Control Crossings)
请检查Ac_cdc01 rule 违例。
这种违例通常发生在信号从快时钟穿越到慢时钟,信号在慢时钟还没采样到的时候已经发生变化。
下图是信号宽度问题的例子:
FIGURE 8. Example of a signal width issue
数据跨时钟的保持时间问题
请检查Ac_datahold01a 违例。
在使用同步器,但功能不正确的情况下,会出现此类违规报告的信号。考虑如下的情况:
FIGURE 9. Incorrectly Synchronized Data Crossings
上图是一种不正确的跨时钟同步器的情况。这里,数据在enable有效的时候发生了变化。
在调试CDC问题之前,请保证setup是正确的。请参考Creating SpyGlass CDC Setup
在正常规模的设计上跑SpyGlass CDC,一般会有大量的违例。大部分违例是因为:
●错误或者不完备的setup
●配置信号,通常不应报告为CDC错误
你可以系统的,有条理的来移除这些违例,只留下一些你需要考虑的潜在的实际问题。
注意:千万不要通过waiving的方式解决CDC的问题,这样十分危险,可能wave掉了真正的CDC问题。每一条waver都必须反复check。
你可以通过以下方式来调试CDC问题:
●Using Spreadsheets
●Using Incremental Schematic
●Viewing Debug Data in Schematic
●Filtering Violations Based On Instances
●Solving CDC Issues Common to Multiple Violations
使用电子表(Using Spreadsheets)
当存在许多违规行为时,这些违规行为中的很大一部分是由一小部分的根本原因造成的。
分析它们的推荐方法是使用电子表格查看器。
执行以下步骤来使用电子表格查看器调试大部分的违规:
1. 打开电子表查看器
通过右键单击违例标题(rule的大类,比如Ar_unsync01)并从快捷菜单中选择电子表格查看器选项来打开电子表格。如下图所示
2. 筛选和排序数据
在电子表格视图中使用筛选和排序来区分共同因素和违例。要过滤或排序数据,右键单击列标题并从快捷菜单中选择一个适当的选项,如下图所示:
每一列单击可以排序,右键可以过滤:
FIGURE 10. Filtering and Sorting in the Spreadsheet
3. 检查常见原因或者来源
在电子表格中查找常见原因或常见来源。这些很可能指向一个单一的根本原因。
4. 根据源来进行过滤
如果您正在使用静态信号的命名方法,请在电子表格中按源名称进行筛选。比如筛选所有的配置寄存器。
例如,下图显示了如何为源指定过滤条件(_cfg):
FIGURE 11. The Custom Filter Dialo
查看过滤后的列表并解决根本原因,以消除大量违例。
使用增量示意图(Incremental Schematic)
示意图使你能够理解和隔离冲突的根本原因。
你可以查看电子表格中出现的多个相关违规的示意图。为此,请执行以下步骤:
1.通过按下<Ctrl>键盘键在电子表格中选择违规。
2.执行下列操作之一,打开增量示意图:
单击电子表格中某一行的Schematic列中的链接。
单击电子表格工具栏中的增量示意图按钮。
也可以右键直接选择Incremental Schematic
下图为增量示意图:
FIGURE 12. The Incremental Schematic Window
使用增量示意图的Tips:
●使用图例了解用于标识域和限定符的颜色;
●总是运行Info_Case_Analysis规则来查看常量值(constant values)在示意图中的传播;
●右键单击任何net(不是pin)并选择Show Debug Data-> clock -reset选项来查看时钟和域信息。
有关详细信息,请参考Viewing Debug Data in Schematic.
●可以通过双击边界边来扩展层次结构边界。
●通过双击需要traced的inout/output的对象来跟踪输入和输出。
●通过使用示意图中适当的右键菜单选项来跟踪输入和输出,从而跟踪到触发器、锁存器、输入、输出和模块。
在示意图中查看调试数据
在示意图中调试SpyGlass CDC解决违例时,以下信息非常有用:
●clock 路径中的net的时钟域信息
●reset 路径中的net的复位域信息
●数据或者控制信号的时钟域信息
●数据或者控制信息的准静态信息
注意:必须将enable_debug_data参数的值设置为yes,才能查看SpyGlass CDC解决方案规则的上述调试数据。
要查看示意图中的调试数据,右键单击net并从快捷菜单中选择Show debug data - >Clock-reset选项。当您选择此选项时,将出现一个子菜单,显示以下选项:
●Clock
选择此选项可以查看时钟路径中出现的net上的时钟信息,如下图所示:
FIGURE 13. The Clock Domain Data Dialog
Propagate_Clocks rule计算上述信息。此选项仅对出现在设计的时钟路径中的net起作用。
●Reset
选择此选项可以查看reset路径中出现的net的reset信息,如下图所示:
FIGURE 14. The Reset Domain Data Dialog
Propagate_Resets rule计算上述信息。在上图中,Type表示复位类型,Active值表示复位源的初始值。此选项仅对在设计的reset路径中出现的net起作用。
●Domain in data/control paths
选择此选项,可以在设计的数据或控制路径中查看net上的时钟域信息,如下图所示:
FIGURE 15. The Data/Control Path Domain Data Dialog
在上图中,Internal Domain Tag是指在执行时钟传播时计算的内部标记,而Quasi static是指具有准静态属性的路径。数据/控制路径可以有以下类型的时钟域:
●用户指定的时钟域: 这个类别包括主时钟、black box时钟和派生时钟。在这种情况下,SpyGlass会显示用户指定的时钟名称。
●合并时钟域: 如果一个门上汇聚了多个时钟,则在内部创建一个合并域。在这种情况下,SpyGlass会显示用户指定的时钟列表。
●虚拟时钟域: 如果一个虚拟时钟与一个块实例端口的主端口相关联,则SpyGlass将显示用户指定的虚拟时钟名。
●Quasi_static
选择此选项以检查net在数据或控制路径中是否是准静态的,如下图所示:
FIGURE 16. The quasi_static Debug Data Dialog
基于实例来过滤违例
在处理大型设计时,设计师会被分配特定的设计实例。在这种情况下,设计师需要关注特定实例中报告的违规情况。为了帮助设计人员快速定位特定实例上的违规,SpyGlass CDC提供了基于实例的过滤机制。在此机制中,设计人员可以基于实例筛选违规。
要基于实例过滤违规,请执行以下步骤:
1.在项目文件中指定以下命令:
set_option enable_module_based_reporting yes
2.从“视图”菜单中选择“树查看器”选项。下图展示了树查看器:
FIGURE 17. The tree viewer
确保在树查看器中选择了实例选项。
3.在instance视图中右键单击一个实例(如图17中的F3),并从快捷菜单中选择instance选项的Show Messages。
执行此步骤后,将根据F3实例过滤违规。如下图所示:
FIGURE 18. GUI view before filtering violations based on instances
注意:可以使用msg_inst_mod_report参数根据目标实例或根据公共模块过滤违规。
除了实例层次结构视图外,违例行为还可以在Msg树视图下进行过滤,如下图所示:
清理过滤器
要清除过滤器并恢复出现所有违例,即顶层设计的完整视图,右键单击消息树并从快捷菜单中选择clear Message filter选项,如下图所示:
FIGURE 20. Clearing the filter
保存信息
要保存违反消息,请右键单击“消息树”窗格并选择“保存消息列表”选项。
注意:在SpyGlass Explorer中,您可以为选择的层次结构保存消息。更多信息,见SpyGlass Explorer用户指南。
解决多种CDC共同的违例问题
在大量的SpyGlass CDC违例中,大多数是以下情况:
●不正确的设置
●可以安全忽略的明显问题
本节描述了以下很多违例行为常见的根本原因:
●Crossing发生或者结束于black box
●错误的Case Analysis设置
●源Flip-Flops产生静态信号
●噪声
在关注rule相关的问题之前,应该首先考虑解决上述问题。解决了上述问题并重新运行SpyGlass CDC之后,您应该会看到更小、更易于管理的问题集。
注意:处理CDC问题时,千万不要通过waving。如果你采用这种方法,就有可能掩盖一个真正的问题。
SpyGlass CDC分析依据如下:
●能够通过路径进行跟踪
●一定程度的功能性理解
在black box的上游和下游都无法实现上述目标。
要消除这个问题,特定的约束为SpyGlass CDC提供一个部分模型,如下所述:
●使用以下方法为black box的输入输出分配一个域:
●对black box输出使用abstract_port约束
●对black box输入使用signal_in_domain约束
●使用assume_path约束对从black box输入到输出建模为直通路径。
检查否正确地设置了set_case_analysis约束。
例如,你可能会看到错误的原因是,所有的功能模式和所有的测试模式都是同时激活的,而实际上这些模式中的许多模式永远不会同时激活。要把test相关的信号用set_case_analysis约束。
如果源触发器产生一个静态信号,可能不需要同步。比如说配置信号,这些信号通常在开机/启动时设置,然后不再更改。可以从芯片架构师获得关于哪些信号属于这种情况,并使用准静态约束quasi_static 来约束这些信号。
在SpyGlass CDC验证的主要挑战之一是管理大量的违规。你可以通过特定的设置和设置检查步骤来降低这些“噪声”的干扰。
CDC检查是SOC RTL freeze之前必须要做的检查,也是最重要的检查之一。CDC检查能够提前发现功能时序仿真中发现不了的跨时钟问题,极大的减少了芯片失败的风险。系统的学习SpyGlass CDC流程,深入的理解CDC的各种问题,熟练的使用SpyGlass工具是一个资深的SOC设计人员必须具备的。
文章主要参考SpyGlass官方文档,加入自己的总结和工程经验,希望能对看到本文的芯片设计人员有所帮助。这是SpyGlass CDC 流程深入理解的第二篇文章,还有后续,请关注知乎专栏《芯片设计进阶之路》
------------------------------------------
版权声明:
本文作者:烓围玮未
首发于知乎专栏:芯片设计进阶之路
转发无需授权,请保留这段声明。
------------------------------------------
本文转自知乎:
https://zhuanlan.zhihu.com/p/116888880
https://zhuanlan.zhihu.com/p/116891567
本文内容仅代表作者观点,不代表平台观点。
如有任何异议,欢迎联系我们。
如有侵权,请联系删除。
2021年的第一场雪!英特尔2020年Q4财报解读
Perl在IC设计中的应用
博文速递:Metal Layer Stack(Nomenclature)
EDA免费开源工具分享