SpyGalss是目前业界唯一可靠的RTL Sign off解决方案,可以帮助客户在设计早期发现潜在问题,保证产品质量,极大的减少设计风险,降低设计成本。
包含五大模块:lint, CDC(跨时钟域检查), LP(低功耗),Constraint(约束),DFT(可测试性)。
本文测试用例
该测试设计包括具有符合 Wishbone 总线的 USB 控制器 (USB) 和音频解码器内核 (IMA_ADPCM)。这些组件连接到 Wishbone 连接矩阵 (WB_Conmax),后者又使用 Wishbone-to-Amba 桥 (wb2ahb) 连接到 AMBA 总线。该设计属于混合 RTL 类型,同时使用 Verilog 和 VHDL,如下方框图所示:
设计目录结构:
包括:rtl(用于存放代码),sim(用于存放中间文件和工程文件)、filelist文件等。
spyglass GUI操作
首先我们在sim目录中打开spyglass GUI界面操作:
读取设计文件
GUI界面打开spyglass
spyglass &
然后点击Add File(s)
添加文件:
所需文件路径存放在filelit
文件中:
设置顶层模块
添加完文件后点击Set Options
,然后选择列表中选择Top Level Design Unit
,Value值为顶层模块名,如下图所示:
编译设计
点击Read Design
,再在左侧点击Run Design Read
开始进行设计文件编译和分析,在读取完成后会在下方窗口列出问题。如下图所示:
如下图,其中三个问题类型都为ErrorAnalyzeB Box
,这是因为有的模块文件没有添加,spygalss无法找到,后面spygalss会将其作为黑盒子
处理。
左侧instance
下文件不同颜色标识意义为:
•绿色表示已准备好进行分析但尚未在内部综合; •黑色表示无法分析该块(黑框); •白色表示该模块是可综合的;
注意:默认情况下,设计读取不合成设计,因此尚未创建原理图。要使用 SpyGlass 进行完整的设计分析,应首先解决所有黑框,并且选择复选框Synthesize Netlist
, 并重新运行Run Design Read
。因此我们需将设计文件路径全部包括进去,在filelist添加以下文件:
../rtl/usb/usbf_top.v
../rtl/usb/usbf_utmi_if.v
../rtl/usb/usbf_utmi_ls.v
并且将conmax
、usb
等库文件添加进去,重新Run Design Read
。如下,ErrorAnalyzeB Box问题已经解决2个,还有一个问题是IMA_ADPCM
引起的,后面会解决。
静态分析
下面列出使用spyglass来进行lint
分析的步骤。注意使用spyglass进行分析不要求完整的工程文件。
首先选择Linting RTL
分析。在窗口上方中间点击Goal Setup
,然后在主窗口区勾选Lint_rtl
:
得到结果后,查看Lint分析结果。首先展开lint/lint_rtl
文件夹消息。选择并展开inferLatch
文件夹,错误相关的代码会在RTL代码窗口中显示出来:
点击
符号得出电路图如图:
由电路和.v文件都可得出,这是因为hready
信号没有在else
后赋值,生成了锁存器。如果这些Latch是故意的,那通过屏蔽对该处的规则检查即可,否则我们修改代码后重新运行Goal。
最后save
工程后关闭,打开工程文件wb_subsystem.prj
,打开的文件如下:
- read_file: 命令定义了在 SpyGlass 运行期间要读取的各种类型的文件。
- language_mode: 选项用于指定当前 SpyGlass 运行的操作语言。默认值为“混合”,(将处理 Verilog、VHDL 和混合语言设计)。
- projectwdir: 选项用于指定项目工作目录
- GuideWare/latest : 是默认规则设置,它在项目文件中定义为 active_methodology。
可以在wb_subsystem.prj
中,将这些源文件列表添加进去:
read_file -type sourcelist ../filelist/file.list
read_file -type sourcelist ../rtl/wb_conmax/file.list
spyglass 命令操作
在上述基础上,将使用-batch
选项在批处理模式下运行SpyGlass。同样的操作也可以在GUI模式下完成。
通过下面的指令来运行SpyGlass工程:
代码语言:javascript复制spyglass -project wb_subsystem.prj -designread -batch
提示有6个错误。SpyGlass会生成比较多的报告,其中常用的报告为:
./wb_subsystem/wb_subsystem/Design_Read/spyglass_reports/moresimple.rpt
其内容如下:
它们是被实例化的标准单元,提示没有定义。这些单元很可能会使用 -y/-v
选项传递,所以我们在 usb
中的目录,看是否有没有加进去的库文件。可以看到 usb_lib
目录存在于usb目录中,但没有指定 -y
作为 file.list
的一部分。
通过在 .prj
中添加以下内容,指定Verilog库路径../rtl/usb/usb_lib
和库文件扩展名.v
以读取缺失的定义:
set_option y { ../rtl/usb/usb_lib }
set_option libext { .v }
然后重新执行命令spyglass -project wb_subsystem.prj -designread -batch
可以看到剩下的一个黑盒错误来自IMA_ADPCM_top
。这部分采用VHDL设计,出现黑盒问题原因是其设计文件尚未包含在.prj文件。
预编译库来解决IMA_ADPCM_top
黑盒问题
预编译HDL库,需要指定逻辑库中要预编译的文件列表,以及逻辑库名和物理目录的映射关系。这是使用lib_hdlfiles
(定义要编译到命名库的文件)和 lib
(将命名库映射到物理目录)选项来完成的:
set_option libhdlfiles ima_adpcm_lib "../rtl/ima_adpcm/IMA_ADPCM_Encode.vhd
../rtl/ima_adpcm/IMA_adpcm_steptable_rom.vhd
../rtl/ima_adpcm/WAV_header_rom.vhd
../rtl/ima_adpcm/IMA_ADPCM_top.vhd "
set_option lib ima_adpcm_lib ../ima_adpcm_lib
首先删除包含上次运行保存的网表的结果目录,然后重新运行,确认这个最新的项目文件解决了来自IMA_ADPCM_top的黑盒错误:
代码语言:javascript复制rm -rf wb_subsystem
spyglass -project wb_subsystem.prj -designread –batch
运行Goal及查看报告信息
通过下面命令来获取可用的Goal
列表:
spyglass –project wb_subsystem.prj -showgoals
使用如下命令来运行lint/lint_rtl
分析:
spyglass -project wb_subsystem.prj -goals lint/lint_rtl -batch
在文件./wb_subsystem/wb_subsystem/lint/lint_rtl/spyglass_reports/moresimple.rpt
中查看更为详细的报告: