利用SpyGlass工具快速检查RTL电路设计中的RDC(Reset Domain Crossing)问题

SNUG China 2018 2018 13 页

利用SpyGlass工具快速检查RTL电路设计中的RDC(Reset Domain Crossing)问题

会议: SNUG China 2018 作者: 杨国斌(华为技术有限公司,南京) 页数: 13 源文件: SNUG_CN_Crossing_利用SpyGlass 工具快速检查RTL_paper.pdf


摘要

随着集成电路的快速发展,RTL 寄存器传输级电路设计越来越复杂。在一个芯片设计中往往会存在多个时钟域和多个复位域。信号在不同的时钟域之间穿越即为大家熟知的跨时钟域 CDC(Clock Domain Crossing),由于信号在不同的时钟域之间穿越会存在信号采样亚稳态 Metastability问题,若不采取必要的措施,该问题对芯片是致命的,因此在RTL设计中,会通过多种方式解决该问题,而 SpyGlass CDC 工具可以快速有效的检查出RTL设计中存在的CDC问题。同样的,若异步复位域寄存器信号在复位时直接被另一个复位域的寄存器采样也会存在采样亚稳态 Metastability问题(即RDC Reset Domain Crossing),该问题对芯片同样是致命的,但是该问题并不被广泛认知,在RTL设计中同样需要必要的手段解决该问题,SpyGlass RDC 工具同样可以快速高效的找出RTL设计中的RDC问题。本文将从RDC问题和危害,SpyGlass RDC环境的搭建和工具使用、RDC问题实例分析和RDC问题解决办法详细说明SpyGlass RDC工具检查和RTL电路设计中的RDC问题。


目录 (Table of Contents)

1. RDC 简介 2. RDC 示例分析 2.1 不同时钟域不同复位域 2.2 同一时钟域不同复位域 3. RDC 环境搭建及使用说明 3.1 环境搭建 3.2 SGDC 文件说明 3.2.1 时钟约束 3.2.2 复位约束 3.2.3 接口信号时钟域约束 3.2.4 set_case_analysis 3.2.5 其他约束 4. 如何处理设计中的RDC问题 5. SpyGlass检查RTL RDC问题实例 5.1 异步复位寄存器到异步复位寄存器 5.2 异步复位寄存器到同步复位寄存器 6. 总结 7. 参考文献


图表目录

- 图1:异步时钟域穿越示例 - 图2:异步复位域穿越示例 - 图3:不同时钟域不同复位域示例 - 图4:相同时钟域不同复位域示例 - 图5:SpyGlass RDC 运行环境 - 图6:RDC Project 建立 - 图7:SGDC 约束文件 - 图8:RDC 问题处理方法 - 图9:RDC 问题实例1 - 图10:RDC 问题实例2


1. RDC 简介

随着集成电路的高速发展,芯片的集成度越来越高,芯片设计也越来越复杂。芯片设计中会存在多个时钟域来满足芯片低功耗的要求,数据在多个时钟域之间进行穿越即为目前所熟知的跨时钟域 CDC(Clock Domain Crossing);数据从源时钟域穿越到目的时钟域,如果不经过任何处理,目的时钟域将无法采集到正常的数据信号(0或者1),存在采集到亚稳态 Metastability的风险,而不定态在芯片设计中是非常致命的,可能导致整个芯片的失败。因此,在设计中会采用各种方式来解决时钟穿越的问题。

图1:异步时钟域穿越示例

目前的芯片设计中,会同时存在多个复位域。数据在不同的复位域间进行穿越即为复位域交叉 RDC(Reset Domain Crossing);若源复位域为异步复位,当源复位域复位时,数据将发生跳变,目的复位域进行采集时,有可能采集到不定态,从而导致目的复位域无法采集到有效的数据信号,从而导致不定态在目的复位域的扩散,导致芯片不可用。

图2:异步复位域穿越示例

2. RDC 示例分析

源端复位域为同步复位时,无论目的复位域为何种情况,都不会有复位域交叉 RDC问题,只需要检查有无跨时钟域 CDC问题即可。若源端复位域为异步复位时,无论目的复位域为何种情况,都需要做RDC检查。

2.1 不同时钟域不同复位域

数据在不同的时钟域不同复位域之间进行跨越,如图3所示:无论目的时钟域的寄存器采用什么复位方式,当源时钟域的寄存器异步复位生效时,如果在目的时钟域的时钟的上升沿发生,那么目的时钟域的寄存器由于无法采集到源时钟域的有效数据信号(因为该信号在1到0的跳变中),目的时钟域寄存器就有可能采集到亚稳态 Metastability,从而将亚稳态传递到下游,导致下游发生不可预期的错误。

