FPGA設(shè)計(jì)是無(wú)情的,所以我們需要利用能獲得的任何軟件進(jìn)行檢查。Verilator是一個(gè) Verilog 仿真器,還支持 linting:靜態(tài)分析設(shè)計(jì)中的問(wèn)題。Verilator 不僅可以發(fā)現(xiàn)綜合工具可能忽略的問(wèn)題,而且運(yùn)行速度也很快。Verilator 也非常適合使用 SDL 進(jìn)行圖形仿真。
安裝Verilator
Verilator 在大多數(shù) Linux 發(fā)行版存儲(chǔ)庫(kù)中都可用,并適用于 Windows 子 Linux 系統(tǒng)上運(yùn)行。
對(duì)于 Debian 和基于 Ubuntu 的發(fā)行版,可以使用 apt 安裝 Verilator:
aptupdate aptinstallverilator
蘋果系統(tǒng)
在 macOS 上,可以通過(guò)Homebrew包管理器安裝最新版本的 Verilator :
brewinstallverilator
要為其他平臺(tái)(例如 FreeBSD)安裝 Verilator,請(qǐng)參閱官方Verilator 安裝指南。
基本 Linting
對(duì)于獨(dú)立模塊,linting 本身就很簡(jiǎn)單:
verilator--lint-only-Wallfoo.v
--lint-only-告訴Verilator進(jìn)行l(wèi)int但不生成任何仿真輸出 -Wall-打開(kāi)額外的風(fēng)格檢查
如果一切順利,將不會(huì)看到來(lái)自 Verilator 的消息。
如果 Verilator 發(fā)現(xiàn)潛在問(wèn)題,它會(huì)提供明確的建議,包括如何禁用警告。Verilator 手冊(cè)包含可能的警告列表。
讓我們創(chuàng)建一個(gè)簡(jiǎn)單的“add”模塊,并設(shè)置幾個(gè)問(wèn)題,然后對(duì)其進(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è)問(wèn)題是寬度:x和y是 4 位寬,但z沒(méi)有明確的寬度,因此只有 1 位寬。
我們可以通過(guò)這樣做來(lái)忽略寬度警告:
always@(posedgeclk)begin /*verilatorlint_offWIDTH*/ z<=?x?+?y; ????????/*?verilator?lint_on?WIDTH?*/ ????end
這僅僅是隱藏了問(wèn)題,卻沒(méi)有采取任何措施。
相反,我們可以通過(guò)將z的寬度設(shè)置為 4 來(lái)修復(fù)該問(wèn)題:
outputreg[3:0]z,
雖然這消除了 Verilator 警告,但可能無(wú)法完全解決問(wèn)題。
例如,如果x和y都是4'b1000,會(huì)發(fā)生什么?我們的加法溢出,計(jì)算出z值4'b0000。此示例說(shuō)明了 linting 的局限性之一:它可以查看不同信號(hào)的寬度,但無(wú)法解釋應(yīng)用于它們的所有邏輯。
因此,除了固定z的寬度外,我們還可以將其用作c進(jìn)位信號(hào),這也解決了“信號(hào)未驅(qū)動(dòng)”警告:
always@(posedgeclk)begin {c,z}<=?x?+?y; ????end
依賴關(guān)系和路徑
如果一個(gè)模塊依賴于另一個(gè)模塊會(huì)發(fā)生什么?Verilator 將在當(dāng)前路徑中搜索匹配的模塊。如果想向模塊搜索路徑添加其他目錄,我們可以使用-I. 例如,如果top.v依賴于../maths目錄中的模塊:
verilator--lint-only-Wall-I../mathstop.v
可以使用多個(gè)-I參數(shù)來(lái)包含多個(gè)目錄。
黑匣子和空模塊
大多數(shù)設(shè)計(jì)依賴于沒(méi)有源的供應(yīng)商原語(yǔ)或 IP 核,例如使用 PLL 生成時(shí)鐘。當(dāng)嘗試對(duì)引用供應(yīng)商原語(yǔ)的模塊進(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)過(guò)精心設(shè)計(jì)就無(wú)法檢查,需要整個(gè)設(shè)計(jì)”。我們可以通過(guò)為原語(yǔ)創(chuàng)建一個(gè)空模塊來(lái)解決這個(gè)問(wèn)題??漳K包含 IO,但不包含任何邏輯。
例如,為 Xilinx 的 BUFG 原語(yǔ)創(chuàng)建了一個(gè)空模塊:
moduleBUFG( inputwirelogicI, outputlogicO ); //NULLMODULE endmodule
創(chuàng)建空模塊有點(diǎn)乏味,但可以檢查整個(gè)設(shè)計(jì)。要使用 null 模塊,請(qǐng)確保它位于 Verilator 的搜索路徑中(請(qǐng)參閱上一節(jié))。
Linting Waivers
如果需要對(duì)較大的設(shè)計(jì)或使用第三方源的設(shè)計(jì)消除 linter 警告,那么/* verilator lint_off */注釋可能不行。從 Verilator 4.028 開(kāi)始,可以創(chuàng)建Waivers來(lái)處理警告,而無(wú)需觸及源代碼。要了解更多信息,請(qǐng)參閱 Stefan Wallentowitz 的帖子Verilator Waivers(https://wallento.cs.hm.edu/post/20200612-verilator-waivers/)。
Linting Shell Script
如果有許多頂級(jí)模塊和/或包含目錄,可以使用 Makefile 或簡(jiǎn)單的 shell 腳本自動(dòng)檢查。
以下 shell 腳本 lint 與該腳本位于同一目錄中的所有頂級(jí)模塊:
#!/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)大的工具,希望有興趣的可以嘗試一下~
審核編輯:劉清
-
FPGA設(shè)計(jì)
+關(guān)注
關(guān)注
9文章
428瀏覽量
26644 -
仿真器
+關(guān)注
關(guān)注
14文章
1019瀏覽量
83963 -
SDL
+關(guān)注
關(guān)注
0文章
18瀏覽量
7448 -
靜態(tài)分析
+關(guān)注
關(guān)注
1文章
41瀏覽量
3912 -
macOS系統(tǒng)
+關(guān)注
關(guān)注
0文章
9瀏覽量
1570
原文標(biāo)題:使用 Verilator 進(jìn)行 Verilog Lint
文章出處:【微信號(hào):Open_FPGA,微信公眾號(hào):OpenFPGA】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
Verilog
怎樣對(duì)ADC進(jìn)行采集呢
怎樣對(duì)光敏電阻進(jìn)行ADC的采集呢
怎樣對(duì)stm32 cubemx進(jìn)行配置呢
怎樣對(duì)STM32的啟動(dòng)文件進(jìn)行解析呢
怎樣使用keil的Event Recorder中間件進(jìn)行打印呢
怎樣對(duì)LORA的通信距離進(jìn)行測(cè)試呢
簡(jiǎn)單介紹在Windows系統(tǒng)下安裝Verilator的步驟
應(yīng)用Verilog HDL進(jìn)行數(shù)字系統(tǒng)設(shè)計(jì)實(shí)例
![應(yīng)用<b class='flag-5'>Verilog</b> HDL<b class='flag-5'>進(jìn)行</b>數(shù)字系統(tǒng)設(shè)計(jì)實(shí)例](https://file.elecfans.com/web2/M00/49/24/pYYBAGKhtDuAagECAAANrQGfq1c598.jpg)
如何使用Icarus Verilog+GTKWave來(lái)進(jìn)行verilog文件的編譯和仿真
![如何使用Icarus <b class='flag-5'>Verilog</b>+GTKWave來(lái)<b class='flag-5'>進(jìn)行</b><b class='flag-5'>verilog</b>文件的編譯和仿真](https://file.elecfans.com/web2/M00/0C/09/poYBAGD_X16AZ72RAAAYDjK7x2s315.png)
如何在SpyGlass環(huán)境本身中修復(fù)這些Lint錯(cuò)誤呢?
![如何在SpyGlass環(huán)境本身中修復(fù)這些<b class='flag-5'>Lint</b>錯(cuò)誤<b class='flag-5'>呢</b>?](https://file1.elecfans.com/web2/M00/90/61/wKgZomTZjVGAJHBxAAA5zVH37e4222.png)
評(píng)論