Vivado 默认的代码编辑器对 Verilog 有着很好的代码提示能力,然而在编辑体验上还不尽如人意。
因此我们可以采用 VS Code 作为代码编辑器,来更快的进行代码编写和初步的语法检查,并利用其更强大的版本控制、共享协作等功能来加速 Verilog 代码开发。
配置 VS Code 的 HDL 开发环境
安装 HDL 语言支持插件
它能够为包括 Verilog 在内的多种 HDL 提供语法高亮、常用代码片段、符号补全以及代码分析的功能。
然而不要着急,该插件并未实现后两种功能,而是从其他更专业的程序中获得帮助。因此我们还需要进行相应配置。
使用 xvlog / Verilator 作为代码分析工具
Verilog-HDL/SystemVerilog/Bluespec SystemVerilog 在官方文档中给出了多个兼容的代码分析工具的比较。以下选用
xvlog
/ Verilator
作为对比,进行相应配置。这两个程序你只需选用其中一个,我更推荐 Verilator。
xvlog
- Vivado 自带代码分析工具
- 不需要额外安装依赖
- 但是功能稍弱。
Verilator
- 基于 C/C++ 开发的 HDL 编译、检查工具
- 提供强大很多的代码检查功能
- 但 Windows 平台下需要手动编译。
xvlog 配置
xvlog
不需要额外安装依赖,我们只需要将 xvlog
所在路径添加到环境变量中即可(一般路径为<你的安装目录>\Xilinx\Vivado\2019.2\bin
)。然后确保在控制台/命令行中能够运行
xvlog
:❯ xvlog --versionVivado Simulator 2019.2
最后,在 VS Code 的用户设置中
Verilog > Linting: Linter
一项选择 xvlog
:Verilator 安装与配置
在 Linux 平台下,你可以直接通过包管理器进行安装。
# Debian 系 ❯ apt-get install verilator # Arch Linux ❯ pacman -S verilator
在 Windows 平台下,
Verilator
需要使用 WSL 安装(推荐)或者手工编译(不建议)。基于 WSL 安装
Windows Subsystem for Linux(简称 WSL )是一个在Windows 10上能够运行原生Linux二进制可执行文件(ELF格式)的兼容层。
因此在 WSL 中,安装
Verilator
就像在 Linux 中安装一样轻松。最后在 VSCode 中,除了配置
Verilog > Linting: Linter
为 verilator
之外;还需要开启 Verilog > Linting > Verilator: Use WSL
:基于 Cygwin 编译 Verilator(已废弃)
注意,此方法极其容易产生安装问题。极其不建议使用。 {:.error}
首先,在 Verilator 的 Github 仓库 点击最新的版本,下载源代码并解压。
然后需要保证系统中有 binutils, gcc, perl, flex, bison 等编译工具链。此步骤目前最好的方式是使用 Cygwin(一个可原生运行于 Windows 系统上的 POSXI 兼容环境)来安装以上工具,并编译
Verilator
。首先下载 Cygwin 安装包。点击安装,选择
Install from Internet
,在 User URL
处输入以下地址:https://mirrors.tuna.tsinghua.edu.cn/cygwin/
点击
Add
按钮, 然后选中 https://mirrors.tuna.tsinghua.edu.cn
, 点击 下一步
进行安装。注意,该列表为可多选列表,注意把上面不需要的镜像点掉。 {:.warning}
然后在选择依赖的页面中,将
Devel
一项设置为 Install
:然后进入解压后的文件夹:
# 生成 configure 文件 ❯ autoconf # 在这期间可能会提示你缺少某些程序,需要一一安装 ❯ ./configure ❯ make # make 完成以后,`verilator` 已经在 ./bin 文件夹下,你可以直接挪动到目标文件夹或者运行 make install ❯ make install
最后同理,确认 Windows 的控制台中可以使用
verilator
:❯ verilator --versionVerilator 4.036 2020-06-06 rev v4.034-208-g04c0fc8aa
然后在 VS Code 中配置为 linter:
使用 ctags 作为符号补全工具
ctags
是老牌的符号补全工具,至今你还可以在 Vim
中见到它的身影。在 Linux 中可以直接通过包管理安装。
在 Windows 中则需要安装
universal-ctags
。如果你已经预期只会使用
ctags
一段时间。那么你可以跳过(繁琐的)包管理器配置流程,直接从 release 页面下载已经构建好的可执行文件。如果你使用 scoop 进行 windows 的包管理的话,可以使用:
❯ scoop install universal-ctags
即可安装。
如果提示
Couldn't find manifest for 'universal-ctags'
,则需要先通过 scoop bucket add extras
添加额外的软件仓库列表。最后确保能在命令行中运行
ctags
。无需对 VS Code 进行额外设置,因为默认选项已经启用了
ctags
。 安装并配置代码格式化插件
接下来我们需要安装 verilog-formatter 来进行格式化。
除此之外,我们需要下载 编译后的 iStyle 或者 iStyle 源代码并手动编译。
最后在 VS Code 中配置
Verilog-formatter > Istyle
到你的可执行文件。另外在下方的
Verilog-formatter > Istyle: Style
一项,你可以选择多种格式化方式,在这里我推荐 GNU
:之后在 VS Code 中,每当调用
Format Document
命令,当前文件就会进行格式化(我配置了快捷键 Ctrl + Shift + I
)。如果 VS Code 没有提示你的语法错误
这段文字写下的时间是 2020 年 9 月 12 日,截至今天为止,Verilator 在 VSCode 上已经似乎有相当长的一段时间无法工作了。 当然,这主要是插件的锅。
因此此时我们不得不使用命令行手动检查语法
# 切换到你的 verilog 代码所在路径 ❯ verilator --lint-only -Wall <你的顶层文件>.v
为什么不推荐使用 VS Code 替带 Vivado 的默认编辑器
如果你细心搜索,你会发现不少教程(比如这篇)推荐你使用 VS Code 替换 Vivado 的默认编辑器。
但是我在使用一段时间后,强烈反对这种做法,原因如下:
- 在代码设计、编写阶段,我们并不需要使用 Vivado,因此更不需要使用 Vivado 进行代码编辑。
- 很多时候只是希望在 Vivado 中快速浏览文件代码,如果替换了默认编辑器,每一次浏览文件都将切换到 VS Code 中,影响体验。
- 在仿真阶段,Vivado 的默认编辑器能够提供最好的单步调试体验。而在 VS Code 中,你无法给 Vivado 调试器打断点。
- Vivado 实现阶段的报错会指向具体文件,使用默认编辑器不会遇到“无法找到相应行号”的问题。
因此,强烈建议保留 Vivado 的默认编辑器。
将文件代码与 Vivado 项目分离
通常来说,新手在创建一个 Vivado 项目之后,常常会在 Vivado 中新建 Verilog 文件,然后直接编辑。
这样的结果就是,Verilog 代码会埋在 Vivado 项目很深的路径之中:
└── vivado # 你的 Vivado 项目 └── vivado.srcs └── sources_1 └── new └── your-verilog-file.v # 你的 Verilog 文件
但是这样既不方便你通过 VS Code 打开代码,也不方便使用 Git 进行版本控制。
因此正确的方式应该是在独立的文件夹中手动创建
.v
文件:├── vivado # 你的 Vivado 项目 └── src └── your-verilog-file.v # 你的 Verilog 文件
然后在 Vivado 中通过
Add Directory
将整个 src
目录添加到 Vivado 开发环境中,Vivado 将自动寻找可能的顶层文件,并自动梳理文件间依赖关系。注意 Vivado 对文件更新的监听规则为:自动监听已经加入的文件,不监听新创建的文件。也就是说:如果你新建了一个 Verilog 文件,则需要再次添加入 Vivado 项目中。
用 Git 进行版本控制
通过上一小结的介绍,我们已经将 Vivado 项目和我们的代码分离。
通常情况下,你可以使用 Git 直接管理
src
中内容,或者 ignore 掉 vivado 项目。但有时候,Vivado 项目中有一些文本文件的配置也需要我们来版本控制,比如仿真波形配置文件
.wcfg
。那么此时我们要注意排除其他的缓存文件。如果你是 Vim 用户(与主题无关)
鸣谢
- 顾骁:提供了 Cygwin 环境下编译 Verilator 的内容。
- 另一位不愿意透露姓名的朋友:提供了 WSL 安装 Verilator 的内容。
- 一些小伙伴们:指出了
universal-ctags
在extras
的仓库中,需要额外运行命令。