使用 Verilator 进行 Verilog Lint

2023-09-20 08:31:07

9217c5e18fc45e85fd429adcfcf74421.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介绍就这样,这是一个功能强大的工具,希望有兴趣的可以尝试一下~

更多推荐

Kotlin 不可变数组和可变数组

在Kotlin中,可以使用数组来存储一组相同类型的元素。Kotlin提供了两种类型的数组:不可变数组和可变数组。不可变数组(ImmutableArrays)不可变数组的大小(元素数量)在创建后就确定,并且不能更改。使用arrayOf()函数或者arrayOfNulls()函数创建不可变数组。不可变数组中的元素值是固定的

2023年日经225指数研究报告

第一章指数概况1.1概述日经225指数,又被称为日经平均股票价格或日经225平均指数,通常被称为日经或日经指数,是东京证券交易所的一个重要股价指数。该指数自1950年起由日本经济新闻(TheNikkei)日报计算,它是一个以价格为权重的指数,以日元(JP¥)为单位,其组成部分每年审查一次。该指数涵盖了东京证券交易所第一

Git标签管理:从创建到推送的完整指南

🌷🍁博主猫头虎(🐅🐾)带您GotoNewWorld✨🍁🦄博客首页——🐅🐾猫头虎的博客🎐🐳《面试题大全专栏》🦕文章图文并茂🦖生动形象🐅简单易学!欢迎大家来踩踩~🌺🌊《IDEA开发秘籍专栏》🐾学会IDEA常用操作,工作效率翻倍~💐🌊《100天精通Golang(基础入门篇)》🐅学会Gol

RabbitMQ - 消息堆积问题的最佳解决方案?惰性队列

目录一、惰性队列1.1、消息堆积问题1.2、消息堆积问题的解决方法从消费者的角度:从队列的角度:1.3、引入惰性队列1.3.1、什么是惰性队列1.3.2、惰性队列的使用1.3.3、效果演示一、惰性队列1.1、消息堆积问题当生产者发送消息的速度超过了消费者处理消息的速度,就会导致队列中的消息堆积,直到队列存储消息到达上限

滴滴可观测平台 Metrics 指标实时计算如何实现了又准又省?

在滴滴,可观测平台的Metrics数据有一些实时计算的需求,承载这些实时计算需求的是一套又一套的Flink任务。之所以会有多套Flink任务,是因为每个服务按照其业务观测需要不同的指标计算,也就对应了不同数据处理拓扑。我们尽力抽象用户相同的计算需求,不过由于Flink实时计算任务开发模式和实时计算框架的限制,这些观测指

专业软件测评中心:关于软件性能测试的实用建议

软件性能测试是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。性能测试在软件的质量保证中起着重要的作用,它包括的测试内容丰富多样。一、软件性能测试的实用建议1、制定清晰的测试目标:明确测试目标和需求,以便更好地组织测试活动。2、选择合适的测试工具:根据测试需求选择适合的性能测试工具

支付宝支付对接-附带完整代码!!

支付宝对接文章目录支付宝对接1、大纲1.1整体业务流程图1.2、开发流程图1.3、核心参数1.4、支付宝开放平台1.5、支付应用场景1.6、支付宝入驻2、环境准备2.1首先注册自己的支付宝账号2.2沙箱环境2.3支持产品列表3、项目实现3.1、项目代码地址3.2、代码层级3.3、快速启动3.3.1环境准备3.3.2定义

PTA:L1-002 打印沙漏

L1-002打印沙漏分数20本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印*****************所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。给定任意N个符号,不一定

ChatGPT追祖寻宗:GPT-3技术报告要点解读

论文地址:https://arxiv.org/abs/2005.14165往期相关文章:ChatGPT追祖寻宗:GPT-1论文要点解读_五点钟科技的博客-CSDN博客ChatGPT追祖寻宗:GPT-2论文要点解读_五点钟科技的博客-CSDN博客本文的标题之所以取名技术报告而不是论文,是因为长达63页的GPT-3的这篇文

大数据科普

文章目录什么是大数据?大数据的特点大数据应用的挑战大数据技术大数据的发展前景什么是大数据?大数据是指规模巨大、增长快速、多样化的数据资源。随着数字化时代的到来,数据量呈现几何级别的增长,大数据的应用也越发广泛,如金融、医疗、物流等各个领域。大数据的特点大数据的特点主要体现在以下四个方面:量大:大数据的数据量通常是以TB

leetcode 399 除法求值

399.除法求值提示给你一个变量对数组equations和一个实数值数组values作为已知条件,其中equations[i]=[Ai,Bi]和values[i]共同表示等式Ai/Bi=values[i]。每个Ai或Bi是一个表示单个变量的字符串。另有一些以数组queries表示的问题,其中queries[j]=[Cj

热文推荐