FPGA設計是無情的,所以我們需要利用能獲得的任何軟件進行檢查。Verilator是一個 Verilog 仿真器,還支持 linting:靜態分析設計中的問題。Verilator 不僅可以發現綜合工具可能忽略的問題,而且運行速度也很快。Verilator 也非常適合使用 SDL 進行圖形仿真。
安裝Verilator
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 “不經過精心設計就無法檢查,需要整個設計”。我們可以通過為原語創建一個空模塊來解決這個問題??漳K包含 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文章
428瀏覽量
26632 -
仿真器
+關注
關注
14文章
1019瀏覽量
83941 -
SDL
+關注
關注
0文章
18瀏覽量
7434 -
靜態分析
+關注
關注
1文章
41瀏覽量
3909 -
macOS系統
+關注
關注
0文章
9瀏覽量
1565
原文標題:使用 Verilator 進行 Verilog Lint
文章出處:【微信號:Open_FPGA,微信公眾號:OpenFPGA】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論