图3:不同时钟域不同复位域示例

2.2 同一时钟域不同复位域

源寄存器和目的寄存器属于同一个时钟域,但是复位源且复位方式不同,那么当源寄存器发生复位时,目的寄存器就可能采集到亚稳态 Metastability,导致不可预知的错误。如图4所示,寄存器A和寄存器B复位源不同,且均为异步复位,当源寄存器复位在时钟的上升沿(变化过程中)时生效,那么目的寄存器就无法采集到稳定的电平信号0或1,导致目的寄存器采集到不定态。

图4:相同时钟域不同复位域示例

3. RDC 环境搭建及使用说明

由于复位域交叉 RDC问题在设计中广泛存在,靠个人可能无法完全识别到代码设计中的风险点。因此,需要采用有效的工具进行风险识别。SpyGlass RDC 工具支持识别代码设计中的RDC问题,环境搭建简单且效率高,能够有效的识别代码中的风险点。下面介绍SpyGlass RDC环境搭建和工具的使用。

3.1 环境搭建

图5:SpyGlass RDC 运行环境

如图5所示,SpyGlass RDC运行环境分为三步:第一步,输入目标文件包括RTL/网表、库文件、约束文件等;第二步,完成环境设置,设置检查方法和命令等;第三步,运行完RDC之后,需要检查输出的报告文件,完成waive文件的输出。

搭建RDC环境,主要是完成工程的搭建。创建一个project文件,然后运行RDC。Project文件如下:

图6:RDC Project 建立

关键命令说明: - read_file:读取文件命令,完成RTL或网表文件的添加,完成约束文件和lib文件的添加。 - set_option:环境设置选项命令,设置工程名和其他环境选项。 - current_methodology:设置当前使用的方法学。 - set_parameter enable_mulitflop_sync yes:该选项指示通过打拍可以消除复位域交叉 RDC风险,对于代码中直接采用寄存器打拍消除RDC的策略认为是合法的,不会上报RDC风险。

3.2 SGDC 文件说明

SpyGlass RDC 检查的输入文件中,需要完成约束文件的创建。

图7:SGDC 约束文件

约束文件主要分为五个部分: - 第一:定义当前的module名 - 第二:定义模块的所有输入时钟 - 第三:定义模块内用到的所有复位信号源 - 第四:罗列出所有接口信号所属时钟域 - 第五:对于特殊的输入信号,是否需要做常值输入处理

3.2.1 时钟约束

- -name(必须定义):时钟名称。顶层输入的时钟可以直接为时钟port/pin name或者full hierarchical name,对于模块内部产生的时钟,必须使用full hierarchical name。 - -period(可选):定义时钟周期,以ns为单位,支持小数。 - -edge(可选):定义时钟沿值,默认为1:1的占空比。 - -domain(可选):定义的时钟域名称。如果不声明,则时钟域的名称和时钟名一致。

3.2.2 复位约束

- -name(必须定义):reset port/pin 名称。顶层输入的reset可以直接为reset port/pin name或者full hierarchical name,对于模块内部的reset定义,必须使用full hierarchical name。 - -async-sync(可选):指定为同步复位或者异步复位 Asynchronous Reset,默认为异步复位。对于部分CDC的rules,比如Reset_check03、reset_check04专门针对的是同步复位设置的rules。 - -value(可选):把reset值指定为0/1。若该值指定为0,则reset为低有效,否则为高有效。默认为高有效。 - -soft(可选):软复位定义,否则默认为硬复位。

注意:RDC只关注异步复位源,若设计中只有同步复位,则无需做该项检查。这里需要列出所有的同步复位和异步复位信号。

3.2.3 接口信号时钟域约束

需要罗列出所有接口信号,注明所属时钟域。

3.2.4 set_case_analysis

- -name(必须定义):定义名称,指定到port/pin name或者full hierarchical name的net/pin。 - -value(必须定义):Pin的值。可以为0、1、X、Z。方式灵活。

3.2.5 其他约束

常用命令1:

reset_filter_path -from_rst reset_name_0 -type rdc
命令说明:过滤掉复位为reset_name_0的所有路径的RDC检查。

示例:

reset_filter_path -from_rst i_rst_n -type rdc

常用命令2:

reset_filter_path -from_rst reset_name_0 -to_rst reset_name_1 -type rdc
命令说明:过滤掉reset_name_0异步复位域到reset_name_1异步复位域的所有路径的RDC检查。

示例:

reset_filter_path -from_rst "demo_top.i_rsta_n" -to_rst "demo.i_rstb_n" -type rdc

常用命令3:

reset_filter_path -from_obj 起点 -to_obj 终点 -type rdc
命令说明:过滤掉起点到终点整条路径的RDC检查。

