[의식의흐름] 삽질일지 - Verilator를 통한 RTL Lint

YumeIroVillain·2024년 12월 15일
0

개발노트

목록 보기
29/30

Reference

https://alvinrolling.github.io/eda/uvm/Vim_SV_UVM/
https://alvinrolling.github.io/vim/Vim-UVM-Snippets/
https://khd0801.com/entry/vim-%EC%BD%94%EB%93%9C-%EC%9E%90%EB%8F%99-%EC%99%84%EC%84%B1-cocnvim
https://danielmangum.com/posts/setup-verible-verilog-neovim/

// 처음 실행시점의 환경 기록.
// WSL2에서 실행함.
➜  verilator --version
Verilator 5.024 2024-04-05 rev v5.024-42-gc561fe8ba

➜  vim --version
VIM - Vi IMproved 8.2 (2019 Dec 12, compiled Nov 07 2024 13:17:21)
Included patches: 1-16, 647, 17-579, 1969, 580-647, 678, 648-1848, 4975, 5016, 5023, 5072, 2068, 1849-1854, 1857, 1855-1857, 1331, 1858, 1858-1859, 1873, 1860-1969, 1992, 1970-1992, 2010, 1993-2068, 2106, 2069-2106, 2108, 2107-2109, 2109-3995, 4563, 4646, 4774, 4895, 4899, 4901, 4919, 213, 1840, 1846-1847, 2110-2112, 2121

cd /mnt/c/Documents and Settings/user/Documents/VerilatorLintTest

vim Vundle 셋업

이 글을 따라서 셋업하였다

일단 vim vundle이라는것부터 설치해야하는듯.

git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim

그리고 .vimrc 최상단에 아래 내용 추가

"-----------------------------------------------------------------------"
" Vundle 환경설정
"------------------------------------------------------------------------"
filetype off                   " required!
set shell=/bin/bash
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
	" let Vundle manage Vundle
	" required! 
	Plugin 'VundleVim/Vundle.vim'

	" vim 하단에 파일 정보 띄우기
	Plugin 'vim-airline/vim-airline' 
	Plugin 'vim-airline/vim-airline-themes'
	" ...
call vundle#end()
filetype plugin indent on     " required!
	"
	" Brief help
	" :BundleList          - list configured bundles
	" :BundleInstall(!)    - install(update) bundles
	" :BundleSearch(!) foo - search(or refresh cache first) for foo
	" :BundleClean(!)      - confirm(or auto-approve) removal of unused bundles
	"
	" see :h vundle for more details or wiki for FAQ
	" NOTE: comments after Bundle command are not allowed..

대충 C 파일만들고, vim상에서 :PluginInstall 하면 아래와 같이 Done 된다.(삭제는 :PluginClean 하면 된다고 함)

참고) Plugin 중에서는 VimAwsome이라는 Plugin 도 있다고 한다. 나도 들어본 Plugin이긴한데, 강력한 Plugin인 듯.
https://vimawesome.com/

현재상태로는, 자동완성은 지원하지 않고

모드만 친절하게 알려주는 수준에 그치긴 하는군.

일단 하나하나 따라가보자.

vim airline

파일명과 커서위치를 알려주는 툴인듯.

vim snippet 이란 무엇인가?

https://khd0801.com/entry/VIM-%EC%BD%94%EB%93%9C-%EC%9E%90%EB%8F%99%EC%99%84%EC%84%B1-%ED%94%8C%EB%9F%AC%EA%B7%B8%EC%9D%B8

  • ultisnips는 스니펫 엔진을 갖고 있으며 python에서 빠르고 작동 되며 기능이 가장 많다고 함.

  • vim-snippets는 if, for, while 또는 switch case문과 같은 패턴이 정해져 있는 코드들을 사용자가 등록한 키에 의해 코드가 자동 완성되도록 ~/.vim/bundle/vim-snippets/snippets/{언어명}.snippets 해당 내용들이 적혀있다고 함

    • ex) c.snippets
  8         " let Vundle manage Vundle
  7         " required!
  6         Plugin 'VundleVim/Vundle.vim'
  5
  4         " vim 하단에 파일 정보 띄우기
  3         Plugin 'vim-airline/vim-airline'
  2         Plugin 'vim-airline/vim-airline-themes'
  1         " ...
