问题
最近 发现vverilog代码的lint检查用vcs做的不是太好,而verilator的lint功能非常强大,甚至比vcs 还要好,当然也许是vcs lint设置不熟练?
解决
正好发现下面这个链接对verilator的lint说得非常详细,完全满足我的需求:
https://cloud.tencent.com/developer/article/2331867使用 Verilator 进行 Verilog Lint-腾讯云开发者社区-腾讯云 (tencent.com)
基本用法
verilator --lint-only -Wall -I../maths top.v
--lint-only- 告诉 Verilator 进行 lint 但不生成任何仿真输出
-Wall- 打开额外的风格检查
可以使用多个-I参数来包含多个目录。
黑匣子和空模块:
大多数设计依赖于没有源的供应商原语或 IP 核,例如使用 PLL 生成时钟。当尝试对引用供应商原语的模块进行 lint 处理时,
可以通过为原语创建一个空模块来解决这个问题。空模块包含 IO,但不包含任何逻辑。
Linting Waivers
如果需要对较大的设计或使用第三方源的设计消除 linter 警告,那么/* verilator lint_off */注释可能不行。从 Verilator 4.028 开始,可以创建Waivers来处理警告,而无需触及源代码。要了解更多信息,请参阅 Stefan Wallentowitz 的帖子Verilator Waivers(https://wallento.cs.hm.edu/post/20200612-verilator-waivers/)。
Linting Shell Script
如果有许多顶级模块和/或包含目录,可以使用 Makefile 或简单的 shell 脚本自动检查。
以下 shell 脚本 lint 与该脚本位于同一目录中的所有顶级模块:
#!/bin/sh
DIR=`dirname $0`
echo "## Linting top modules in ${DIR}"
for f in ${DIR}/top_*\.*v; do
echo "## Checking ${f}";
verilator --lint-only -Wall -I${DIR} -I${DIR}/../common $f;
done
可以调整-I参数以适合自己的设置。top_*.*v捕获扩展名为 .v 和 .sv 的文件。
注意:
1 为了消除不必要的warning,编译时带上下面这些选项比较好:
SIMULATOR_OPT := -x-assign 0 -Wno-fatal -Wno-UNOPTFLAT -Wno-IMPLICITSTATIC -Wno-CMPCONST -Wno-MULTIDRIVEN -Wno-UNPACKED --timing -CFLAGS -fcoroutines
2 verilator移动要用5.024之类的高版本,越来越好用,越来越稳定。
遗留问题
如何提高verilator的仿真速度?这个还是要比vcs慢很多,尤其是对大设计。