fpga设计是无情的,所以我们需要利用能获得的任何软件进行检查。verilator是一个 verilog 仿真器,还支持 linting:静态分析设计中的问题。verilator 不仅可以发现综合工具可能忽略的问题,而且运行速度也很快。verilator 也非常适合使用 sdl 进行图形仿真。
安装verilator
linux
verilator 在大多数 linux 发行版存储库中都可用,并适用于 windows 子 linux 系统上运行。
对于 debian 和基于 ubuntu 的发行版,可以使用 apt 安装 verilator:
apt updateapt install verilator
苹果系统
在 macos 上,可以通过homebrew包管理器安装最新版本的 verilator :
brew install verilator
要为其他平台(例如 freebsd)安装 verilator,请参阅官方verilator 安装指南。
基本 linting
对于独立模块,linting 本身就很简单:
verilator --lint-only -wall foo.v--lint-only- 告诉 verilator 进行 lint 但不生成任何仿真输出-wall- 打开额外的风格检查
如果一切顺利,将不会看到来自 verilator 的消息。
如果 verilator 发现潜在问题,它会提供明确的建议,包括如何禁用警告。verilator 手册包含可能的警告列表。
让我们创建一个简单的“add”模块,并设置几个问题,然后对其进行 lint:
`default_nettype nonemodule add ( input wire clk, input wire [3:0] x, input wire [3:0] y, output reg z, output reg c ); always @(posedge clk) begin z <= x + y; endendmodule
进行lint检查
$ verilator --lint-only -wall add.v%warning-width: add.v11: operator assigndly expects 1 bits on the assign rhs, but assign rhs's add generates 4 bits. : ... in instance add 12 | z <= x + y; | ^~ ... use /* verilator lint_off width */ and lint_on around source to disable this message.%warning-undriven: add.v16: signal is not driven: 'c' : ... in instance add 8 | output reg c | ^%error: exiting due to 2 warning(s)
第一个问题是宽度:x和y是 4 位宽,但z没有明确的宽度,因此只有 1 位宽。
我们可以通过这样做来忽略宽度警告:
always @(posedge clk) begin /* verilator lint_off width */ z <= x + y; /* verilator lint_on width */ end
这仅仅是隐藏了问题,却没有采取任何措施。
相反,我们可以通过将z的宽度设置为 4 来修复该问题:
output reg [3:0] z,
虽然这消除了 verilator 警告,但可能无法完全解决问题。
例如,如果x和y都是4'b1000,会发生什么?我们的加法溢出,计算出z值4'b0000。此示例说明了 linting 的局限性之一:它可以查看不同信号的宽度,但无法解释应用于它们的所有逻辑。
因此,除了固定z的宽度外,我们还可以将其用作c进位信号,这也解决了“信号未驱动”警告:
always @(posedge clk) begin {c,z} <= x + y; end
依赖关系和路径
如果一个模块依赖于另一个模块会发生什么?verilator 将在当前路径中搜索匹配的模块。如果想向模块搜索路径添加其他目录,我们可以使用-i. 例如,如果top.v依赖于../maths目录中的模块:
verilator --lint-only -wall -i../maths top.v
可以使用多个-i参数来包含多个目录。
黑匣子和空模块
大多数设计依赖于没有源的供应商原语或 ip 核,例如使用 pll 生成时钟。当尝试对引用供应商原语的模块进行 lint 处理时,将收到如下错误:
%error: clock_pix.sv5: cannot find file containing module: 'mmcme2_base' 29 | mmcme2_base #( | ^~~~~~~~~~~%error: clock_pix.sv5: this may be because there's no search path specified with -i. 29 | mmcme2_base #( | ^~~~~~~~~~~ ... looked in: mmcme2_base mmcme2_base.v mmcme2_base.sv obj_dir/mmcme2_base obj_dir/mmcme2_base.v obj_dir/mmcme2_base.sv
第一个想法可能是找到一种排除mmcme2_baselint 的方法。唉,verilog “不经过精心设计就无法检查,需要整个设计”。我们可以通过为原语创建一个空模块来解决这个问题。空模块包含 io,但不包含任何逻辑。
例如,为 xilinx 的 bufg 原语创建了一个空模块:
module bufg ( input wire logic i, output logic o ); // null moduleendmodule
创建空模块有点乏味,但可以检查整个设计。要使用 null 模块,请确保它位于 verilator 的搜索路径中(请参阅上一节)。
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/shdir=`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 的文件。
总结
今天关于verilator 进行 verilog lint介绍就这样,这是一个功能强大的工具,希望有兴趣的可以尝试一下~
叫板特斯拉,大众抢占电动车的市场份额
小米note2曝光!这次不耍猴,而且满是惊喜
8x8x8LED立方体制作图解
思岚科技参编的3项机器人算法测试标准正式发布
网关是什么?什么是物联网网关?
怎样使用Verilator进行Verilog Lint呢?
PFC电感上的二极管选取有什么讲究?整流电路电感的应用
仁微电子推出新一代物联网中间件 促进IoT多系统数据融合与集成
iphone8上市最新消息: 前后双摄+两侧双投影+Home信息提示,黑科技满满诚意十足
SIE发布最新款无线控制器,DUALSHOCK 4 无线控制器
量子计算机运行能够快速破解加密的算法
亚马逊为何坚持发展人脸识别技术
探讨微流控微光谱技术在水质检测领域的创新应用
紫光DDR3 4GB*2 1600内存详细评测
数字电路降噪语音捕获SoC提升语音辨识度
华为展开转型,实现旗下多个产业的协同发展
本田雅阁和斯柯达全新速派,谁的性价比更高?谁更值得拥有?
百度发布AI市场2.0 帮助合作企业发展壮大
介绍从AC5到AC6转型之路
永磁同步电机的特点 永磁同步电机和交流同步电机区别