16

*************이 2줄 추가하면된다.****************
  1         "명령어 자동완성 플러그인(inc + <C-a> : #includ<>)
  2         Plugin 'SirVer/ultisnips'
  3         Plugin 'honza/vim-snippets'
  4         " ...

다시 :PluginInstall 을 하면

~/.vim/bundle/vim-snippets/snippets/ 로 가보면,

기본적으로 verilog.snippets도 있는걸 확인가능하다.

아무튼, .vimrc 최하단에 아래와같이 추가하자.

" Trigger configuration. You need to change this to something other than <tab> if you use one of the following:
" - https://github.com/Valloric/YouCompleteMe
" - https://github.com/nvim-lua/completion-nvim
let g:UltiSnipsExpandTrigger="<C-a>"
let g:UltiSnipsJumpForwardTrigger="<tab>"
let g:UltiSnipsJumpBackwardTrigger="<s-tab>"
" If you want :UltiSnipsEdit to split your window.
let g:UltiSnipsEditSplit="vertical"
" let g:UltiSnipsSnippetDirectories = ['~/.vim/UltiSnips']

오오 switch하고 Ctrl A를 누르니

출처블로그 설명처럼, Template가 자동완성된다.
Tab 하면 다음걸로 이동이 된다.

아, 이건 Lint툴이나 변수명 추적툴이 아니라, 미리 정의한 Template 자동완성 툴이구나.

uvm_object 자동완성 snippet 시험

uvm_object만 치고 Ctrl A를 누르면 Snippet이 자동완성된다.

잘된다.

변수명 Reference 추적

  • ctags 라던지 cscope 와 연동해야할것같은데

https://khd0801.com/entry/wesleychesrcexpl-%EC%84%A4%EC%B9%98-%EB%B0%8F-%EC%82%AC%EC%9A%A9-%EB%B0%A9%EB%B2%95
이거같다.

LSP를 통한 자동완성 추천기능

nodejs 설치

  • neovim은 nodejs 에 dependency가 있는 모양이다.
curl -sL install-node.vercel.app/lts | sudo $SHELL 

  Configuration
> Version:  v22.12.0 (resolved from lts)
> Prefix:   /usr/local
> Platform: linux
> Arch:     x64

> Tarball URL: https://nodejs.org/dist/v22.12.0/node-v22.12.0-linux-x64.tar.gz
! Prefix bin directory /usr/local/bin is not in your $PATH
? Install Node.js v22.12.0 to /usr/local? [yN] y
> Installing Node.js, please wait…
✓ Done

vimrc에 아래 추가

    " coc.nvim은 vim 편집기에서 사용 할 수 있는 플러그인
    " 실시간 코드 자동 완성 및 다양한 개발 도구를 통합하는 목적
    Plugin 'neoclide/coc.nvim', {'branch': 'release'}

:PluginInstall시 아래 에러 발생

sudo apt upgrade vim
=> 해도 여전히 버전은 8.2에 머문다.

vim Ale 사용해보자.

vim Ale

LSP 쓰는걸 추천하고, ALE 언어서버는 쓰지말라는 의견도 있음

Don't go that way. Use dedicated lsp clients such as vim lsc


SV-lang 이라는것도 있네.

sv-lang 공식 사이트

lint 기능 테스트

  • 예전에 짰든 UART 코드를 넣어보았다.
    • 14번줄에 세미콜론 넣어서 에러를 만들어보았다.
    • 에러검출 매우 빠름.


Neovim?

결국 Neovim으로 가야하는건가
https://leehc257.tistory.com/category
^ 위 블로그의 vimrc를 그대로 쓰니,


문법 틀릴 시 lint로 짚어주는 기능..

https://rtlog.tistory.com/entry/Vim-Editor-Plugin-Vundle-NerdTree-Sytaxsticverilog

