0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

怎樣使用Verilator進(jìn)行Verilog Lint呢?

OpenFPGA ? 來源:OpenFPGA ? 2023-09-20 09:05 ? 次閱讀

FPGA設(shè)計(jì)是無情的,所以我們需要利用能獲得的任何軟件進(jìn)行檢查。Verilator是一個(gè) Verilog 仿真器,還支持 linting:靜態(tài)分析設(shè)計(jì)中的問題。Verilator 不僅可以發(fā)現(xiàn)綜合工具可能忽略的問題,而且運(yùn)行速度也很快。Verilator 也非常適合使用 SDL 進(jìn)行圖形仿真。

安裝Verilator

Linux

Verilator 在大多數(shù) Linux 發(fā)行版存儲庫中都可用,并適用于 Windows 子 Linux 系統(tǒng)上運(yùn)行。

對于 Debian 和基于 Ubuntu 的發(fā)行版,可以使用 apt 安裝 Verilator:

aptupdate
aptinstallverilator

蘋果系統(tǒng)

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

brewinstallverilator

要為其他平臺(例如 FreeBSD)安裝 Verilator,請參閱官方Verilator 安裝指南。

基本 Linting

對于獨(dú)立模塊,linting 本身就很簡單:

verilator--lint-only-Wallfoo.v
--lint-only-告訴Verilator進(jìn)行l(wèi)int但不生成任何仿真輸出
-Wall-打開額外的風(fēng)格檢查

如果一切順利,將不會看到來自 Verilator 的消息。

如果 Verilator 發(fā)現(xiàn)潛在問題,它會提供明確的建議,包括如何禁用警告。Verilator 手冊包含可能的警告列表。

讓我們創(chuàng)建一個(gè)簡單的“add”模塊,并設(shè)置幾個(gè)問題,然后對其進(jìn)行 lint:

`default_nettypenone

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

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

進(jìn)行l(wèi)int檢查

$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)

第一個(gè)問題是寬度:x和y是 4 位寬,但z沒有明確的寬度,因此只有 1 位寬。

我們可以通過這樣做來忽略寬度警告:

always@(posedgeclk)begin
/*verilatorlint_offWIDTH*/
z<=?x?+?y;
????????/*?verilator?lint_on?WIDTH?*/
????end

這僅僅是隱藏了問題,卻沒有采取任何措施。

相反,我們可以通過將z的寬度設(shè)置為 4 來修復(fù)該問題:

outputreg[3:0]z,

雖然這消除了 Verilator 警告,但可能無法完全解決問題。

例如,如果x和y都是4'b1000,會發(fā)生什么?我們的加法溢出,計(jì)算出z值4'b0000。此示例說明了 linting 的局限性之一:它可以查看不同信號的寬度,但無法解釋應(yīng)用于它們的所有邏輯。

因此,除了固定z的寬度外,我們還可以將其用作c進(jìn)位信號,這也解決了“信號未驅(qū)動(dòng)”警告:

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

依賴關(guān)系和路徑

如果一個(gè)模塊依賴于另一個(gè)模塊會發(fā)生什么?Verilator 將在當(dāng)前路徑中搜索匹配的模塊。如果想向模塊搜索路徑添加其他目錄,我們可以使用-I. 例如,如果top.v依賴于../maths目錄中的模塊:

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

可以使用多個(gè)-I參數(shù)來包含多個(gè)目錄。

黑匣子和空模塊

大多數(shù)設(shè)計(jì)依賴于沒有源的供應(yīng)商原語或 IP 核,例如使用 PLL 生成時(shí)鐘。當(dāng)嘗試對引用供應(yīng)商原語的模塊進(jìn)行 lint 處理時(shí),將收到如下錯(cuò)誤:

%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

第一個(gè)想法可能是找到一種排除MMCME2_BASElint 的方法。唉,Verilog “不經(jīng)過精心設(shè)計(jì)就無法檢查,需要整個(gè)設(shè)計(jì)”。我們可以通過為原語創(chuàng)建一個(gè)空模塊來解決這個(gè)問題??漳K包含 IO,但不包含任何邏輯。

例如,為 Xilinx 的 BUFG 原語創(chuàng)建了一個(gè)空模塊:

moduleBUFG(
inputwirelogicI,
outputlogicO
);

//NULLMODULE

endmodule

創(chuàng)建空模塊有點(diǎn)乏味,但可以檢查整個(gè)設(shè)計(jì)。要使用 null 模塊,請確保它位于 Verilator 的搜索路徑中(請參閱上一節(jié))。

Linting Waivers

如果需要對較大的設(shè)計(jì)或使用第三方源的設(shè)計(jì)消除 linter 警告,那么/* verilator lint_off */注釋可能不行。從 Verilator 4.028 開始,可以創(chuàng)建Waivers來處理警告,而無需觸及源代碼。要了解更多信息,請參閱 Stefan Wallentowitz 的帖子Verilator Waivers(https://wallento.cs.hm.edu/post/20200612-verilator-waivers/)。

Linting Shell Script

如果有許多頂級模塊和/或包含目錄,可以使用 Makefile 或簡單的 shell 腳本自動(dòng)檢查。

以下 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

可以調(diào)整-I參數(shù)以適合自己的設(shè)置。top_*.*v捕獲擴(kuò)展名為 .v 和 .sv 的文件。

總結(jié)

今天關(guān)于Verilator 進(jìn)行 Verilog Lint介紹就這樣,這是一個(gè)功能強(qiáng)大的工具,希望有興趣的可以嘗試一下~






審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • FPGA設(shè)計(jì)
    +關(guān)注

    關(guān)注

    9

    文章

    428

    瀏覽量

    26452
  • 仿真器
    +關(guān)注

    關(guān)注

    14

    文章

    1011

    瀏覽量

    83559
  • SDL
    SDL
    +關(guān)注

    關(guān)注

    0

    文章

    18

    瀏覽量

    7366
  • 靜態(tài)分析
    +關(guān)注

    關(guān)注

    1

    文章

    38

    瀏覽量

    3869
  • macOS系統(tǒng)
    +關(guān)注

    關(guān)注

    0

    文章

    9

    瀏覽量

    1535

原文標(biāo)題:使用 Verilator 進(jìn)行 Verilog Lint

文章出處:【微信號:Open_FPGA,微信公眾號:OpenFPGA】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    Verilog

    各位大神們,我是剛開始學(xué)Verilog的菜鳥,最近寫testbench總是出錯(cuò),還請大家能告訴我寫測試模塊到底是有個(gè)怎樣的規(guī)則,比如下面這個(gè)四位全加器代碼的testbench該以怎樣
    發(fā)表于 10-18 14:59

    怎樣對ADC進(jìn)行采集

    怎樣去計(jì)算ADC的轉(zhuǎn)換時(shí)間?怎樣對ADC進(jìn)行采集?怎樣去計(jì)算ADC采集的值?
    發(fā)表于 10-20 06:21

    怎樣對光敏電阻進(jìn)行ADC的采集

    怎樣去使用光敏電阻?怎樣對光敏電阻進(jìn)行ADC的采集?ADC采集的數(shù)據(jù)是如何控制小燈的明暗變化的?
    發(fā)表于 10-25 07:48

    怎樣對stm32 cubemx進(jìn)行配置

    怎樣對stm32 cubemx進(jìn)行配置?如何利用Proteus對stm32 cubem進(jìn)行仿真?
    發(fā)表于 10-28 06:14

    怎樣對STM32的啟動(dòng)文件進(jìn)行解析

    如何用匯編語言去編寫STM32的啟動(dòng)文件?怎樣對STM32的啟動(dòng)文件進(jìn)行解析
    發(fā)表于 11-26 07:32

    怎樣使用keil的Event Recorder中間件進(jìn)行打印

    怎樣使用keil的Event Recorder中間件進(jìn)行打印?有何缺點(diǎn)?怎樣使用jlink-RTT Viewer組件進(jìn)行打???有何缺點(diǎn)?
    發(fā)表于 01-19 06:44

    怎樣對LORA的通信距離進(jìn)行測試

    怎樣對LORA的通信距離進(jìn)行測試?其測試結(jié)果怎樣?
    發(fā)表于 02-21 06:41

    怎樣使用DMA進(jìn)行串口通信

    串口通信的原理是什么?串口通信有哪幾種方式?怎樣使用DMA進(jìn)行串口通信
    發(fā)表于 02-24 07:49

    簡單介紹在Windows系統(tǒng)下安裝Verilator的步驟

    眾所周知,SpinalHDL仿真目前仿真器首推Verilator,無論是在Mac還是Linux下安裝都很輕松,唯獨(dú)在Windows下安裝是一件令人頭疼的事情,由于個(gè)人很少在Windows下進(jìn)行開發(fā)
    發(fā)表于 07-05 15:06

    應(yīng)用Verilog HDL進(jìn)行數(shù)字系統(tǒng)設(shè)計(jì)實(shí)例

    本內(nèi)容介紹了應(yīng)用Verilog HDL進(jìn)行數(shù)字系統(tǒng)設(shè)計(jì)實(shí)例
    發(fā)表于 09-27 16:30 ?88次下載
    應(yīng)用<b class='flag-5'>Verilog</b> HDL<b class='flag-5'>進(jìn)行</b>數(shù)字系統(tǒng)設(shè)計(jì)實(shí)例

    關(guān)于PC-lint,以及如何在MDK中添加PC-lint工具

    關(guān)于PC-lint,以及如何在MDK中添加PC-lint工具
    的頭像 發(fā)表于 03-04 09:31 ?4347次閱讀
     關(guān)于PC-<b class='flag-5'>lint</b>,以及如何在MDK中添加PC-<b class='flag-5'>lint</b>工具

    如何使用Icarus Verilog+GTKWave來進(jìn)行verilog文件的編譯和仿真

    本文將介紹如何使用Icarus Verilog+GTKWave來進(jìn)行verilog文件的編譯和仿真。 Icarus Verilog Icarus V
    的頭像 發(fā)表于 07-27 09:16 ?5187次閱讀
    如何使用Icarus <b class='flag-5'>Verilog</b>+GTKWave來<b class='flag-5'>進(jìn)行</b><b class='flag-5'>verilog</b>文件的編譯和仿真

    Verilator高性能Verilog HDL模擬器與lint系統(tǒng)

    verilator.zip
    發(fā)表于 04-14 11:11 ?1次下載
    <b class='flag-5'>Verilator</b>高性能<b class='flag-5'>Verilog</b> HDL模擬器與<b class='flag-5'>lint</b>系統(tǒng)

    如何在SpyGlass環(huán)境本身中修復(fù)這些Lint錯(cuò)誤?

    我們將分析 lint目標(biāo)運(yùn)行期間產(chǎn)生的違規(guī)行為。我們可以使用 SpyGlass GUI 中的各種調(diào)試工具來了解違規(guī)
    的頭像 發(fā)表于 08-14 10:08 ?2742次閱讀
    如何在SpyGlass環(huán)境本身中修復(fù)這些<b class='flag-5'>Lint</b>錯(cuò)誤<b class='flag-5'>呢</b>?

    SpyGlass?Lint Turbo結(jié)構(gòu)用戶指南

    電子發(fā)燒友網(wǎng)站提供《SpyGlass?Lint Turbo結(jié)構(gòu)用戶指南.pdf》資料免費(fèi)下載
    發(fā)表于 12-21 09:48 ?0次下載