精华内容
下载资源
问答
  • 用于spyglass教程的基础源码,配合博客使用。这是一个基于ahb总线的usb 通讯的RTL源码,可以对接到soc中,有兴趣的可以自己下载了去研究,在这里只是用于spyglass的基础使用教学
  • spyglass lint rule
  • Spyglass入门必看,包含spyglass的安装教程,证书设置以及入门学习,包含五个小实验与实例RTL代码,可以学习Spyglass的基础用法以及lint检查功能。
  • spyglass 流程脚本, 本脚本仅应用与 lint 检查, sdc 检查。 楼主认为,spyglass的使用 还是最后呼叫gui, 来分析问题比较直观。 如有问题请大胆提出来
  • spyglass 使用讲解

    2018-04-09 13:38:36
    用于IC开发设计中,进行spyglas对硬件代码检查错误,包含cdc和lint错误,特别是cdc跨时钟的语法检测,极为有用
  • 网上唯一一篇介绍Spyglass 图形界面非常详细的使用使用方法的资料.
  • Spyglass是用于户外和越野导航的必不可少的离线GPS应用程序。 随附工具,可作为双筒望远镜,平视显示器,带有离线地图的高科技指南针,陀螺罗盘,GPS接收器,航路点跟踪器,速度计,高度计,太阳,月亮和北极星寻星...
  • spyglass_labs.rar

    2021-08-20 17:10:11
    spyglass的实验练习,包含实验代码和对应文档说明
  • spyGLass-开源

    2021-05-09 08:02:37
    spyGLass是OpenGL调用跟踪器和调试器。 它比仅使用ltrace更进一步,因为它知道各种gl *调用的参数是什么,并且还知道OpenGL的错误标志。
  • spyglass视频教程

    2021-01-13 11:10:44
    spyglass视频教程
  • 本论文通过分析CDC传输中的亚稳态机理,总结了各种同步设计的优劣以及传统验证方法在CDC检查中的弊端,提出并搭建了一套基于SpyGlass的CDC静态验证流程
  • spyglass2-源码

    2021-03-27 22:32:56
    spyglass2
  • spyglass使用教程

    万次阅读 多人点赞 2020-11-11 20:22:50
    SPYGLASS初步使用教程 文字目录SPYGLASS初步使用教程1.整体实验文件预览1.1 RTL框图1.2 实验目录结构2.实验一2.1 读取设计文件2.2 设置顶层模块2.3 编译设计,得到结果2.4 静态分析2.5 实验一总结3.实验二4.实验三5....

    SPYGLASS初步使用教程


    ​ SPYGLASS是很高效的RTL分析和CDC检查工具,可以有效的帮助规避设计中的难以察觉的问题,帮助设计人员提高设计质量。本文的目的在于给刚刚接触的人提供一个基础实践指导,根据既有的流程来认识这个软件。

    ​ 本文由4个基础实验构成,详细介绍了SPYGLASS在不同阶段的运行说明,学会这几个基础实验的操作是使用别的SPYGLASS分析的基础。同时几个实验也需要按顺序操作,每个实验是下一个实验的基础。实验源码在文字隐含链接中,直接点击即可下载。

    (本实验是基于snopsys教程的翻译,是为了各位可以快速对spyglass有了解,文中的相关操作自己已经动手完成验证。本来有5个,但最后一个个人认为没啥用,就不在这里加入。)

    1.整体实验文件预览

    1.1 RTL框图

    ​ 下图为实验中使用的rtl源码的设计框图。该设计包括一个终端为一个USB控制器和音频解码器核心(IMA_ADPCM),两者通过Wishbone总线连接到叉骨连接矩阵(WB_Conmax),该矩阵又使用一个WB2AHB桥连接到AHB总线。该设计为混合型RTL设计,包括verilog和vhdl两种编程语言。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3PADEsyx-1605094790058)(F:\VM_SHARE\synglass\RTL框架.jpg)]

    1.2 实验目录结构

    ​ 实验目录包括:rtl(用于存放代码),spyglass(用于存放中间文件和工程文件),doc(用于存放自己添加的说明文件)。图示如下:

    文件目录结构
    RTL
    用于存放工程代码
    SPYGLASS
    用于工程文件和中间文件
    DOC
    存放说明文件

    2.实验一

    ​ 本实验目的在于知道如何使用gui来进行读取文件和进行结果分析。

    2.1 读取设计文件

    ​ 本实验中,创建完整目录结构后,首先切换到工作目录下,然后打开软件:

    % cd spyglass
    % spyglass &
    

    ​ 此时可以看到如下界面:
    在这里插入图片描述
    ​ 然后点击Add File(s), 此时会打开添加文件窗口。左侧窗口用来切换目录和选择文件,右侧显示已经选择的文件。左侧选择文件后点击中间的Add即可完成文件的添加,点击OK退出当前窗口。

    ​ 本实验中需要读取的文件为:

     ../rtl/ahb2wb.v
     ../rtl/wb_subsystem.v
    

    2.2 设置顶层模块

    ​ 添加完文件后点击Set Options,然后选择列表中选择Top Level Design Unit,Value值为顶层模块名(此处顶层模块为wb_subsystem),如下图所示:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZUibMxUV-1605094790061)(F:\VM_SHARE\synglass\3.jpg)]

    2.3 编译设计,得到结果

    ​ 点击Read Design,再在左侧点击Run Design Read开始进行设计文件编译和分析,在读取完成后会在下方窗口列出问题。如下图所示:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2VRfHIrh-1605094790063)(F:\VM_SHARE\synglass\4.jpg)]

    ​ 其中三个问题类型都为ErrorAnalyzeB Box,这是因为有的模块文件没有添加,SPYGLASS找不到,后面SPYGLASS会将其作为黑盒子处理。

    ​ 左侧instance下文件不同颜色标识意义为:绿色表示该模块可进行分析,但不可进行综合;黑色表示该模块作为黑盒子存在;白色表示该模块可综合。需要注意,只是读取设计并不会完成综合,因此也不会创建相关的原理图。因此,为了使用spyglass,首先应该解决黑盒子问题,为此需要选择复选框Synthesize Netlist然后重新运行Design Read

    2.4 静态分析

    ​ 下面列出使用spyglass来进行linting分析的步骤。注意使用spyglass进行分析不要求完整的工程文件。

    ​ 首先选择Linting RTL分析。在窗口上方中间点击Goal Setup ,然后在主窗口区勾选Lint_rtl(在lint中点击+即可见),如下图。虽然可以一次选择多个目标设置,但分析过程是顺序执行的,只要前面的检查通过了才会进行后面的检查。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p1h1UWjF-1605094790065)(F:\VM_SHARE\synglass\5.jpg)]

    ​ 然后点击Run Goal(s) ,当运行完成,会自动弹出Analyze Result窗口。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OTd8jhQ0-1605094790067)(F:\VM_SHARE\synglass\6.jpg)]

    ​ 得到分析结果后,首先查看Lint分析结果。首先展开lint/lint_rtl文件夹消息。错误信息以红色显示,警告以橙色显示,信息以绿色显示。选择并展开inferLatch Error文件夹。双击第一条违规消息。此时与错误相关的代码会在RTL代码窗口中显示出来,如下所示。

    ​	[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TksxEPBP-1605094790068)(F:\VM_SHARE\synglass\7.jpg)]

    ​ 此时来对该问题进行分析。有消息可知,由于设计问题生成了非期待的锁存器。可以看到违规消息左侧有一个在这里插入图片描述,这个意思是该违规消息包含一些原理图方面信息。通过点击[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tTUMuad6-1605094790070)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20201110201514066.png)]可以打开相关的逻辑示意图:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IECiTuUS-1605094790071)(F:\VM_SHARE\synglass\8.jpg)]

    ​ 在本次例子中,是因为hready信号在没有elseif语句中被赋值。如果这些Latch是故意的,那通过屏蔽对该处的规则检查即可。如果需要修改代码,可以在代码窗口中点击有问题的代码行,使得光标落于该行,然后点击e即可将打开默认的编辑器进行代码编辑。编辑完后要重新运行Goal

    2.5 实验一总结

    ​ 关闭窗口之前应该先保存。可以用编辑器打开工程文件wb_subsystem.prj,因为顶层文件为wb_subsystem.v,所以工程文件名为wb_subsystem。打开的文件如下:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ydiOWfC8-1605094790071)(F:\VM_SHARE\synglass\9.jpg)]

    • read_file命令定义了在SpyGlass运行期间要读取的各种类型的文件;

    • language_mode选项用于指定当前SpyGlass运行的操作语言。默认值为mixed(将处理Verilog、VHDL和混合语言设计);

    • projectwdir选项用于指定项目工作目录;

    • GuideWare/latest是默认的规则设置,它在项目文件中被定义为active _ methodology

      ​ 从文件结构可以看出,这是基于TCL的文件操作。通过添加语句和选项,再运行该TCL脚本即可进行相关分析。第二个实验的目的就在于此。

      3.实验二

      ​ 本练习将涵盖将设计读入SpyGlass的各个方面,并将建立在前一个实验的基础上。在本实验中,我们将使用–batch选项在批处理模式下运行SpyGlass。同样的操作也可以在GUI模式下完成。

      ​ 1.通过下面的指令来运行SpyGlass工程:

      %spyglass -project wb_subsystem.prj -designread -batch

      ​ 在本实验的工程中,终端显示如下:

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n1Wro2V5-1605094790072)(F:\VM_SHARE\synglass\10.jpg)]

      ​ 提示有三个黑盒错误。

      ​ SpyGlass会生成比较多的报告,其中常用的报告为:

      ./wb_subsystem/wb_subsystem/Design_Read/spyglass_reports/moresimple.rpt

      ​ 其内容如下:

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IhmArmJN-1605094790073)(F:\VM_SHARE\synglass\11.jpg)]

      moresimple.rpt中的消息按严重性、规则名、文件名和行号的顺序排序。此报告提供了足够的信息来识别源文件中的违规。

      ​ 2.在.prj中可以通过源文件列表的形式来读取源文件。本实验中在##Data Import Section下添加如下语句:

    read_file -type sourcelist …/rtl/usb/file.list
    read_fiel -type sourcelist …/rtl/wb_conmax/file.list

    ​ 将下面命令的选项改为yes:(在**##Common Options Section**下)

    set_option designread_enable_synthesis yes

    ​ 将文件保存后重新运行Design Read

    ​ 通过上面的文件添加和设置消除了之前的黑盒问题,但因为新的文件加载也引入新的黑盒问题,如下所示:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q0RKrD3B-1605094790073)(F:\VM_SHARE\synglass\12.jpg)]

    ​ 它们看起来是被实例化的标准单元,但不知何故,它们的定义没有被提供。这些单元格很可能是使用-y/-v选项传递的,所以让我们浏览一下“usb”中的目录,看看是否有任何丢失的库文件。可以看到usb_lib目录存在于“usb”目录中,但是没有-y被指定为file.list的一部分。

    ​ 3.通过下列的语句来读取缺失的部分:

    	> set_option y { ../rtl/usb/usb_lib }
    	> set_option libext { .v }
    

    ​ 将文件保存后重新运行Design Read来检查是否解决了USB黑盒问题。结果如下:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uWUVFQTq-1605094790074)(F:\VM_SHARE\synglass\13.jpg)]

    moresimple.rpt报告内容如下:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dFZ2snbZ-1605094790075)(F:\VM_SHARE\synglass\14.jpg)]

    ​ 可以看到剩下的一个黑盒错误来自块“IMA_ADPCM_top”。这部分采用VHDL设计,出现黑盒问题原因是其设计文件尚未包含在.prj文件。

    ​ 4.预编译库来解决IMA_ADPCM_top黑盒问题。

    ​ 要预编译一个HDL库,您必须指定要在逻辑库中预编译的文件列表,以及逻辑库名称和物理目录之间的映射。这是使用lib_hdlfiles(定义要编译到命名库的文件)和lib(将命名库映射到物理目录)选项完成的(添加到**.prj文件的##Data Import Section**部分):

    set_option libhdlf ima_adpcm_lib "vhd_file.list"
    set_option lib ima_adpcm_lib ./ima_adpcm_lib
    

    ​ 其中vhd_file.list内容为需要编译的VHDL文件的路径列表。接下来删除包含上次运行保存的网表的结果目录,然后重新运行设计验证是否解决了黑盒问题:

    %rm -rf wb_subsystem
    %spyglass -project wb_subsystem.prj -designread -batch

    ​ 运行结果如下:

    ​		[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xyzbWItA-1605094790076)(F:\VM_SHARE\synglass\15.jpg)]

    ​ 通过第二次的实验我们解决了全部黑盒问题。

    4.实验三

    ​ 本实验在实验二的基础上进行目标设置和结果检查。

    ​ 可以通过下面命令来获取可用的Goal列表:

    % spyglass –project wb_subsystem.prj -showgoals

    ​ 获取结果如下:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zlghYGeb-1605094790076)(F:\VM_SHARE\synglass\16.jpg)]

    ​ 其中Run Status显示目标是否运行,如果运行会有生成了多少错误、警告和信息消息。注意有的Goal的运行要求使用额外的SpyGlass组件。如果使用SpyGlass v2016.06或更高版本,需要为lint/lint_rtl目标启用checkfullbus参数(以使lint结果与本实验最初为v5.6.0创建的结果相匹配)。为此,请在wb_subsystem.prj文件的末尾添加以下内容:

    current_goal lint/lint_rtl

    set_parameter checkfullbus no

    ​ 设置完成后使用如下命令来运行**“lint/lint_rtl”**分析:

    % spyglass -project wb_subsystem.prj -goals lint/lint_rtl -batch

    ​ 运行完成后在终端中查看结果如下:
    在这里插入图片描述

    在文件./wb_subsystem/wb_subsystem/lint/lint_rtl/spyglass_reports/moresimple.rpt中查看更为详细的报告:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-axEYF7yy-1605094790078)(F:\VM_SHARE\synglass\18.jpg)]

    ​ 至此,通过该实验知道了如何运行Goal及如何查看报告信息。

    5.实验四

    ​ 在本练习中,我们将分析lint目标运行期间产生的违规。我们可以在SpyGlass GUI中使用各种调试工具来理解违规,在RTL代码中调试其根本原因,并查看如何在SpyGlass环境本身中修复这些违规。对于本实验,每次更改RTL或者.prj文件都需要重新运行目标以验证结果。实验流程按照Analyze Result选项卡中Run Goal框中显示的顺序进行。

    ​ 通过下面命令进入GUI界面:

    % spyglass –project wb_subsystem.prj &

    ​ 在没有**-batch时候,SpyGlass默认打开GUI界面。之前设置的current_goal会自动加载执行。同时在运行Goal**同时会生成多个报告,不同报告提供不同信息,可在ReportMore Report下查看。

    ​ 在GUI底部的Violations可查看违规信息。在显示出违规信息后,点击违规信息窗口顶部的Group By,然后选择Goal by Rule。此字段确定批处理运行中的违规在消息树中的排序方式。本实验中违规信息显示如下:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Cv88JC1V-1605094790079)(F:\VM_SHARE\synglass\19.jpg)]

    5.1 W415错误

    ​ 从消息窗口中可以看到违反规则W415的情况。该规则确定了在设计中可以由两个或更多非三态驱动器同时驱动的网络。展开后可以看到违规细节为:WB_master_data_o[31:0]在设计wb_subsystem的顶层中有多个同时非稳态驱动程序。接下来对该问题进行调试分析。

    ​ 双击违规细节信息,违规信息将变成粗体,同时代码窗口将会跳转到有问题的代码行且高亮显示。如下图所示: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wodDnOpu-1605094790079)(F:\VM_SHARE\synglass\20.jpg)]

    ​ 可以通过原理图获取更多违规细节。违规消息前面的[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yJtRYcyO-1605094790080)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20201111112831144.png)]
    指示该违规消息包含一些逻辑示意图数据方面的信息,单击[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ePEvgQeA-1605094790081)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20201111112956417.png)]
    打开原理图窗口,增量示意图窗口显示违规的结构:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U8Cy9tgn-1605094790081)(F:\VM_SHARE\synglass\21.jpg)]

    ​ 主窗口显示结构的细节,问题网用红色显示。模块边界以虚线显示,模块名称在底部,实例名称在每个模块边界的顶部。左侧底部窗口提供了带有红色缩放区域的逻辑示意图的整体视图–可以通过拖动红色区域的边缘/角落以及使用逻辑示意图边缘的滑动条来更改缩放比例。

    ​ 可以看到两个驱动程序正在驱动报告的信号(WB_master_data_o[0]) 端口“m0_data_i”由端口“dat_o”(实例ahb2wb_u0)和“m0_data_o”(实例conmax_u1)同时驱动。因此,这是一个有效的违反。

    ​ 通过将鼠标放在原理图对象(端口、网络、门、模块)上,然后右键》Cross Probe,实现从原理图到RTL的交叉探测。

    ​ 通过查看RTL代码我们知道该部分使用ifdef构造来启用固定代码。让我们通过在wb_subsystem.prj的# #Common Option Section中添加以下内容来启用宏,从而启用Fix_W415宏:

    set_option define { Fix_W415 }

    ​ 设置后重新加载项目文件和重新运行Goal:File -> Reload Project -> Analyze Results -> Run Goal。在高版本中重新加载工程文件会自动完成。在本实验中此时不会有W415的错误。

    5.2 SYNTH_5159警告

    ​ 展开警告消息可以看到由内置规则SYNTH_5159报告的消息。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fhd95PO6-1605094790082)(F:\VM_SHARE\synglass\22.jpg)]

    ​ 规则SYNTH_5159识别可能不能综合的RTL结构。双击SYNTH_5159规则的消息,它将突出显示RTL中的错误。该语句包含在“synthesis”编译指令中,表示该语句不用于分析,但默认情况下,SpyGlass仅将“synopsys”和“pragma”注释识别为pragma(编译指令)。我们需要通过在项目文件中添加以下内容来启用“synthesis”的pragma处理:

    set_option pragma { synopsys pragam synthesis}

    ​ 所有设置都可以通过GUI中Design SetupSet Options设置。

    ​ 由于此错误发生在ima_adpcm_lib预编译库中,SpyGlass会检查该库的RTL是否已更改,只有在更改后才会重新编译,因此我们需要使用下面的指令删除现有的预编译库,以便使用新的pragma设置重新编译该库。手动删除ima_adpcm_lib的另一种方法是在.prj文件中临时添加“set_option force_compile yes”以强制重新编译库。

    % rm -rf ima_adpcm_lib

    ​ 保存修改后的项目文件后,将在图形用户界面中重新加载。删除预编译库后,重新运行目标(单击“Analyze Results”选项卡中的“Run Goal”),并验证SYNTH_5159违例是否消失。

    5.3 UndrivenInTerm-ML错误

    ​ 展开lint/lint_rtl报告消息,可以看到两个违反UndrivenInTerm-ML的错误消息。该规则识别浮动网(没有驱动程序但加载了)。该消息表明,实例“conmax_u1”的输入端口“m0_addr_i”的上半部分(31:16)范围是浮动的:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gVdO2cXb-1605094790082)(F:\VM_SHARE\synglass\23.jpg)]
    ​ 来对该错误进行具体分析:

    ​ (1)双击违规信息,它将高亮RTL代码中的第128行。高亮的行显示了端口“m0_addr_i”的端口映射,该端口映射带有地址信号“WB_master_addr”;
    ​ (2)在RTL窗口中选中通过双击选中WB_master_addr信号,然后右键》Signal:WB_master_addr[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8zXQZjM7-1605094790083)(F:\VM_SHARE\synglass\24.jpg)]

    ​ 折叠菜单显示声明、加载和驱动程序的多个超链接(蓝色)。点击蓝色字体,可以看到信号WB_master_addr的宽度为32位,与映射的实际端口m0_addr_i的宽度相同,即端口完全与位宽的信号总线相连,不是问题所在。接下来检查WB_master_addr的驱动器。

    ​ (3) View -> Windows -> HDL Navigator,可以看到被选中信号WB_master_addr的驱动和负载相关信息。可以注意到有一个驱动报告的信息:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NQEhfsFb-1605094790083)(F:\VM_SHARE\synglass\25.jpg)]

    ​ 驱动程序是实例“ahb2wb_u0”的o/p端口“adr_0”,但这仅驱动矢量号“WB_master_addr”的下半位(15:0),而其余位没有报告其他驱动程序,以确认上半位没有驱动程序。解决这一问题的方法是通过拼接算符将前16位与逻辑0绑定,并对RTL进行更新。

    ​ 我们可以看到RTL中有通过拼接进行的驱动程序,但通过ifdef结构进行控制。因此可以通过设置Fix _ UndrivenInTerm宏来调用目标程序,像之前对W415所做的那样:

    set_option define { Fix_UndrivenInTerm }

    ​ 在.prj文件中添加上面的语句并保存。在重新加载工程文件后在Analyze Results点击Run Goal,然后查看报告以验证是否该错误得到结局。

    5.4 Waiving 违规

    ​ 在lint/lint_rtl报告中,还剩下3条错误严重性消息,是可能产生的非预期锁存结构。

    ​ 展开规则文件夹,查看从信号hready推断的可能存在的锁存结构。使用RTL交叉探测,您可以看到信号hready在没有其他部分的if语句中被赋值。

    假设这些锁存是有意的,那会希望下次检查时候可以跳过对这些锁存的检查,可以通过定义waivers来放弃对这些锁存的检查:鼠标在hready违规信息上》右键Waive Selected Messages…

    ​ 这将打开waivers编辑器窗口,并为其填充相关信息(违规消息、规则和设计单位(DU)):

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LMGdsILb-1605094790084)(F:\VM_SHARE\synglass\26.jpg)]
    ​ 放弃检查声明以蓝色突出显示(2016.06+版本为绿色)-每个字段都可以在窗口的下半部分进行编辑。可以在Comments字段中添加放弃的原因。做出任何更改后,单击Apply。现在可以看到只显示了两个冲突。

    ​ 在界面底部选择Waiver Tree可以查看已经被过过滤掉的错误选项。如果没有可以通过View -> Windows -> Waiver Tree打开。

    ​ 可以将Waiver设置保存为文件然后重复使用:在waivers编辑器窗口中右键点击左侧面板中文件,然后选择Save Waiver Files

    ​ SpyGlass会为每个Goal保存一个关于检查过滤的文件,本例中文件路径为:

    ./wb_subsystem/wb_subsystem/lint/lint_rtl/wb_subsystem_waiver_file.awl

    ​ 我们可以将其复制到当前工作目录下,方便调用:

    cp ./wb_subsystem/wb_subsystem/lint/lint_rtl/wb_subsystem_waiver_file.awl ./wb_subsystem.awl

    ​ 然后将该过滤文件包含到工程中并将其设置为默认waiver 文件:

    read_file -type awl ./wb_subsystem.awl
    set_option default_waiver_file ./wb_subsystem.awl

    ​ 然后重新加载工程文件且运行Goal

    6.生成结果报表

    ​ 报表内容为运行的Goal的分析结果。有的功能需要使用SpyGlass的组件完成,如果具有相应的License则会将相应的运行结果包含在报表中。报表包括datasheetdashboard

    ​ 在GUI界面下打开shell命令窗口,输入如下命令生成报表:

    sg_shell> write_aggregate_report datasheet

    sg_shell> write_aggregate_report dashboard

    ​ 数据表和仪表板报告提供了在移交的设计中看到的结果的摘要。

    ​ 通过在终端中输入下面命令可以在浏览器中查看报告

    firefox wb_subsystem/html_reports/dashboard.html
    firefox wb_subsystem/html_reports/datasheet.html

    ​ 下面两张图为报表示例:

    DashBoard:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TOsFGGO8-1605094790085)(F:\VM_SHARE\synglass\27.jpg)]

    DataBoard:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jIqHjnB8-1605094790085)(F:\VM_SHARE\synglass\28.jpg)]

    最终结束语

    ​ 本人研二在读,因为热爱,所以不知疲倦。这是自己学习中做的总结,也为了给需要的人分享,所以写了这篇文档。这是自己写的第一篇文档,有不足欢迎交流指正。QQ:2562074834

    展开全文
  • $ git clone https://github.com/SPYGlassMC/SPYGlass.git --recursive 要么$ git clone https://github.com/SPYGlassMC/SPYGlass.git && git submodule update --init ` ) $ npm run init 如果您使用VS Code开发...
  • VC Spyglass使用一系列attribute命令,可读性更好。 Spyglass使用abstract_port和assume_path。 Description Note: This document is not writing a SAM (Static Abstract Model). A SAM is an auto-generated, ...

    CDC check中,在使用blackbox或者abstarct model时需要做抽象模型处理。

    VC Spyglass使用一系列attribute命令,可读性更好。

    Spyglass使用abstract_portassume_path

    Description

    Note: This document is not writing a SAM (Static Abstract Model). A SAM is an auto-generated, reduced representation of the design that comprises portions of the design, itself, relevant to the type of analysis to be performed at higher levels. This Constraint Abstract Model approach is about writing a model for analysis where the interface is understood but a functional description is not available or does not exist.

    You must create two constraint files which describe the boundary information of the model as below. Name of the files must follow given format to read by the tool.

    • translated_validate_.tcl
      All input side constraints should be specified in this file.

    • translated_verif_.tcl
      All output side constraints should be specified in this file.

    Then to read the constraint abstract model in user top level setup, following command and application variables should be used before design read commands.

    > App_vars:
    set_app_var cdc_read_constr_abs_model true
    set_app_var cdc_enable_parameterized_abs_models true
    

    Command to read translated abstract modules:
    set_constr_abstract_model
    Usage:
    -module <module_name> - Specifies a module for constraint based abstract model.
    [-instances <instance_name>]- Specifies a list of instances for constraint based abstract model.
    -path <path_name>- Specifies abstract model directory path which contain the abstraction tcl files.

    Example:

    > set_app_var cdc_read_constr_abs_model true set_app_var
    > cdc_enable_parameterized_abs_models true 
    > set_constr_abstract_model -path abstraction -module Block
    

    The following are the basic steps to model a port using attribute commands. Detailed examples are mentioned as follows:
    Step 1)
    Define the scope of the attribute commands using the set_constraints_scope command.
    Step 2)
    Use the define_attribute command to create a new attribute element with the given name.
    Step 3)
    Attach the clock/reset/connectivity/sync attributes to the defined attribute name using set_clock_attribute, set_reset_attribute, set_connectivity_attribute or set_sync_attribute commands.
    Steps 4)
    Use the apply_attribute command to specify the pins to the given attributes.
    Step 5)
    Use end_constraints_scope command defines the end of the current scope of the attribute commands.

    Note: If you are modeling set of ports, no need to use set_constraints_scope and end_constraints_scope for each set_*_attribute. See example 2.

    Important: Do not use get_* command to provide design objects to set_*_attribute commands.

    Example : set_clock_attribute path1 -clock_objects [get_pins clk1]

    EXamples 1)
    在这里插入图片描述
    The above example implies that the O1 output port of the BLOCK module is driven by a flip-flop clocked by the clock which comes to Clk1 port. This can be modeled using the following command.

    Commands

    set_constraints_scope -module BLOCK
    define_attribute -name path1
    set_clock_attribute path1 -clock_objects Clk1
    apply_attribute path1 -objects {O1}
    end_constraints_scope
    

    Note: The -direction switch of apply_attribute is not mandatory here. Tool will automatically identify a port’s direction. But if you are modeling an INOUT port, you should add -direction.
    Also you must specify a clock objects instead of port/pin objects use -clocks switch in the set_clock_attribute command instead of -clock_objects switch. For example, if virtual clock must be used with the set_clock_attribute.

    SpyGlass Command:
    abstract_port -module BLOCK -ports O1 -clock C1 -scope cdc

    Examples 2)
    在这里插入图片描述
    The above example implies that the O1 output port of the BLOCK module is driven by a flip-flop clocked by the clocks reaching C1 port and driven by the data reaching I1 port. (As example, consider a qualifier which is propagating through an abstract module within the sequential depth ) It also includes an inverter path from I2 to O2. This can be modeled using the following commands.

    Commands:

    set_constraints_scope -module {BLOCK}
    
    define_attribute -name path1 -objects {O1}
    set_clock_attribute path1 -clock_objects {C1}
    set_connectivity_attribute path1 -path_type seq -related_ports {I1}
    
    define_attribute -name path2
    set_connectivity_attribute path2 -path_type inv -related_ports {I2}
    apply_attribute path2 -add -objects {O2}
    
    end_constraints_scope
    

    SpyGlass Command:

    abstract_port -module BLOCK  -ports O1 -clock C1 -related_ports I1 -scope cdc
    abstract_port -module BLOCK -path_logic inv -ports O2 -related_ports I2 -scope cdc
    

    Example 3)
    在这里插入图片描述
    The above example implies that the O1 port of the BLOCK module is an output of a control synchronizer (from the source clock C1 which is reaching through clk1 pin to the destination clock C2 which is reaching through clk2 pin ) and there is combinational logic present between the synchronizer and the port. This can be modeled using the following commands.

    Commands:

    set_constraints_scope -module {BLOCK}
    define_attribute -name path1
    set_sync_attribute path1 -sync active -from {clk1} -to {clk2} -sync_names {u4/Q} -combo yes
    apply_attribute path1 -objects {O1}
    end_constraints_scope
    

    Note: For the -from/to switches you can use both clock objects and port/pin objects as well. For example, If virtual clock need to be specified, it can be directly use virtual clock names.
    Also, see the example 4 which describe the usage of -sync_names switch of set_sync_attribute.

    SpyGlass Command:

    abstract_port -module BLOCK -ports O1 -clock clk2 -combo yes -sync active -from clk1 -to clk2 -sync_names BLOCK.u4.Q -scope cdc
    

    Example 4)
    在这里插入图片描述

    The above example implies that the O1 and O2 ports of the BLOCK module are an connected to the same control synchronizer (from the source clock C1 which is reaching through clk1 pin to the destination clock C2 which is reaching through clk2 pin). O1 and O2 ports converge at the top level U5 AND gate. To specify same control synchronizer is coming out from O1 and O2 -sync_names can be used. Then no coherency issue will be reported.

    Commands:

    set_constraints_scope -module {BLOCK}
    
    define_attribute -name path1
    set_sync_attribute path1 -sync active -from {clk1} -to {clk2} -sync_names {u4/Q} -combo yes
    apply_attribute path1 -objects {O1}
    
    define_attribute -name path2
    set_sync_attribute path2 -sync active -from {clk1} -to {clk2} -sync_names {u4/Q} -combo no
    apply_attribute path2 -objects {O2}
    
    end_constraints_scope
    

    Note: You can use any string with -sync_names to name a control synchronizer which is inside an abstraction.

    SpyGlass Command:

    abstract_port -module BLOCK -ports O1 -clock clk2 -combo yes -sync active -from clk1 -to clk2 -sync_names BLOCK.u4.Q -scope cdc
    
    abstract_port -module BLOCK -ports O2 -clock clk2 -combo no -sync active -from clk1 -to clk2 -sync_names BLOCK.u4.Q -scope cdc
    

    Example 5)
    在这里插入图片描述
    This is an example of a data crossing from C1 domain that is synchronized in C2 domain by a qualifier and gating logic. Note that output port O1 must ultimately reach a flop in C2 domain or synchronization of this modeled data crossing will fail and O1 cannot use to synchronize other data crossings.

    Command:

    set_constraints_scope -module {BLOCK}
    define_attribute -name path1
    set_sync_attribute path1 -sync inactive -from {clk1} -to {clk2} -combo no -sync_names {u4/Q}
    apply_attribute path1 -objects {O1}
    end_constraints_scope
    

    SpyGlass Command:

    abstract_port -module BLOCK -ports O1 -clock clk2 -combo no -sync inactive -from clk1 -to clk2 -scope cdc -sync_names BLOCK.u4.Q
    

    Example 6)
    在这里插入图片描述

    The above example implies that all the fan-out of the I1 input port are hanging. This can be modeled using the following command.

    Command:

    set_constraints_scope -module {BLOCK}
    define_attribute -name path1
    set_ignore_attribute path1
    apply_attribute path1 -add -objects {I1}
    end_constraints_scope
    

    SpyGlass Command:

    abstract_port -module BLOCK -ports I1 -ignore
    

    Example 7)
    在这里插入图片描述

    The above example implies that the I1 input port of the BLOCK module drives a flip-flop clocked by the clock receiving to C1 pin and the reset receiving to RST pin. This can be modeled using below command.

    Commands:

    set_constraints_scope -module BLOCK
    define_attribute -name path1
    set_clock_attribute path1 -clock_objects C1
    set_reset_attribute path1 -reset_objects RST
    apply_attribute path1 -objects {I1}
    end_constraints_scope
    

    SpyGlass Command:

    abstract_port -module BLOCK -ports I1 -clock C1 -reset RST -scope cdc
    

    Example 8)
    在这里插入图片描述

    The above example implies that the in1 input port of the BLOCK module drives a drives a synchronizer clocked by the clock C2.

    Commands

    create_clock -name {SG_VCLK1} -period 10
    
    set_constraints_scope -module BLOCK
    define_attribute -name path1
    set_clock_attribute path1 -clocks {SG_VCLK1} -combo no -combo_ifn {C2}
    apply_attribute vc_path1 -objects {in1}
    end_constraints_scope
    
    set_clock_group -asynchronous -group { SG_VCLK1 }
    

    SpyGlass Command:

    abstract_port  -module BLOCK -clock SG_VCLK1 -combo no -ports "in1" -combo_ifn c2
    
    展开全文
  • Android代码-Spyglass

    2019-08-06 07:16:43
    Spyglass A powerful Android library that provides highly-customizable widgets (with smart defaults) to easily add social-media-esque mention (aka tag) support to your app For a broad overview, check ...
  • Spyglass_LintRules
  • 随着数字系统复杂度的提高,系统芯片中集成的模块数量增加。各模块通常 工作在不同的时钟频率下,对各系统之间的数据CDC(Clock Domain Crossing) 通信需要进行同步设计。对于不同时钟域和电压域的情况,对CDC ...
  • CDC解决方案 EDA tool提供特定场景下的CDC处理单元,Synopsys的Building Block IP...VC Spyglass CDC将Single-bit归为control path,Mulit-bit归为data path Single-bit Single-bit分为level 类型和event 类型。 ...

    本篇源代码:
    https://github.com/holdenQWER/CDC_example

    CDC解决方案

    EDA厂商提供golden的CDC处理单元,Synopsys的Building Block IP提供如下解决方案:
    在这里插入图片描述
    归类如下:
    在这里插入图片描述

    CDC处理中,根据跨时钟域信号宽度,分为Signle-bitMulit-bit。VC Spyglass CDC将Single-bit归为control pathMulit-bit归为data path

    Single-bit

    Single-bit分为level 类型event 类型

    Level Signal

    level signal跨时钟域时,会保持较长时间不变,从快时钟域到慢时钟域,还是慢时钟域到快时钟域,都不会漏采样,使用2级同步器即可。

    Event Signal

    event signal常看做一个单周期pulse signal。无论是快到慢,还是慢到快,都有漏采样的风险。

    destination domain要确保成功采样到event single,需要event single至少维持destination domain 采样时钟3个沿(无论是上升沿还是下降沿,连续的3个沿)。

    在这里插入图片描述

    所以从慢时钟域到快时钟域,如果快时钟域的频率大于慢时钟域的1.5倍,就满足了three edge的要求。

    Fast to Slow
    从快时钟域到慢时钟域,需要对快时钟域的信号做展宽处理,以满足慢时钟域的three edge要求。
    可以通过移位寄存器对evnet_signal做打拍处理,然后自身各bit相或,展宽event signal。移位寄存器的位宽和clock_ratio相关。这种展宽的方式只适合clock_ratio固定的CDC处理,相邻pulse的间隔也有要求。

    Slow to Fast
    从慢时钟域到快时钟域,如果频率相差较大,慢时钟域会过采样。可以使用边沿检测的方式,防止过采样。
    在这里插入图片描述
    event_d_dly1Q端和D端取反后相与,检测上升边沿。evnet_s需间隔至少一个clk_s的周期,避免信号重叠漏采。

    Pulse Synchronizer
    上述两种CDC处理方法都有明显的限制,只能从快到慢或者从慢到快。可以将信号展宽边沿检测相结合,设计一种通用的pulse synchronizer

    module pulse_sync(input clk_s,
                      input rstn_s,
                      input event_s,
                      input clk_d,
                      output event_d);
                
    
       reg event_s_dly;
       reg event_d_dly;
       wire event_s_expand;
       wire event_d_clr;
       wire event_d_sync;
    
       assign event_s_expand = (event_s | event_s_dly) & (~event_d_clr);
    
    	always @(posedge clk_s or negedge rstn_s)
          if(~rstn_s)
             event_s_dly <= 1'b0;
          else
             event_s_dly <= event_s_expand;
    
       rstn_sync u_rstn_sync(.clk(clk_d),
                             .rstn_in(rstn_s),
                             .rstn_out(rstn_d));
    
       sync_cell u_sync_to_dst(.clk(clk_d),
                             .rst_n(rstn_d),
                             .in(event_s_dly),
                             .out(event_d_sync));
    
       sync_cell u_sync_to_src(.clk(clk_s),
                             .rst_n(rstn_s),
                             .in(event_d_sync),
                             .out(event_d_clr));
    
    	always @(posedge clk_d or negedge rstn_d)
          if(~rstn_d) begin
             event_d_dly <= 1'b0;
          end
          else begin
             event_d_dly <= event_d_sync;
          end
    
       assign event_d = event_d_sync & ~event_d_dly;
    
    endmodule
    

    在这里插入图片描述

    src domain利用或门将边沿信号转化成电平信号;destination domain采样到信号后回复ack清0。ack信号也需要2级同步处理。(上述电路图缺少了destination domain边沿检测的部分。
    上述设计的latency比较大,需要2次2级同步处理。event_s信号要和ack做好handshake。

    A Better Design for Pulse Synchronizer

    下面介绍一种Design Ware库中的脉冲同步器:DW_pulse_sync

    电路逻辑如下:
    在这里插入图片描述
    source domain两级同步+电平转脉冲的电路结构用简易的图标表示如下:
    在这里插入图片描述
    CODE:

    module pulse_sync(input clk_s,
                      input rstn_s,
                      input event_s,
                      input clk_d,
                      input rstn_d,
                      output event_d);
                
    
       reg event_s_toggle;
       reg event_d_dly;
       wire event_d_sync;
    
    	always @(posedge clk_s or negedge rstn_s)
          if(~rstn_s)
             event_s_toggle <= 1'b0;
          else
            event_s_toggle <= event_s_toggle ^ event_s;
    
       sync_cell u_2dff_sync(.clk(clk_d),
                             .rst_n(rstn_d),
                             .in(event_s_toggle),
                             .out(event_d_sync));
    
    	always @(posedge clk_d or negedge rstn_d)
          if(~rstn_d)
             event_d_dly <= 1'b0;
          else
             event_d_dly <= event_d_sync;
    
       assign event_d = event_d_dly ^ event_d_sync;
    
    endmodule
    

    source domain通过异或门,实现pulse的边沿转电平的操作。这种结构实现不归零编码Non-Return-to-Zero (NRZ),相当于一个toggle register。
    destimation domain通过异或门将level转化成一个周期的pulse。
    这种不需要ack的脉冲同步器,相比上一种设计,缩减了latency,结构也更简单。
    使用时需注意一下两点:
    第一:脉冲的频率小于目的域时钟频率的1/2
    在这里插入图片描述
    上述限制出于两点考虑,
    1:event_s_toggle需要满足three edge,才能被目的域时钟有效采样到,频率相差1.5倍即可。
    2:event_d_sync的level至少需要持续2拍,否则无法恢复出脉冲,也就是说event_s_toggle至少要被目的域时钟采样两次,频率相差2倍即可。

    第二:source domain复位后,destinantion domain也需要复位

    在奇数脉冲时,电平被toggle为1,只复位source domain,再次传播脉冲时,第一个脉冲会被漏采。
    偶数脉冲时,可以单独复位source domain

    DW库中也提供了带反馈信号的脉冲同步器Dw_pulseack_sync ,结构如下:
    在这里插入图片描述
    FSM判断ready busy:

    module pulse_sync_ack(input clk_s,
                      input rstn_s,
                      input event_s,
                      input clk_d,
                      input rstn_d,
                      output event_d,
                      output ack_s);
                
    
       reg event_s_toggle;
       reg event_d_dly;
       wire event_d_sync;
    
       wire event_ack;
       reg event_ack_dly;
       wire ack_pulse;
    
       reg state_cur;
       reg state_nxt;
       reg ack_r;
       parameter READY = 1'b0;
       parameter BUSY  = 1'b1;
    
       always @(posedge clk_s or negedge rstn_s)
          if(~rstn_s) 
             state_cur <= READY;
          else
             state_cur <= state_nxt;
    
       always @(*) begin
          state_nxt = state_cur;
          case (state_cur)
             READY:begin
                ack_r = 1;
                if(event_s)
                   state_nxt = BUSY;
             end
             BUSY: begin
                ack_r = 0;
                if(ack_pulse)
                   state_nxt = READY;
             end
             default: begin
                state_nxt = READY;
             end
          endcase
       end
    
       assign ack_s = ack_r;
    
    	always @(posedge clk_s or negedge rstn_s)
          if(~rstn_s)
             event_s_toggle <= 1'b0;
          else
            event_s_toggle <= event_s_toggle ^ (event_s & ack_s);
    
       sync_cell u_2dff_sync_s(.clk(clk_d),
                             .rst_n(rstn_d),
                             .in(event_s_toggle),
                             .out(event_d_sync));
    
    	always @(posedge clk_d or negedge rstn_d)
          if(~rstn_d)
             event_d_dly <= 1'b0;
          else
             event_d_dly <= event_d_sync;
    
       assign event_d = event_d_dly ^ event_d_sync;
    
       sync_cell u_2dff_sync_d(.clk(clk_s),
                             .rst_n(rstn_s),
                             .in(event_d_dly),
                             .out(event_ack));
    
    	always @(posedge clk_s or negedge rstn_s)
          if(~rstn_s)
             event_ack_dly <= 1'b0;
          else
             event_ack_dly <= event_ack;
    
       assign ack_pulse = event_ack_dly ^ event_ack;
    endmodule
    
    

    只有在ack_s为高时,source domain才可以发送event_s脉冲,对异步时钟的频率没有要求,latency较大。
    在这里插入图片描述

    Mulit-bit

    对于Mulit-bit的signal,总结如下几类方法:

    1. Muilt-bit的各bit分别2级同步器处理。这种方式适用于可以通过格雷编码的设计,如Binary counters;下级电路对data coherency不敏感,如被软件处理的interrupt信号;使用更高频率过采样等等。
    2. 采用Multi-Cycle Path (MCP ) 结构的设计。
    3. 使用异步FIFO。

    上述的方法根据实际业务选择最佳方案,而不是相互取代的。

    Multi-Cycle Path (MCP)formulation

    MCP解释如下:
    在这里插入图片描述
    DW_data_sync_na就是一个MCP结构的设计:
    在这里插入图片描述
    分为control pathdata path
    control path需要同步处理,采用的是DW-pulse_sync
    data path不需要同步处理,节约寄存器使用;
    源和目的端各一个data MUX,由同步的脉冲control信号控制。control使能时,data需保持不变,维持数个Multi-Cycle目的域时钟,直到被采样,避免了data path上的亚稳态。

    DW_data_sync_na不带ack反馈,若要支持back-to-back的传输,需要destination domain 频率比source domain频率快三倍。

    如下图,频率2倍关系,dataf2和data49 back -to-back发送,dataf2 miss captured。DW_pulse_sync并不支持back-to-back的同步,需要额外逻辑设计,所以至少要3倍频率。
    在这里插入图片描述
    DW_data_sync则是带ack反馈的data同步器,结构类似如下:
    是将上述DW_pulseack_sync的输出脉冲作为data MUXsel
    在这里插入图片描述
    上述电路默认destination domain一直可以接收source domain的数据。

    下面介绍一种destination domain可以通过load信号控制是否准备接受source doamin数据的流控结构:

    在这里插入图片描述
    从电路图可以看出,source domain destination domain结构对称,destination domain的FSM划分为 idle wait ready的三个状态。

    1. ack_s拉高时,src端拉高data_vld_s发送有效数据,期间data_s保持不变。随后ack_s拉低。
    2. 数拍后data_vld_d有效,并持续为高。直到dst端拉高load_ddata_vld_d下的data_d采样。
    3. 完成采样后,ack_s拉高,src端可以进行下一次操作。
      在这里插入图片描述
      CODE:
    module data_sync(input clk_s,
                      input rstn_s,
                      input data_vld_s,
                      input [7:0] data_s,
                      input clk_d,
                      input rstn_d,
                      input load_d,
                      output data_vld_d,
                      output reg [7:0] data_d,
                      output ack_s);
                
    
    
       reg state_curs;
       reg state_nxts;
       reg [1:0]state_curd;
       reg [1:0]state_nxtd;
       reg ack_r;
       parameter READYS = 1'b0;
       parameter BUSYS  = 1'b1;
       parameter IDLED  = 2'b00;
       parameter WAITD  = 2'b01;
       parameter READYD = 2'b10;
    
       reg [7:0] data_r;
       reg data_vld;
       wire data_sel_s;
       wire data_sel_d;
       wire ack_sync;
       wire data_vld_sync;
    
       // source domain data MUX
       always @(posedge clk_s or negedge rstn_s)
          if(~rstn_s) 
             data_r <= 8'h0;
          else if (data_sel_s)
             data_r <= data_s;
             
       // destination domain data MUX
       always @(posedge clk_d or negedge rstn_d)
          if(~rstn_d) 
             data_d <= 8'h0;
          else if (data_sel_d)
             data_d <= data_r;
    
       // source domain FSM
       always @(posedge clk_s or negedge rstn_s)
          if(~rstn_s) 
             state_curs <= READYS;
          else
             state_curs <= state_nxts;
    
       always @(*) begin
          state_nxts = state_curs;
          case (state_curs)
             READYS:begin
                ack_r = 1;
                if(data_vld_s)
                   state_nxts = BUSYS;
             end
             BUSYS: begin
                ack_r = 0;
                if(ack_sync)
                   state_nxts = READYS;
             end
             default: begin
                state_nxts = READYS;
             end
          endcase
       end
    
       assign ack_s = ack_r;
       assign data_sel_s = data_vld_s & ack_s;
    
       // source to destination pulse sync
       pulse_sync u_pulse_sync_s(.clk_s(clk_s),
                                 .rstn_s(rstn_s),
                                 .event_s(data_sel_s),
                                 .clk_d(clk_d),
                                 .rstn_d(rstn_d),
                                 .event_d(data_vld_sync));
    
    
       // destination domain FSM
       always @(posedge clk_d or negedge rstn_d)
          if(~rstn_d) 
             state_curd <= IDLED;
          else
             state_curd <= state_nxtd;
    
       always @(*) begin
          state_nxtd = state_curd;
          case (state_curd)
             IDLED:begin
                data_vld = 0;
                if(data_vld_sync)
                   state_nxtd = WAITD;
             end
             WAITD:begin
                data_vld = 1;
                if(load_d)
                   state_nxtd = READYD;
             end
             READYD:begin
                data_vld = 0;
                if(!load_d)
                   state_nxtd = IDLED;
             end
             default:begin
                state_nxtd = IDLED;
                data_vld = 0;
             end
          endcase
       end
    
       assign data_sel_d = load_d & data_vld;
       assign data_vld_d = data_vld;
    
       // destination to source domain sync
       pulse_sync u_pulse_sync_d(.clk_s(clk_d),
                                 .rstn_s(rstn_d),
                                 .event_s(data_sel_d),
                                 .clk_d(clk_s),
                                 .rstn_d(rstn_s),
                                 .event_d(ack_sync));
    
    endmodule
    

    AHB to APB asynchronous bridge设计采用的也是MCP结构,只需要同步req/ack 握手信号。
    在这里插入图片描述

    异步FIFO

    异步FIFO适用对缓冲有要求的异步数据流的设计。DW提供了常见的两种fifo,DW_fifo_s2_sfDW_fifo_2c_df
    在这里插入图片描述
    异步FIFO的设计难点主要在于异步读写指针的比较和空满状态的产生。具体参考:🔗 Simulation and Synthesis Techniques for Asynchronous FIFO Design with Asynchronous Pointer Comparisons – Cliff Cummings

    在使用DW_fifo_s2_sf需要注意,clk_pushclk_pop时钟域由一个rst_n控制,VC Spyglass CDC检测时会报error。可以将fifo设置为blackbox或者将rst_n设置为static。

    为了避免复位时的亚稳态,需要rst_n拉低至少三个慢时钟的周期,并在一个clk_push周期后才可以push数据。建议rst_n使用clk_push的复位信号。
    在这里插入图片描述

    Qasi Synchronous

    时钟同源,由同一个分频器产生,频率为整数倍关系,相位差固定,可以看成qasi synchronous准同步电路,可以当作同步电路处理,ctrl path不需要同步处理。
    DW_data_qsync_lh 为快时钟域到慢时钟域的传输。
    DW_data_qsync_hl 为慢时钟域到快时钟域的传输。
    使用时配置clk_ratio参数。当clk_ratio = 2时,负责采样的第一个触发器使用下降沿采样,利于时序管理;其余情况所有触发器都是上升沿采样。
    clk_ratio=2DW_data_qsync_lh结构如下:
    在这里插入图片描述
    clk_ratio=2DW_data_qsync_hl 结构如下:
    在这里插入图片描述

    展开全文
  • SEO SpyGlass v6.40.15.zip

    2019-07-14 06:06:32
    SEO SpyGlass 帮您分析您的竞争者的搜索引擎位置在所有主要美国和国际查寻引擎。它创造包含各个站点与您的竞争者连接, 与他们的页等级、Alexa 等级、船锚文本、页标题、主题词报告和其它信息一起的一个详细的数据...
  • SPYGLASS检查

    2021-09-06 15:49:13
    LINT 检查相关语法 CDC 跨时钟域检测。 cdc.sgdc约束:clk.reset.input.dft信号.... clk: 同源时钟约束成同一个时钟域 reset: 确认复位状态是否有效 top约束:clk.reset.databus等input 信号约束。...

    LINT

    检查相关语法

    CDC 跨时钟域检测。

    流程:
    1.1 准备好spy环境,支持lint即可。
    1.2 make cdc setup获取时钟复位约束。
    1.3 make cdc setup check 获得blockbox约束和检查约束。
    1.4 make cdc verify struct 检查所有的error和warning。make cdcgui打开图形界面检查error和warning。

    make setup自动生成clk.reset的sgdc文件,复制到cdc.sgdc中,手动添加input信号,dft信号约束为常量。

    clock -name “sig_name” -domin “clk_name” -tag “xxx”
    reset -name “rst_name” -value 0/1
    abstract_port -ports “sig_name[m:0]” -clock “clk_name”
    set_case_analysis -name “sig_name” -value 0/1

    公共模块挖空
    abstract_port -module moudle_nane -ports port_name -clock clk_name

    1. cdc.sgdc约束:clk.reset.input.dft信号.公共模块挖孔约束。
      clk: 同源时钟约束成同一个时钟域
      reset: 确认复位状态是否有效
      top约束:clk.reset.databus等input 信号约束。
    2. 公共waive文件
    3. cdc工作流程

    检查思想:
    正向检查:保障全局。
    反向检查:发现典型的跨时钟错误
    max delay :五分钟发现典型的裸跨错误。
    cdc:典型的裸跨 错误和组合逻辑错误。

    常见错误:
    没有跨时钟
    1.没有用跨时钟模块错误
    2.用了跨时钟,时钟域接错了

    组合逻辑跨时钟
    max delay

    跨时钟数据有丢失:
    正确设计为,先计数,再跨时钟。

    分开跨时钟,重新汇聚。最难发现。

    展开全文
  • spyglass 使用方法

    千次阅读 2021-02-03 20:48:22
    //////////////////////spyglass //https://www.atrenta.com/ //templates //Scripts {//sg_designread -top :top-level design unit. -sdcfile :provide the name of design SDC file, -activityfile :...
  • 数字IC设计-SpyGlass

    2021-09-03 14:53:01
    spyglass -tcl ./scr/your_chip_edition_lint.tcl 跑lint spyglass -tcl ./scr/your_chip_edition_constraint.tcl 跑constraint spyglass -tcl ./scr/your_chip_edition_cdc.tcl 跑cdc, rdc
  • SpyGlass CDC 检查

    2021-12-10 18:07:44
    SpyGlass的作用 SpyGlass lint的检查语法 检查CDC Low Power 检查约束 检查DFT SpyGlass CDC的检查 CDC setup CDC setup check CDC structural verification CDC functional verification SpyGlass 问题、目标、...
  • Spyglass 是一个重要的CDC检查工具,主要的功能是对SOC进行抽象,生成sgdc文件帮助进行RTL分析,CDC分析,功耗分析等。一个完整的SOC工程 可能会生成 数十个sgdc文件,每一个文件 行数达到上万行,人工分析sgdc文件...
  • Spyglass之CDC检查(4)

    千次阅读 2020-07-01 19:52:56
    上一篇:Spyglass之CDC检查(3) 下一篇:Spyglass之CDC检查(5) 同步方法 note: 本节相位差单位为纳秒 哪些信号需要同步 时钟有效跳变沿的相位差是固定的,称为同步时钟。如下图clk1和clk2,虽然两者频率不一样...
  • SpyGlass工具介绍

    千次阅读 2020-03-28 12:14:56
    SpyGlass工具介绍 Spyglass工具有五大模块: lint, CDC(多时钟域检查), LP(低功耗),Constraint(约束),DFT(可测试性)。 一,在RTL层面上预估芯片性能,从而引导设计人员开发出更加优化的RTL代码 SpyGlass平台...
  • spyglass CDC入门

    千次阅读 2019-02-11 10:28:27
    spyglass的错误报告分组有多种主要是下面两种个人理解利用Goal by rule去分组按照spyglass执行流程依次解决error和warning有利于spyglass流程因为Severity ERROR不一定是第一时间要解决的而流程错误需要第一时间解决...
  • 学习资料 链接:百度网盘 提取码:csdn Synopsys Verification Continuum的静态验证平台VC static platform包含了VC LP,VC formal,VC Spyglass三种静态检查工具。Spyglass原是Atrenta旗下的静态检查工具,占据CDC/...
  • spyglass使用

    千次阅读 2020-01-07 09:45:50
    1、首先要获取本公司的规则检测脚本(我的脚本放在/storage/spyglass_code_rule_chk),如果没有需要自己写脚本(如有需求后续我会讲) 2、将目录拷贝到自己的电脑或者工作站下 cp -rf /storage/spyglass_code_rule...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 712
精华内容 284
关键字:

spyglass

友情链接: 工程文档.zip