示例:

reset_filter_path -from_obj "demo_top.U_A_FIFO.*" -to_obj "demo_top.U_B_FIFO.*" -type rdc

4. 如何处理设计中的RDC问题

复位域交叉 RDC如果处理不得当,源复位域的寄存器发生异步复位时,可能会导致目的寄存器采集到不定态,从而导致不定态在下游的扩散,产生不可预期的结果。因此,必须采取可靠的手段解决RDC问题。下面列举两个常用的解决方法。

方法一:通过寄存器打拍解决RDC问题

在处理跨时钟域 CDC问题时,对于单bit信号,通常会采用寄存器打拍的方式最大限度的消除采集到亚稳态 Metastability的概率,这些寄存器中间不允许任何逻辑,只能纯打拍。同时芯片后端也会将这些寄存器靠近摆放。对于不同的时钟频率,打拍的数量是不同的。

同样的,对于同一个时钟域的数据(包括多bit信号),可以通过直接打拍的方式最大限度的消除源复位域寄存器发生异步复位时目的寄存器采集到不定态的概率,寄存器摆放和打拍数目都需要满足上述的要求。

如果为不同时钟域且不同复位域,则首先解决CDC问题,然后再检查是否需要解决RDC问题。

方法二:通过流程控制解决RDC问题

RDC问题存在于源寄存器发生复位的那一刻,因此可以通过在复位之前截断源复位域到目的复位域所有数据的通道,提前消除源端寄存器复位时寄存器信号跳变对目的寄存器的影响。如图8所示,在源寄存器复位前,先将sel设置为1,从而目的寄存器采集到稳定的数值0(低电平),然后复位源寄存器。

图8:RDC问题处理方法

5. SpyGlass检查RTL RDC问题实例

通过SpyGlass可以快速检查代码中的RDC问题,提升代码质量。以下两个实例为在实际操作中使用SpyGlass工具发现的复位域交叉 RDC问题的示例。这些问题在设计中是比较难发现的。

5.1 异步复位寄存器到异步复位寄存器

如图9所示,r_ttof_undflw 为根据FIFO送出的empty信号和外部读信号产生的读下溢中断寄存器。由于FIFO的读时钟为i_demo_tx_clk,而 r_ttof_undflw 误使用了FIFO的写时钟i_demo_rx_clk,FIFO的复位源为rsta_nrstb_n,而 r_ttof_undflw 使用的为rsta_n。当rstb_n独立复位时,r_ttof_undflw 寄存器有可能会采到FIFO输出的不定态。因此,该寄存器需要使用FIFO的读侧复位信号进行处理,从而和FIFO内部保持一致。

图9:RDC问题实例1

修改措施: 1. r_ttof_undflw 寄存器时钟采用i_demo_tx_clk(FIFO读侧时钟) 2. r_ttof_undflw 寄存器复位信号采用经过处理的送给FIFO的读侧复位信号

5.2 异步复位寄存器到同步复位寄存器

如图10所示:异步FIFO Asynchronous FIFO(FIFO读侧和写侧时钟域不同)的overflow信号没有经过任何处理直接送给目的模块,当FIFO独立复位时,目的模块(复位域为同步复位)会采集到overflow信号的亚稳态 Metastability,导致目的模块发生不可预期的错误。

图10:RDC问题实例2

修改措施: overflow信号需要通过寄存器打拍再送给目的模块。

6. 总结

在芯片设计中,跨时钟域 CDC问题广泛被熟知,而且解决方案越来越成熟。但是复位域交叉 RDC问题在设计中却没有得到足够的重视,而且RDC问题同样可以严重到影响芯片的正常使用。因此,必须通过有效的工具识别出代码设计中存在RDC问题的风险点,并通过有效的方式解决。SpyGlass RDC 工具可以有效的识别代码设计中的RDC问题,有效的帮助设计人员检查设计代码RDC风险,提升芯片的可靠性。

7. 参考文献

[1] $SPYGLASS_HOME/doc/methodology_guides/SpyGlass_CDCMethodology_GuideWare2.0_UserGuide.pdf
[2] $SPYGLASS_HOME/doc/policy_guides/SpyGlass_ClockResetRules_Reference


图片索引

本文共 9 张图片,存放于 _images/ 目录。

第3页:图1——异步时钟域穿越示例 第4页:图2——异步复位域穿越示例 第5页:图3——不同时钟域不同复位域示例 第6页:图4——相同时钟域不同复位域示例 第7页:图5——SpyGlass RDC运行环境,图6——RDC Project建立 第8页:图7——SGDC约束文件 第11页:图8——RDC问题处理方法 第12页:图9——RDC问题实例1 第13页:图10——RDC问题实例2