0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

怎样使用Verilator进行Verilog Lint呢?

OpenFPGA 来源:OpenFPGA 2023-09-20 09:05 次阅读

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

安装Verilator

Linux

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

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

aptupdate
aptinstallverilator

苹果系统

在 macOS 上,可以通过Homebrew包管理器安装最新版本的 Verilator :

brewinstallverilator

要为其他平台(例如 FreeBSD)安装 Verilator,请参阅官方Verilator 安装指南。

基本 Linting

对于独立模块,linting 本身就很简单:

verilator--lint-only-Wallfoo.v
--lint-only-告诉Verilator进行lint但不生成任何仿真输出
-Wall-打开额外的风格检查

如果一切顺利,将不会看到来自 Verilator 的消息。

如果 Verilator 发现潜在问题,它会提供明确的建议,包括如何禁用警告。Verilator 手册包含可能的警告列表。

让我们创建一个简单的“add”模块,并设置几个问题,然后对其进行 lint:

`default_nettypenone

moduleadd(
inputwireclk,
inputwire[3:0]x,
inputwire[3:0]y,
outputregz,
outputregc
);

always@(posedgeclk)begin
z<= x + y;
    end
endmodule

进行lint检查

$verilator--lint-only-Walladd.v
%Warning-WIDTH:add.v11:OperatorASSIGNDLYexpects1bitsontheAssignRHS,butAssignRHS'sADDgenerates4bits.
:...Ininstanceadd
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@(posedgeclk)begin
/*verilatorlint_offWIDTH*/
z<= x + y;
        /* verilator lint_on WIDTH */
    end

这仅仅是隐藏了问题,却没有采取任何措施。

相反,我们可以通过将z的宽度设置为 4 来修复该问题:

outputreg[3:0]z,

虽然这消除了 Verilator 警告,但可能无法完全解决问题。

例如,如果x和y都是4'b1000,会发生什么?我们的加法溢出,计算出z值4'b0000。此示例说明了 linting 的局限性之一:它可以查看不同信号的宽度,但无法解释应用于它们的所有逻辑。

因此,除了固定z的宽度外,我们还可以将其用作c进位信号,这也解决了“信号未驱动”警告:

always@(posedgeclk)begin
{c,z}<= x + y;
    end

依赖关系和路径

如果一个模块依赖于另一个模块会发生什么?Verilator 将在当前路径中搜索匹配的模块。如果想向模块搜索路径添加其他目录,我们可以使用-I. 例如,如果top.v依赖于../maths目录中的模块:

verilator--lint-only-Wall-I../mathstop.v

可以使用多个-I参数来包含多个目录。

黑匣子和空模块

大多数设计依赖于没有源的供应商原语或 IP 核,例如使用 PLL 生成时钟。当尝试对引用供应商原语的模块进行 lint 处理时,将收到如下错误:

%Error:clock_pix.sv5:Cannotfindfilecontainingmodule:'MMCME2_BASE'
29|MMCME2_BASE#(
|^~~~~~~~~~~
%Error:clock_pix.sv5:Thismaybebecausethere'snosearchpathspecifiedwith-I.
29|MMCME2_BASE#(
|^~~~~~~~~~~
...Lookedin:
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 原语创建了一个空模块:

moduleBUFG(
inputwirelogicI,
outputlogicO
);

//NULLMODULE

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"##Lintingtopmodulesin${DIR}"
forfin${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介绍就这样,这是一个功能强大的工具,希望有兴趣的可以尝试一下~






审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA设计
    +关注

    关注

    9

    文章

    373

    浏览量

    26124
  • 仿真器
    +关注

    关注

    14

    文章

    840

    浏览量

    82465
  • SDL
    SDL
    +关注

    关注

    0

    文章

    16

    浏览量

    7224
  • 静态分析
    +关注

    关注

    1

    文章

    28

    浏览量

    3770
  • macOS系统
    +关注

    关注

    0

    文章

    9

    浏览量

    1476
收藏 人收藏

    评论

    相关推荐

    Verilog

    Verilog的菜鸟,最近写testbench总是出错,还请大家能告诉我写测试模块到底是有个怎样的规则,比如下面这个四位全加器代码的testbench该以怎样的步骤来写
    发表于 10-18 14:59

    怎样对ADC进行采集

    怎样去计算ADC的转换时间?怎样对ADC进行采集怎样去计算ADC采集的值
    发表于 10-20 06:21

    怎样对光敏电阻进行ADC的采集

    怎样去使用光敏电阻怎样对光敏电阻进行ADC的采集?ADC采集的数据是如何控制小灯的明暗变化的?
    发表于 10-25 07:48

    怎样对stm32 cubemx进行配置

    怎样对stm32 cubemx进行配置?如何利用Proteus对stm32 cubem进行仿真
    发表于 10-28 06:14

    怎样对STM32的启动文件进行解析

    怎样对STM32的启动文件进行解析
    发表于 11-26 07:32

    怎样通过IAP来对STM32进行在线升级

    怎样的?怎样通过IAP来对STM32进行在线升级
    发表于 11-30 07:39

    怎样去解决NVIC_EnableIRQ使能无法进行的问题

    进行这是为什么怎样去解决NVIC_EnableIRQ使能无法进行的问题
    发表于 01-18 06:21

    怎样使用keil的Event Recorder中间件进行打印

    怎样使用keil的Event Recorder中间件进行打印?有何缺点?怎样使用jlink-RTT Viewer组件进行打印?有何缺点?
    发表于 01-19 06:44

    怎样对LORA的通信距离进行测试

    怎样对LORA的通信距离进行测试?其测试结果怎样
    发表于 02-21 06:41

    怎样使用DMA进行串口通信

    怎样使用DMA进行串口通信
    发表于 02-24 07:49

    简单介绍在Windows系统下安装Verilator的步骤

    Verilator,无论是在Mac还是Linux下安装都很轻松,唯独在Windows下安装是一件令人头疼的事情,由于个人很少在Windows下进行开发
    发表于 07-05 15:06

    应用Verilog HDL进行数字系统设计实例

    Verilog HDL进行数字系统设计实例
    发表于 09-27 16:30 86次下载
    应用<b>Verilog</b> HDL<b>进行</b>数字系统设计实例

    Verilator高性能Verilog HDL模拟器与lint系统

    verilator.zip
    发表于 04-14 11:11 1次下载
    <b>Verilator</b>高性能<b>Verilog</b> HDL模拟器与<b>lint</b>系统

    关于PC-lint,以及如何在MDK中添加PC-lint工具

    lint,以及如何在MDK中添加PC-lint工具
    的头像 发表于 03-04 09:31 3487次阅读
     关于PC-<b>lint</b>,以及如何在MDK中添加PC-<b>lint</b>工具

    如何使用Icarus Verilog+GTKWave来进行verilog文件的编译和仿真

    Verilog+GTKWave来进行verilog文件的编译和仿真。 Icarus Verilog Icarus Verilog极其小巧,支持全平台
    的头像 发表于 07-27 09:16 4020次阅读
    如何使用Icarus <b>Verilog</b>+GTKWave来<b>进行</b><b>verilog</b>文件的编译和仿真