用 Sublime Text 在 MacOS 上进行 Verilog 书写 & 仿真 的配置经验
justaLoli

太长不看版:

  • 语法高亮:sublime插件Verilog和SystemVerilog
  • 代码补全:sublime插件lsp;命令行工具vls
  • 代码编译工具:Icarus Verilog(iverilog)
  • 波形查看工具:surfer(也可以选择其它)

代码高亮

Sublime Text默认没有针对Verilog的代码高亮,我们可以通过安装插件来实现。

安装插件Verilog和SystemVerilog。安装方法可以从别处找到,简而言之是通过Package Control: Install Package来安装。

Verilog和SystemVerilog是两个独立的插件,原则上选择其一即可。两个都要安装的原因之后会说明。

对于语法高亮,SystemVerilog插件的效果更好。打开一个.v的verilog文件,从菜单栏选择View -> Syntax -> Open all with current extension as... -> SystemVerilog,之后所有.v文件都会被以SystemVerilog扩展提供的高亮显示。

note:即便叫做systemverilog,由于我们只要代码高亮功能,它是可以完美兼容我们的verilog代码的

代码补全

systemverilog插件自己有一个简单的弹框,但是做的很差。我们要将其禁用。在SystemVerilog插件的设置中,增加这一段:

1
2
3
4
{
"sv.status" : false, // True to display Current context in the status bar (Module/class/function/task name)
"sv.tooltip" : false, // True to display information in a tooltip (sublime 3072+), false to use the status bar instead
}

取而代之,选择大名鼎鼎的LSP服务。LSP是Language Server Protocol的缩写,是一种通用的语言服务器协议。

  • Sublime Text下载LSP

通过Package Control: Install Package安装LSP即可。之后可能要重启Sublime Text。

  • 下载vls

vls是针对verilog的一个LSP服务。配置好后,Sublime会自动调用vls来进行代码补全等操作。

项目的Github页面下载当前版本。解压,得到一个名为vls的可执行文件。将其/usr/local/bin(你可能要通过终端进行移动)。

1
2
# 替换其中的~/Downloads/vls为你下载的vls文件的路径
sudo mv ~/Downloads/vls /usr/local/bin

还可能需要配置权限以保证vls可以被执行:

1
sudo chmod +x /usr/local/bin/vls

完成后,在终端键入vls --help观察是否有输出。如果有,说明vls已经配置成功。

  • 配置Sublime-LSP

打开Sublime中的LSP设置,增加这一段:

1
2
3
4
5
6
7
8
9
10
11
12
13
// ~/Library/Application Support/Sublime Text/Packages/User/LSP.sublime-settings
// Settings in here override those in "LSP/LSP.sublime-settings"
{
"clients": {
"verilog": {
"enabled": true,
"command": [
"vls",
],
"selector":"source.verilog | source.systemverilog",
},
},
}

重启Sublime Text,打开一个verilog文件,鼠标停留在一个变量上,能看到一个弹框,并且有一些“转到定义”、“查找引用”等选项,说明代码补全已经生效。

这里解释一下要装Verilog和Systemverilog两个插件的原因:代码补全里面的代码高亮需要用到Verilog,如果只用Systemverilog,LSP的弹框里面的内容没法被正确高亮。这确实很不优雅但是,well

编译

我们使用Icarus Verilog(简称iverilog)来进行代码编译。

1
brew install icarus-verilog

等待安装完成。

完成后,输入iverilog,如果有输出,说明安装成功。

原则上,如果安装了iverilog,先前安装的LSP可以在代码中实时高亮语法错误的部分。

  • 编译一个文件
1
iverilog -y . -o hello hello.v

解释: -y . 表示搜索当前目录下的文件,如果你的top模块调用了其它文件中的模块,编译器会帮你搜索到它们;-o hello 表示输出文件名为hello。hello.v是你的顶层模块文件。

  • 编译完成后运行
1
vvp hello

解释:vvp是iverilog的运行命令,后面跟着的是你的刚刚输出文件名。现在你从控制台可以看见你的一些$display()调试输出。

  • 重要:生成波形

一般的testbench代码运行不会生成波形。一定要在你的testbench代码中加入这两行:

1
2
3
4
initial begin
$dumpfile("dump.vcd"); //表示将波形输出到dump.vcd文件中
$dumpvars(); //表示将所有变量都保存在输出中
end
  • 将编译过程整合进Sublime Text

Tool -> Build System -> New Build System,输入以下内容,并保存为iVerilog.sublime-build

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// ~/Library/Application Support/Sublime Text/Packages/User/iVerilog.sublime-build
{
"shell_cmd": "iverilog -y . -o ${file_base_name} ${file} ",
"working_dir": "${file_path}",
"file_patterns": ["*.v"],

"variants":
[
{
"name": "Run",
"shell_cmd": "iverilog -y . -o ${file_base_name} ${file} && vvp ${file_base_name} "
},
{
"name": "Open Surfer",
"shell_cmd": "iverilog -y . -o ${file_base_name} ${file} && vvp ${file_base_name} && surfer"
}
]
}

这样,在Sublime中按下Cmd+B即可编译你的代码。按下Cmd+Shift+B可以选择编译模式。这里定义了几个模式:

  1. 仅编译(默认)
  2. 编译后执行(带Run)
  3. 执行完毕后打开波形查看器(参见下一部分)

波形查看

传统方案是使用gtkwave查看。不过gtkwave不支持m1以上的mac芯片。我们要另辟蹊径。

经过一些查找,我们可以使用surfer(官网https://surfer-project.org/)这个软件。

它有一个网页版可以上传文件查看波形。如果要本地启动,需要在本地编译:

首先安装rust和rust的包管理器cargo(自行解决)

然后执行

1
cargo install --git https://gitlab.com/surfer-project/surfer surfer

(你可能需要先安装openssl。总之参照官方README

完成后,在终端输入surfer可以打开程序查看波形。