vim打造最强systemverilog编辑器
更多分享内容可访问我的个⼈博客
1.对⾃动补全部分进⾏加强,可以⽆限⾃定义snippets和keywords。补全能⼒完胜vscode。
2.使⽤svlangserver代替svls,提升编辑体验。
本⽂介绍如何使⽤ vim 搭建 systemverilog 编辑环境。功能包括⾃动补全、语法⾼亮、语法检查、格式化等。
注意本⽂内容只是针对 systemverilog 提供最基本编辑体验。关于 vim 的其他功能配置,请见。
语法⾼亮
最新版的 neovim 应该默认⽀持 systemverilog 语法⾼亮。如果你的 vim 不⾏的话可以尝试通过安装vhda/verilog_systemverilog.vim插件解决。
⾃动补全与语法检查
更新:使⽤ svlangserver 代替 svls。
svlangserver 是⼀个相当新的 lsp,其优点包括实现了定义跳转功能、使⽤ verilator 编译器进⾏语法检查、模块调⽤时提⽰模块端⼝、有⾃带的 snippets(好像暂时不能⽤)、格式化⽂档等。虽然它还存在⼀定问题,但⽐起 svls 功能更多,值得期待其后续版本。总的来说svls 语法检查能⼒可能更强,其他的⽐不上 svlangserver,然⽽语法检查最终还是要靠编译器或者 IDE,所以还是建议使⽤后者。
使⽤ svls
⾃动补全功能使⽤ lsp。本⽂选⽤ svls 作为 systemverilog 的语⾔服务器。
svls 使⽤ rust 语⾔编写,需要 rust 语⾔环境,使⽤ rust 包管理器 cargo 安装。或者可以从 snap 商店下载。
选择⼀款管理调⽤ lsp 的 vim 插件。本⽂选⽤ coc.nvim。在 coc.nvim 的配置⽂件中添加以下内容。
"languageserver":{
"svls":{
"command":"svls",
"filetypes":["systemverilog"]
}
}
注意,filetypes不⼀定正确。可以新建⼀个.sv ⽂件,查看⽂件类型。⽐如,在 neovim5 的某⼀版本中,⽂件类型
为verilog_systemverilog。
选⽤其他插件的可以在到相应配置。
svls 的配置⽂件为.l,该⽂件放在项⽬的根⽬录。配置⽂件的编写⽅式⾮常简单。
[verilog]
include_paths = ["src/header"]
[option]
linter = true
将以上include_paths的值修改为要编写的.sv ⽂件所在⽬录即可。
关于语法检查功能,可以同时使⽤ ale 插件。该插件可以通过 iverilog 编译器提供错误信息,两者错误信息并不完全重合。
虽然在svls的演⽰视频中存在 snippets 的补全画⾯,但是经过试⽤发现这其实是其他插件提供的。由于vim-snippets插件提供的 snippets ⾮常不全,因此之后会介绍简单的⾃定义 snippets。
使⽤ svlangserver
npm install -g @imc-trading/svlangserver
继续安装verilator以及。
在 coc.nvim 的配置⽂件中设置如下。下⾯的路径修改成⾃⼰的位置。
"languageserver":{
"svlangserver":{
"module":"/home/niuiic/Applicants/Npm/npm_global/lib64/node_modules/@imc-trading/svlangserver/lib/svlangserver.js",
"filetypes":["systemverilog"],
"settings":{
"systemverilog.includeIndexing":["**/*.{sv,svh}"],
"ludeIndexing":["test/**/*.sv*"],
"systemverilog.defines":[],
"systemverilog.launchConfiguration":"/usr/bin/verilator -sv -Wall --lint-only",
"systemverilog.formatCommand":"/home/niuiic/Applicants/Verible/verible/bin/verible-verilog-format"
}
}
}
后续可以使⽤:Format来调⽤格式化⼯具。
⾃定义 snippets
⾸先,需要coc-snippets插件,该插件依赖coc.nvim。安装好coc.nvim之后,只需要使⽤:CocInstall coc-snippets命令即可安装。具体设置可以参考其。安装该插件后需要同步安装honza/vim-snippets来提供 snippets。SirVer/ultisnips需要拆卸掉,因为该插件会对⾃定义的snippets ⽂件报错。
接下来,使⽤:CocConfig打开coc.nvim配置⽂件,设置⾃定义 snippets ⽂件路径。如"snippets.userSnippetsDirectory":
"/home/niuiic/.config/nvim/snippets"。(注意这是个 json ⽂件,最外层需要花括号)
然后就可以在该⽬录下⾃定义 snippets ⽂件,⽂件名称保持和⽂件类型相同即可。snippets 语法还是⽐较复杂的,下⾯给出⼀个简单例⼦,⾜以实现基本功能。更⾼级的功能请⾃⾏学习。(coc.nvim 提供的⾃动补全筛选能⼒已经⾜够强⼤,即使是简单的设置也可以带来极佳的体验。更复杂的设置个⼈觉得没有必要。)
systemverilog.snippets
# nomal always
snippet alw
always @(${0}) begin
end
alw是缩写,也就是当你打出 alw 时可以调⽤该 snippets。${0}的作⽤⽐较复杂,最简单也是对新⼿来说最实⽤的作⽤就是当你添加这⼀项后,补全 snippets 之后光标会⾃动停留在这个位置。
如果再加⼀项,如下。
# nomal always
snippet alw
always @(${1}) begin
${0}
end
此时光标会停留在${1}的位置。
按照上述例⼦继续补充⾃⼰想要的 snippets 即可。注意标准写法中应当是⽤endsnippet的,不过这插件似乎不需要这个,⽽且加上这⼀句之后反⽽会出现在补全内容中,因此还是不加为好。
此外,可以复制中的 snippets 来使⽤。
除了 snippets,svls 能提供的⾃动补全功能感觉还是差点意思的。继续使⽤coc.nvim定义⾃动补全库。
vim编辑器下载与安装新建⽬录~/.config/nvim/autoload/coc/source。在该⽬录下新建⽂件systemverilog.vim,⽂件名原则同上。
内容如下。
function! coc#source#systemverilog#init() abort
return {
\'triggerCharacters': [''],
\'filetypes' : ['systemverilog'],
\}
endfunction
function! coc#source#systemverilog#complete(opt, cb) abort
let items = ['reg', 'wire', 'forever', 'posedge', 'negedge', 'module', 'endmodule', 'initial', 'input', 'output', 'parameter', 'assign', 'integer']
call a:cb(items)
endfunction
在items中添加需要补全的关键词即可。注意这⾥的补全内容不能解析任何换⾏字符或转译字符,所以关键词放这⾥,语句放之前的snippets。
⾄此,完成⾃动补全与语法检查功能的配置。
格式化
注意,使⽤ svlangserver 不需要再额外配置格式化。
systemverilog 的格式化需要的⽀持。verible 为 google 为 systemverilog 开发的⼀套⼯具集,其中包含了格式化⼯具。
verible 提供了.deb 和.rpm 的⼆进制包,包管理系统兼容该两种打包⽅式的⽤户可以直接安装。
其他⽤户需要⾃⾏编译,从 github 上拉取源码后,在源码⽬录使⽤bazel build -c opt //...编译。注意需要⽀持 C++11 的 gcc 编译器(clang 暂时⽆法编译成功)。
编译完成后,使⽤bazel run -c opt :install -- path安装到指定位置。如果安装位置需要 root 权限,则使⽤bazel run -c opt :install -- -s path,务必注意不能使⽤ sudo。
在 vim 中调⽤格式化⼯具的插件选⽤ neoformat。该插件的安装过程不再赘述。调⽤格式化程序的配置⽅式在其⽂档中有详细说明,这⾥只给出⼀个例⼦。
环境:neovim、linux
创建~/.local/share/nvim/site/autoload/neoformat/formatters⽬录。编写systemverilog.vim,写⼊以下内容
function! neoformat#formatters#systemverilog#enabled() abort
return ['verible_format']
endfunction
function! neoformat#formatters#systemverilog#verible_format() abort
return {
\ 'exe': '/opt/verible/verilog_format',
\ }
endfunction
注意⽂件名称是 vim 中 systemverilog 的⽂件类型。如果不是systemverilog则需要替换⽂件名及⽂件中所有出现systemverilog的地
⽅。exe需要可执⾏,即如果格式化程序所在⽬录不在$PATH中,需要填写其绝对路径。
总结
以上⽅案对⽐ vscode 以及各类 IDE,如 vivado 等,在编辑体验上可以算是完胜。
vscode 中虽然有基于 svls 的插件,以及语⾔格式化插件,但整体补全能⼒上⽐不上⾼度扩展的 vim。并且仅仅依靠 svls 的错误检查,并不能出所有错误(语法错误,⽽⾮逻辑错误),但 vim 可以再叠加其他的检测,如 ale。
各类 IDE 虽然功能⾮常强⼤,甚⾄可能只需使⽤图形界⾯配置就能⾃动⽣成 systemverilog ⽂件,但是在编辑体验上远远⽐不上前两者。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论