碎碎思 · 2023年09月20日

使用 Verilator 进行 Verilog Lint

image.png

FPGA设计是无情的,所以我们需要利用能获得的任何软件进行检查。Verilator是一个 Verilog 仿真器,还支持 linting:静态分析设计中的问题。Verilator 不仅可以发现综合工具可能忽略的问题,而且运行速度也很快。Verilator 也非常适合使用 SDL 进行图形仿真。

安装Verilator

Linux

Verilator 在大多数 Linux 发行版存储库中都可用,并适用于 Windows 子 Linux 系统上运行。

对于 Debian 和基于 Ubuntu 的发行版,可以使用 apt 安装 Verilator:

apt update  
apt 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 none  
  
module 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;  
    end  
endmodule  

进行lint检查

$ verilator --lint-only -Wall add.v  
%Warning-WIDTH: add.v:12:11: 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.v:8:16: 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.sv:29:5: Cannot find file containing module: 'MMCME2_BASE'  
   29 |     MMCME2_BASE #(  
      |     ^~~~~~~~~~~  
%Error: clock_pix.sv:29:5: This may be because there's no search path specified with -I<dir>.  
   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 MODULE  
  
endmodule  

创建空模块有点乏味,但可以检查整个设计。要使用 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/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 的文件。

总结

今天关于Verilator 进行 Verilog Lint介绍就这样,这是一个功能强大的工具,希望有兴趣的可以尝试一下~

原文:OpenFPGA
作者:碎碎思

相关文章推荐

更多FPGA干货请关注FPGA的逻辑技术专栏。欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。
推荐阅读
关注数
10604
内容数
561
FPGA Logic 二三事
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息