用 vim quickfix 檢視 nLint 的錯誤訊息
就像大部分 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 檢查輸出了。