어 이거 iverilog 말고 verilator도 되는모양이다?

아...
README에서, 이거 쓸바에 ALE 쓰라고 하네.

This project is no longer maintained. If you need a syntax checking plugin for Vim you might be interested in Syntastic's spiritual succesor, ALE.


neovim 말고 vim 쓰려면, Ale + slang Linter 쓰는게 나을듯

https://alvinrolling.github.io/vim/Slang-Linter-for-Vim-Ale/

  • At present, ALE supports Verilog linters such as hdl_checker, iverilog, verilator, vlog, xvlog, and yosys. In the subsequent section, I will incorporate support for the slang tool into the ALE plugin.
  • 어 Ale도 LanguageServerProtocol 지원하는것같은데?

    ALE (Asynchronous Lint Engine) is a plugin providing linting (syntax checking and semantic errors) in NeoVim 0.6.0+ and Vim 8.0+ while you edit your text files, and acts as a Vim Language Server Protocol client.

Ale: 일단 C 문법오류 잡는지 체크

Warning은 잘 뜨는듯

Error 도 띄워준다.

:help ale 치자.

아 커서를 가져가면 에러가 밑에 나오는구나.

대충 잘 잡네.
verilog는 어떨까.

오 verilator 잘 잡네.

의도적으로 end를 뺐더나 정확한 에러가 발생한다.

사용한 vimrc

"-----------------------------------------------------------------------"
" Vundle 환경설정
"------------------------------------------------------------------------"
filetype off                   " required!
set shell=/bin/bash
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
	" let Vundle manage Vundle
	" required! 
	Plugin 'VundleVim/Vundle.vim'

	" vim 하단에 파일 정보 띄우기
	Plugin 'vim-airline/vim-airline' 
	Plugin 'vim-airline/vim-airline-themes'
	" ...
	
	"명령어 자동완성 플러그인(inc + <C-a> : #includ<>)
	Plugin 'SirVer/ultisnips'
	Plugin 'honza/vim-snippets'
	" ...

	Plugin 'dense-analysis/ale'
    
call vundle#end()
filetype plugin indent on     " required!
	"
	" Brief help
	" :BundleList          - list configured bundles
	" :BundleInstall(!)    - install(update) bundles
	" :BundleSearch(!) foo - search(or refresh cache first) for foo
	" :BundleClean(!)      - confirm(or auto-approve) removal of unused bundles
	"
	" see :h vundle for more details or wiki for FAQ
	" NOTE: comments after Bundle command are not allowed..

:set ignorecase
:set nu
:set rnu

"-----------------------------------------------------------------------"
" ultisnips&vim-snippets Trigger Configuration
"-----------------------------------------------------------------------""
" Trigger configuration. You need to change this to something other than <tab>
" if you use one of the following:
" " - https://github.com/Valloric/YouCompleteMe
" " - https://github.com/nvim-lua/completion-nvim
let g:UltiSnipsExpandTrigger="<C-a>"
let g:UltiSnipsJumpForwardTrigger="<tab>"
let g:UltiSnipsJumpBackwardTrigger="<s-tab>"
" If you want :UltiSnipsEdit to split your window.
let g:UltiSnipsEditSplit="vertical"
" let g:UltiSnipsSnippetDirectories = ['~/.vim/UltiSnips']

" for ALE
let b:ale_linters = {'c': ['gcc'], 'verilog':['verilator']}
" ALE가 에러와 경고를 표시하는 방법 설정
let g:ale_set_highlights = 1
let g:ale_set_signs = 1
let g:ale_set_loclist = 1
let g:ale_set_quickfix = 0
let g:ale_echo_cursor = 1
let g:ale_echo_msg_format = 'linter says - [%linter%] %s [%severity%]'

그외 참고할만한것들

https://github.com/gvekony/sv-1800-2012/tree/master

profile
HW SW 둘다 공부하는 혼종의 넋두리 블로그 / SKKU SSE 17 / SWM 11th

0개의 댓글