用 vim quickfix 檢視 nLint 的錯誤訊息

Share on:

本文內容採用創用 CC 姓名標示-非商業性-相同方式分享 3.0 台灣 授權條款授權.

就像大部分 IDE 一樣,Vim 的 quickfix 提供了快速跳到編譯出錯的位置的功能,例如當我們在 vim 下 :make 命令之後,可以透過 :copen 檢視編譯的錯誤,並且在其中移動。

另一方面,nLint 是檢查 Verilog 語法、coding style 錯誤最常用的工具,可以告訴你在程式碼的哪邊寫出了不能合成的 Verilog,其完整功能並不是今天的主題,這邊就不贅述。

當檢查出錯誤的 Verilog 位置之後,我們可以選擇開啟 nLint GUI 使用跳躍功能,但是往往因為 EDA tool 的介面一般很醜、網路很卡、功能也很陽春之類的理由。我們會希望使用 command line 模式。

當然,EDA 公司也知道有這樣的需求,所以提供了輸出到檔案(-out error.txt)或是螢幕(-out screen)的功能,但是這樣一來我們就失去了 GUI 工具的跳躍功能,很不方便。

一個簡單的作法就是跟讓 vim 可以解讀 nLint 的輸出,為此需要把 nLint 的輸出轉換成 quickfix 能讀取的格式。Quickfix 要求格式如下,每個錯誤對應到如下的一行:

1File|LineNumber|ErrorMessage

就是檔案、行數、錯誤訊息,中間用直槓分隔開來。

另一方面,檢視 nLint 的輸出,我們要使用的行大概長這樣:

1File(LineNumber): ErrorMessage

但是其中會穿插不是這個格式的行,這些行對我們並沒有用。所以我們先用 grep 把無用的行去掉,接著用 sed 加上 regular expression 把行數的括號換成直槓。

 1LINT = nLint -sv
 2GCMD = grep ' \(Error\|Warning\)'
 3SCMD = sed 's/(\([0-9]\+\)):/|\1|/'
 4
 5lint_module1: FORCE
 6   @$(LINT) module1.sv | $(GCMD) | $(SCMD)
 7
 8lint_module2: FORCE
 9   @$(LINT) module2.sv | $(GCMD) | $(SCMD)
10
11FORCE:

完成之後,只要在 vim 命令列打 :make lint_module1,就可以用 quickfix 檢查輸出了。