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问题. 它能够:
管理是多时钟域设计系统地处理CDC问题检查和报告任何不同步的信号: 时钟和复位
SpyGlass CDC与静态时序分析相比:
STA对async interface不太好使,只适合sync模块分析CDC paths 总是需要设置成false paths一般在design的后期在netlist level做才有意义
SpyGlass CDC与功能仿真相比:
黑盒测试很难穷举(exhaust)白盒测试需要assertions需要覆盖CDC的所有test branches很难幸运的覆盖所有,一般只能发现部分问题一般在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的功能模型总结如下图:
3.1 设置阶段(setup stage)
在设计的设置阶段你可以:
添加设计文件、SGDC文件、预编译文件和技术文件。指定影响SpyGlass运行的各种设计读取选项。例如,你可以在设计中指定顶层模块、更改语言、指定宏等等。。运行design-read流程来执行第一级的HDL分析。在进入下一阶段之前,必须解决此阶段报告的致命错误(FATAL)。
Spyglass 可以运行在BATCH 或者 GUI 模式。通常模式下是在batch模式下执行分析,在GUI模式下进行debug。
3.1.1 工程(Project)文件
采用BATCH模式,这些设置都会添加到工程(Project)文件中,Project一般定义了以下内容:
下面是一个Project文件 training.prj的列子:
需要读入的文件及命令如下:
3.1.2 约束(SGDC)文件
SDC文件可以直接被SpyGlass读取,自动转换成SGDC,需要设置以下内容完成sdc2sgdc的转换:
set_option sdc2sgdc yes
sdc_data –file “test.sdc”
下面是一个SGDC文件的例子
3.2目标(Goal)设定和运行阶段
在此阶段,你将选择并运行目标。目标是规则的集合。
你可以选择规则,也可以指定规则执行的顺序。
在SpyGlass CDC分析期间,你可以在不同的阶段运行不同的SpyGlass CDC目标。在每个阶段中,修复所报告的违例并转移到下一个阶段。使用这种分步骤的方法可以帮助你了解一些需要考虑的CDC问题。
如果不遵循这个分步骤的方法,你可能会看到大量违反CDC的情况,其中大多数是由于不正确的设置或没有修复前几个阶段的违例引起的。
SpyGlass CDC 的目标和规则如下图所示
3.3 SpyGlass CDC 分析流程
SpyGlass CDC分析可以分为以下几个阶段:
创建SpyGlass CDC设置修复时钟和复位完整性问题执行CDC验证调试CDC问题
在执行SpyGlass CDC 分析之前,请检查必要的先决条件。
进行SpyGlass CDC分析的先决条件如下:
成功运行design-read流程确保设计包含最少数量的非预期的black box在设计中为实例化的技术库单元提供相应的技术库(.lib)在设计中指定有关时钟的信息,以及复位信息(如果可能的话)
建议在开始运行SpyGlass CDC之前,从设计规范、IPs或芯片引线收集这些信息。如果你没有这些信息,SpyGlass CDC也能够提供自动检测时钟和复位,但是会推断出额外的时钟和复位,最好是能够预先明确所有的时钟和复位信息。
创建设置意味着在执行CDC验证之前指定设计信息,例如时钟、重置和停止模块。设置的质量决定了SpyGlass CDC分析的质量。错误或不完整的设置可能会导致许多违例或掩盖一个真正的设计错误。
可以通过以下流程建立SpyGlass CDC设置:
将时钟生成模块指定为black box为设计指定时钟和复位为设计生成时钟和复位使用设置管理器
4.1 将时钟生成模块指定为black box
对时钟生成模块(比如PLL)的内部执行SpyGlass CDC分析非常复杂,而且对整体SpyGlass CDC分析几乎没有价值。
将这些块标记为黑盒子,除非你有详细的SGDC约束来定义这些模块的时钟特性。
标记PLL时钟生成模块为black boxes的方法是,在project file中设置如下命令:
set_option stop
一旦你设置这些模块为black boxes:
将时钟约束定义在这些模块的输出pin上将输出时钟和输入定义为同一个时钟域,除非两者之间没有相位关系
如下面的列子所示:
FIGURE 1. Defining Clock Outputs as in the Same Domain
4.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;
4.3为设计生成时钟和复位
如果不知道设计中的时钟和复位,可以执行以下步骤来生成:
这个步骤产生了autoclocks.sgdc和autoresets.sgdc两个SGDC文件,包含了推断的时钟和复位。
这些文件可能包括一些除了真正的时钟和复位的控制信号。因此,你必须检查这些文件中的每个推断的时钟和复位,并删除不是真正的时钟和复位信号。
建议您查看Setup_clock01和Reset_info01规则信息,以查看这样的推断信号。
4.3.1 在生成的SGDC 文件中修改时钟域
默认情况下,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
这样,所有clk1和clk3或者clk2和clk3之间的信号都认为是跨时钟域了,但是clk1和clk2之间不认为是跨时钟域,不会报出来,因为clk1和clk2是同一个时钟域。
选项 –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检查是SOC RTL freeze之前必须要做的检查,也是最重要的检查之一。CDC检查能够提前发现功能时序仿真中发现不了的跨时钟问题,极大的减少了芯片失败的风险。系统的学习SpyGlass CDC流程,深入的理解CDC的各种问题,熟练的使用SpyGlass工具是一个资深的SOC设计人员必须具备的。
文章主要参考SpyGlass官方文档,加入自己的总结和工程经验,希望能对看到本文的芯片设计人员有所帮助。这是SpyGlass CDC 流程深入理解的第一篇文章,还有后续,请关注知乎专栏《芯片设计进阶之路》
版权声明:
本文作者: 烓围玮未
首发于知乎专栏:芯片设计进阶之路
转发无需授权,请保留这段声明。