windows 下使用 verilator 做Emacs flycheck 的后端进行代码语法检查

找来找去, 也只有verilator 最适合做语法检查了, verilator不仅提供错误行号, 还列号, 不像svlint 只有错误信息

Msys2 下MINGW64 终端安装 verilator

使用

1
pacman -Ss verilator

可以搜索到包含verilator 关键字的所有包

1
pacmsn -S mingw-w64-x86_64-verilator

即可完成安装

Emacs 端flycheck 的verilator配置

因为flycheck 默认在verilog-mode 下会使用 verilator 来做语法检查, 所以这里不需要对flycheck 配置
由于 verilator 是从 MINGW64 中安装的, 所以Emacs 的Shell 必须设置为Mingw64 下的bash.exe 否则, 运行会有问题
以 Doom Emacs 为例

Msys2 (Mingw64) 使用Windows 环境变量

因为默认情况下Mingw64 用不了Windows 的环境变量, 如果不把Windows 的环境变量包进来的话, 在Emacs 中运行很多Windows 软件会找不到路径
只需要在Windows 中增加一个环境变量, 变量名为 MSYS2_PATH_TYPE , 值为 inherit

然后重启 Mingw64 即可生效

在Mingw64 终端下执行 doom sync 生成doom 的env 环境变量文件

由于使用 mingw64 作为SHELL 可能会导致git 出现 git@gitee.com: Permission denied (publickey) 类似的情况
这时候只需要重新生成key 再在 gitee 或者 github 上重新添加即可

重启Emacs

正常情况下打开sv 或者 verilog 文件就可以看到flycheck 已经在使用verilator 来工作了

flycheck 工作原理

verilog 的flycheck checker

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
(flycheck-def-option-var flycheck-verilator-include-path nil verilog-verilator
  "A list of include directories for Verilator.

The value of this variable is a list of strings, where each
string is a directory to add to the include path of Verilator.
Relative paths are relative to the file being checked."
  :type '(repeat (directory :tag "Include directory"))
  :safe #'flycheck-string-list-p
  :package-version '(flycheck . "0.24"))

(flycheck-define-checker verilog-verilator
  "A Verilog syntax checker using the Verilator Verilog HDL simulator.

See URL `https://www.veripool.org/wiki/verilator'."
  :command ("verilator" "--lint-only" "-Wall" "--quiet-exit"
            (option-list "-I" flycheck-verilator-include-path concat)
            source)
  :error-patterns
  ((warning line-start "%Warning"
            (? "-" (id (+ (any "0-9A-Z_")))) ": "
            (? (file-name) ":" line ":" (? column ":") " ")
            (message) line-end)
   (error line-start "%Error"
          (? "-" (id (+ (any "0-9A-Z_")))) ": "
          (? (file-name) ":" line ":" (? column ":") " ")
          (message) line-end))
  :modes verilog-mode)

手动运行命令结果

flycheck 运行机制分析

  1. 首先flycheck 会调用 checker 中的command
  2. 根据 checker 中的 error-patterns 来提取错误信息( 包含行号, 列号, 错误信息等)
  3. 结果展示

所以如果flycheck 的结果不符合预期, 可以手动执行command 中的命令, 然后看看是不是error-patterns 解析不对

emacs verilator 可能会遇到的问题

在 emacs 中打开eshell 输入 verilator –help

/usr/bin/env: command not found

出现这个问题的原因是没有/usr/bin/env 这个解析器, 因此我们需要修改verilator 这个perl 脚本或者显式的用perl 来调用

解决办法1 ( 试了下, 不太行还是看办法2 吧 )

修改verilator 把第一行的 #!/usr/bin/env perl 改成 #!perl
推荐这种办法, 比较灵活通用, 只要在shell 中能找到 perl 即可
很遗憾, 这种办法在Emacs 中无效… 虽然在eshell 里面可以直接运行了, 但是flycheck 还是不认

解决办法2

通过查找 verilator 可以发现, 这其实是一个perl 脚本, 经过实验发现指定使用msys2 的perl 来运行这个脚本就可以了

在verilator 同级目录下如( E:\msys64\mingw64\bin ), 新建一个verilator.bat

1
E:\msys64\usr\bin\perl.exe E:\msys64\mingw64\bin\verilator_perl %*

把verilator 重命名为 verilator_perl

这样只要运行 verilator 就是运行 E:\msys64\usr\bin\perl.exe E:\msys64\mingw64\bin\verilator_perl %*

Enjoy!