I. 서론

 

저는 항상 베릴로그를 통해 코딩하면서

'언어가 너무 구식이다'

라는 생각이 들었습니다.

 

것도 그럴 것이 파스칼(Pascal) 언어에서나 볼 법한 begin과 end를 사용하고

특히 테스트벤치를 작성할 때 C같은 다른 언어들과 달리

무에서 유를 창조하는 듯한 느낌이 들었습니다.

 

그래서 항상 베릴로그를 좀 더 쉽게 작성할 순 없을까 하고 생각했었습니다.

 

실은 이와 비슷한 경험을 제가 학부생일 때 한번 경험해 본 적이 있었습니다.

바로 mathematica라는 프로그램이었습니다.

이 언어는 Wolfram에서 제공하는 수학 계산에 최적화된 프로그램입니다.

재밌는 게 이 프로그램을 사용하는 방법은 크게 2가지입니다.

 

하나는 코딩에 대해 잘 모르지만 컴퓨터로 수치해석을 하고 싶은 수학자나 물리학자의 경우

Wolfram 계정을 구매하여 유료로 코드를 작성하는 방법입니다.

그리고 나머지 하나는 mathematica 커널을 설치한 뒤, CLI, 즉 커맨드라인으로 코딩하거나

커널을 주피터 노트북과 같은 코딩 환경에 불러와서 GUI, 즉 그림을 출력할 수 있게 코딩하는 방법입니다.

 

저는 당시 전자과이면서 리눅스나 WSL을 잘 알고 있었기에 쉽게 커널을 다운로드할 수 있었습니다.

그런데 맨 처음 CLI로 코딩하려 했을 때 GUI도 안 나오고, 무엇보다도 저장이 안 되기 때문에

한번 하고 다시 할 때 처음부터 코딩하는 게 너무 귀찮았습니다.

다른 사람들도 그런가 해서 교수님의 유료버전을 봤는데 거기에는 셀로 분할해서 코딩도 하고

계산결과를 그래프로 출력하는 등 CLI와 비교가 안될 정도로 편리했습니다.

마침내 주피터 노트북을 통해 코딩을 하게 되었을 때, 답답함이 가시고 코딩은 일사천리로 진행되었습니다.

출처: https://pkjung.tistory.com/154

 

저는 위와 같은 경험을 베릴로그에서도 느낄 수 있지 않을까 생각했지만, 그 당시에는 제가 주피터 관련 지식이 부족해서 본격적인 환경 설정에 관한 시도를 하지 못했습니다. 이후 저는 우연히 AI 관련 업무를 담당하게 되었고, AI 연산을 위한 환경을 설정하는 과정에서 코딩 환경 구축에 대한 전반적인 지식을 얻을 수 있었습니다. 특히 아래 링크의 도움을 많이 받았습니다:

(https://chancoding.tistory.com/5)

(https://21june.tistory.com/2)

 

그리고 시간이 지나 저는 베릴로그 코딩을 해야 하는 업무를 맡게 되었고,

깃허브(Github)를 기웃거리다가 우연히 파이썬을 사용해서 베릴로그를 작성할 수 있는 글을 발견하였습니다.

(https://github.com/PyHDI/veriloggen)

Jupyter Notebook으로 파이썬을 통해 베릴로그를 코딩한 모습

 

솔직히 베릴로그 업계 관계자분들이 보기에 이러한 시도는 불필요하다고 느낄 수 있습니다. 것도 그럴게 베릴로그로 직접 코딩하는 게 더 직관적이기도 하고 파이썬으로 코드를 작성하는 게 번거롭게 느껴질 수 있기 때문입니다. 하지만 저는 주피터 노트북으로 코딩할 수 있다는 사실이 너무 좋았습니다.

 

이 환경에서는 제가 코드 작업을 하다가 수정도 간단하게 할 수 있고 전체 코드를 돌릴 필요도 없기 때문에 기존의 코딩에 비해 많은 시간을 아낄 수 있다고 생각하기 때문입니다. 이 글에서 우리는 주피터 노트북으로 파이썬을 사용해 베릴로그를 코딩할 수 있는 환경을 만들어보려 합니다. 이후 최종적으로 VS Code에서 베릴로그 컴파일 프로그램을 통해 Linting(코드 교정) 기능을 사용할 수 있도록 하려 합니다.

 

II. 본론

 

베릴로그 코딩 환경을 만드는 절차를 크게 요약하자면 아래와 같습니다:


--------------------------------------------------------------------------------------------------------

 

1. 리눅스 환경 만들기(윈도우의 경우 WSL을 사용합니다.)

2. 가상환경 만들기(anaconda)

3. 베릴로그 컴파일 관련 프로그램 설치(Icarus Verilog부터 veriloggen까지)

4. 주피터 노트북 설치 및 커널 연결

5. VS Code 베릴로그 Linter 활성화

6. VS Code 베릴로그 Formatter 활성화

 

--------------------------------------------------------------------------------------------------------

 

1. 리눅스 환경 만들기

 

운영체제를 이미 리눅스 계열(우분투 등)로 사용하고 계신 분은 스킵하셔도 됩니다.

 

솔직히 리눅스 환경을 만들지 않아도 윈도우에 아나콘다를 설치해서 베릴로그 환경 구축은 가능합니다.

하지만 이 경우 마지막에 veriloggen의 코드를 수행하다가 

'returned non-zero exit status 4294967295' 라는 무시무시한 오류를 발견할 수 있습니다.

이 오류의 원인은 저도 잘 모르겠습니다만 크게 2가지로 예측됩니다.

하나는 윈도우 운영체제 자체의 문제이거나

다른 하나는 리눅스에서만 돌아가는 프로그램을 다운로드하지 않아서라고 생각합니다.

 

어쨌든 윈도우에는 WSL이라는 훌륭한 리눅스 환경이 있기 때문에 크게 걱정하실 필요는 없습니다.

MobaXterm으로 WSL을 실행시킨 모습

 

만약 MobaXterm으로 WSL을 실행했을 때 좌측의 'sidebar browser'가 보이지 않는다면 WSL 설정에서 'run method'를 'localhost connection'로 변경하시기 바랍니다.

(https://stackoverflow.com/questions/62728006/windows-subsytem-linux-with-mobaxterm-how-configure-the-sftp-pan)

'sidebar browser'가 보이지 않을 때 설정

 

WSL을 설치하는 방법은 구글에 너무나도 많이 있기 때문에 여기서 직접 하나하나 설명하진 않겠습니다. 그러나 필요하신 분들이 있을까 봐 설치과정이 잘 적혀있는 링크를 남기겠습니다:

(https://21june.tistory.com/2)

 

2. 가상환경 만들기

 

가상환경에 대해 처음 들어보신 분들은 궁금증이 생길 겁니다. 도대체 가상환경은 무엇이며 어째서 설치해야 하는 걸까요?

 

결론부터 말씀드리자면 가상환경은 다양한 패키지 버전을 보관할 수 있는 '가상의' 환경을 제공하기 때문에 프로그램을 잘못 설치해서 오류가 생기거나 호환 불가능한 버전이 설치되는 사태를 쉽게 해결할 수 있다는 장점이 있습니다. 간단한 예를 들어봅시다. 저희가 가상환경이 아니라 실제환경, 즉 일반적인 시스템에 여러 가지 프로그램들을 설치하다가 프로그램 충돌이 일어나 버렸습니다. 그러면 실제환경의 경우 문제를 해결할 때까지 모든 프로그램을 하나씩 제거하거나 아예 포맷을 해야 하는 번거로움이 있습니다. 그러나 가상환경의 경우 그냥 '가상환경' 하나만 지우고 다시 설치하면 되기 때문에 굉장히 편리합니다. 마치 고깃집과 같은 식당에서 테이블 위에 식탁보를 깔아놓았을 때 식탁 위가 더러워지면 평소의 경우 걸레로 일일이 다 닦아야 하지만 식탁보가 있다면 식탁보만 갈아서 빠른 청소가 가능한 경우와 비슷하다고 보면 될 것 같습니다.

 

따라서 가상환경을 설치할 경우 베릴로그 관련 프로그램이나 패키지를 특정 가상환경에만 적용되도록 설계할 수 있으며 나중에 프로그램을 제거해야 할 경우 가상환경 하나만 제거하면 되기 때문에 굉장히 간단하고 편리합니다. 최근에는 도커(Docker)라고 해서 아예 가상환경이 아니라 가상머신, 즉 운영체제까지 가상머신으로 설계한 프로그램이 있기 때문에 관심 있는 분들은 이에 대해 알아보면 좋을 것 같습니다.

 

가상환경을 설치하기 위해, 우리는 아나콘다(anaconda)라는 프로그램을 사용할 것입니다.

아나콘다를 설치하는 방법은 구글에 너무나도 많이 있기 때문에 여기서 직접 하나하나 설명하진 않겠습니다. 그러나 필요하신 분들이 있을까 봐 설치과정이 잘 적혀있는 링크를 남기겠습니다:

(https://21june.tistory.com/2)

당연한 소리지만 리눅스 버전으로 설치해야 하며

3번으로 넘어가기 전에 현재 환경이 (base)가 아니라 (가상환경)으로 설정되었는지 다시 확인하시기 바랍니다.

아나콘다 설치 후 가상환경 생성

 

3. 베릴로그 컴파일 관련 프로그램 설치

 

2번의 마지막에서 강조하였지만
설치를 진행하기 전에 현재 환경이 실제환경인 (base)가 아니라 (가상환경)으로 설정되었는지 다시 확인하시기 바랍니다.

 

저희의 궁극적인 목표는 veriloggen을 설치하는 것입니다. 따라서 veriloggen 설치 과정을 참조하여 프로그램들과 패키지들을 설치해 보도록 하겠습니다.

(https://github.com/PyHDI/veriloggen)

 

top-down 방식으로 설치과정을 말씀드리자면

veriloggen을 설치하기 위한 패키지 설치 -> pyverilog를 설치하기 위한 프로그램 설치 -> Icarus Verilog 설치입니다.

 

베릴로그로 코딩을 해야 하기 때문에, 베릴로그 컴파일 관련 프로그램을 설치하는 것은 필수적입니다. 세상엔 Icarus Verilog(웹버전은 HDLBits)와 verilator부터 Modelsim(Siemens), Incisive(Cadence)나 VCS(Synopsys), 그리고 Vivado(Xilinx) 등 다양한 컴파일 프로그램들이 있습니다만 여기서는 무료이면서 가벼운 프로그램인 Icarus Verilog를 다루려고 합니다.

(https://en.wikipedia.org/wiki/List_of_HDL_simulators)

 

베릴로그 컴파일 관련 프로그램 설치 절차를 크게 요약하자면 아래와 같습니다:


-------------------------------------------------------------------------------------------------------

 

1) Icarus Verilog 설치(베릴로그 컴파일 프로그램)

2) gtkwave 설치(파형 관찰 프로그램)

3) jinja2, ply 설치(pyverilog 구동 프로그램)
4) pytest, pytest-pythonpath, graphviz, pygraphviz 설치(pyverilog 관련 선택사항)
5) pyverilog, numpy 설치(veriloggen 구동 프로그램 )
6) verilator 설치(veriloggen 관련 선택사항)

부록) Rocky Linux용 verilator 및 Icarus Verilog 설치
7) veriloggen 설치

 

-------------------------------------------------------------------------------------------------------

 

시작하기 전에,

Icarus Verilog와 gtkwave의 경우 설치하는 방법이 구글에 많이 있습니다만 한국 자료의 경우 윈도우 설치가 주류입니다. 그러나 필요하신 분들이 있을까 봐 설치과정이 잘 적혀있는 링크를 남기겠습니다:

(https://verilog-hdl-design.tistory.com/entry/Icarus-Verilog-Tips)

 

또한 Rocky Linux 등 우분투 외의 리눅스에서 이카루스 베릴로그나 베릴레이터를 실행시키고 싶은 분들을 위해 우분투 베릴레이터 설치 과정 하단에 Rocky Linux 용 베릴레이터 및 이카루스 베릴로그 빌드 과정을 작성해놓았습니다. 관심이 있다면 읽어봐도 좋을 것입니다.

 

1) Icarus Verilog 설치

 

sudo apt install iverilog

를 입력하여 설치할 수 있습니다. 설치가 잘 되었는지 확인하려면

iverilog

를 입력했을 때 관련 설명이 출력되어야 합니다. 아니면 apt 설치 목록에 이름이 있는지 확인해도 됩니다. 명령어는

apt list --installed | grep iverilog

입니다. '--installed'를 적지 않았을 경우 패키지를 다운받는 저장소(repository)에서 검색하기 때문에 설치 여부를 알 수 없으므로 아무 의미가 없습니다.

 

Icarus Verilog 설치

 

2) gtkwave 설치

 

sudo apt install gtkwave

를 입력하여 설치할 수 있습니다.

 

gtkwave 설치

 

3) jinja2, ply 설치

 

pip install jinja2 ply

를 입력하여 설치할 수 있습니다.

 

jinja2, ply, pytest, pytest-pythonpath 설치

 

4) pytest, pytest-pythonpath, graphviz, pygraphviz 설치

 

pip3 install pytest pytest-pythonpath
sudo apt install graphviz
conda install pygraphviz

를 입력하여 설치할 수 있습니다.

 

pip와 pip3의 차이는 파이썬 버전 입니다만 pip 써도 잘 먹히는 것 같습니다. 그리고 한 가지 유의해야 할 점은 pygraphviz의 경우 pip로 설치가 안되기 때문에 conda로 설치하셔야 합니다.

 

graphviz 설치

 

pygraphviz 설치

 

5) pyverilog, numpy 설치

 

pip install pyverilog numpy

를 입력하여 설치할 수 있습니다.

 

pyverilog, numpy 설치

 

6) verilator 설치

 

베릴레이터의 경우 우분투에 대해 패키지 업데이트가 되지 않아서(개XX) 깃허브에서 직접 빌드해야 합니다.

아래의 링크에서 우분투의 패키지 버전을 확인한 뒤, 깃허브의 버전과 비교했을 때 더 낮은지 확인할 수 있습니다:

(https://repology.org/project/verilator/versions)

빌드 방법은 아래의 링크를 참조할 수 있습니다:

(https://verilator.org/guide/latest/install.html)

 

(구)sudo apt install verilator

를 입력하여 설치할 수 있습니다.

 

(구)verilator 설치

 

먼저, 설치 사이트 기준 'Detailed Build Instructions' - 'Install Prerequisites' 항목에 있는 모든 필요 패키지 및 프로그램들을 설치해야 합니다. 이 과정은 너무 길어서 설치과정을 하나하나 설명하지 않겠습니다.

베릴레이터 사전사항들

 

이후, 설치 사이트 기준 'Obtain Sources' 항목까지 내려와서 빌드에 필요한 파일들을 다운로드한 뒤, 버전이 적절한지 확인합니다.

베릴레이터 소스

 

버전까지 확인했으면, 설치에 필요한 환경설정을 결정합니다.

저는 설치 사이트 기준 '1. Run-in-Place from VERILATOR_ROOT'을 따라가도록 하겠습니다.

베릴레이터 빌드 전

 

모든 준비가 끝났으면, 빌드를 시작합니다. 권장 명령어는 아래와 같습니다:

make -j `nproc`  # Or if error on `nproc`, the number of CPUs in system

저는 아무생각 없이 'make'를 입력했습니다.

'-j'를 쓰면 작업 수, 즉 병렬 연산으로 인해 더 빨라지기 때문에 넣는 게 좋다고 생각합니다.

(만약 'bear: error: unrecognized arguments: --output' 오류가 나온다면 구버전 bear를 사용 중이므로 구버전 베릴레이터를 설치하시기 바랍니다.)

베릴레이터 빌드 중

 

make 명령어를 통해 빌드를 끝냈다면 프로그램을 테스트해볼 필요가 있습니다. 권장 명령어는 아래와 같습니다:

make test

 

원래라면 마지막에 'make install'을 입력해야 하지만, 설치파일을 이미 깃허브로 다운받았기 때문에 무시해도 좋습니다.

대신 깃허브로 다운받은 경로로 환경변수를 설정해야 합니다. 아니면 명령어를 인식하지 못합니다.

베릴레이터 빌드 후

 

부록) Rocky Linux용 verilator 및 Icarus Verilog 설치

 

우분투에서 apt 명령어를 통해 설치한 레포지토리 배포판 베릴레이터가 버전이 낮아 사용할 수 없는 것처럼, Rocky Linux에서도   dnf 명령어를 통해 설치한 레포지토리 배포판 베릴레이터의 버전이 낮아 우리가 원하는 기능을 사용할 수 없습니다. 게다가 Rocky Linux의 경우 레포지토리를 통해 Icarus Verilog를 설치할 수 없기 때문에 수동으로 빌드해야 합니다. 그렇지만 걱정할 필요는 없습니다. 왜냐하면 우리는 (6)에서 이미 빌드 과정을 겪어봤기 때문입니다. Rocky Linux에서의 빌드도 거의 비슷하기 때문에 이번 기회에 빌드해 봅시다.

 

Rocky Linux에서 빌드를 하려면 우분투와 달리 help2man 등 빌드 관련 툴들이 있는 레포지토리를 등록해야 합니다. Rocky Linux 8은 PowerTools를, Rocky Linux 9, 10은 crb를 등록해야 합니다. 아래의 링크를 참조하여 록키 리눅스 버전에 맞는 레포지토리를 등록해 봅시다.

(https://linux.how2shout.com/how-to-enable-powertools-repository-on-rocky-linux-8/)

(https://rpms.remirepo.net/rpmphp/zoom.php?rpm=help2man)

 

PowerTools 레포지토리 등록

 

이제 아래의 명령어를 입력하여 빌드에 필요한 툴들을 다운로드합니다.

sudo dnf install git help2man perl python3 make
sudo dnf install gcc-c++
sudo dnf install lib*
sudo dnf install zlib*

sudo dnf install ccache
sudo dnf install mold
sudo dnf install numactl

sudo dnf install perl*

sudo dnf install git autoconf flex bison

sudo dnf install clang*
sudo dnf install cmake
sudo dnf install gdb
sudo dnf install binutils
sudo dnf install graphviz
sudo dnf install lcov
sudo dnf install python3-clang
pip3 install yapf
(bear -> we need to build it.)
sudo dnf install jq
sudo pip3 install sphinx sphinx_rtd_theme sphinxcontrib-spelling breathe ruff
sudo pip3 install git+https://github.com/antmicro/astsee.git
cpan install Pod::Perldoc
(yes)
(sudo)

(bear requirements)
sudo dnf install json-devel
sudo dnf install spdlog-devel
sudo dnf install fmt-devel
sudo dnf install gtest-devel gmock-devel
sudo dnf groupinstall "Development Tools"
sudo dnf install pkg-config
sudo dnf install openssl-devel

 

빌드에 필요한 툴들 중, bear라는 프로그램은 Rocky Linux 8 기준 레포지토리 배포판 방식으로 설치가 불가능합니다. 따라서 수동으로 빌드해야 합니다. 베어를 빌드할 때, 아래 링크들의 도움을 많이 받았습니다.

(https://github.com/rizsotto/Bear/)

(https://support.scitools.com/support/solutions/articles/70000647772-installing-rizsotto-bear-on-centos-rhel-8)

 

빌드에 필요한 소스파일 설치 명령어는 아래와 같습니다.

git clone https://github.com/rizsotto/Bear/
cd Bear
git pull
git tag

 

일반적인 빌드 과정과 달리, Rocky Linux 8에서 베어를 무작정 빌드할 경우 오류가 발생합니다. 이를 해결하기 위해 폴더 내에 있는 'CMakeLists.txt' 파일들을 수정할 필요가 있습니다. 아래 사진들의 'stdc++fs'가 추가된 위치를 참고하여 수정할 수 있습니다.

 

'CMakeLists.txt' 수정1

 

'CMakeLists.txt' 수정2

 

'CMakeLists.txt' 수정3

 

수정이 끝났다면 빌드를 진행합니다. 빌드 명령어는 아래와 같습니다.

cmake -DENABLE_UNIT_TESTS=OFF -DENABLE_FUNC_TESTS=OFF $BEAR_SOURCE_DIR
make -j `nproc`
su
(password)
make install

 

만약 'CMakeLists.txt' 들을 수정하지 않았다면 아래와 같은 오류를 확인할 수 있습니다.

베어 빌드 오류

 

정상적으로 빌드가 끝났다면 아래와 같은 결과를 얻을 수 있습니다.

베어 빌드 후

 

이후 (6)을 참조하여 빌드를 진행합니다. 이때 주의할 점은 Rocky Linux의 경우 우분투와 달리 'make install'까지 진행해줘야 VSCode에서 베릴레이터를 인식할 수 있습니다.

베릴레이터 빌드 전(Rocky)

 

make 명령어를 통해 빌드까지 끝났다면 프로그램이 잘 작동하는지 테스트해 볼 필요가 있습니다. 여기서 파이썬 버전에 따라 오류가 발생할 수 있습니다.

파이썬 관련 오류

 

이 오류는 파이썬 3.7버전 이하를 사용해서 발생합니다.

(https://stackoverflow.com/questions/60417126/attributeerror-argumentparser-object-has-no-attribute-parse-intermixed-args 참조)

따라서 3.9버전을 설치한 다음, 기본 파이썬 버전으로 설정한 뒤 다시 테스트해 보겠습니다. 설치 명령어는 아래와 같습니다.

sudo dnf install python39

버전을 바꾸려면 'update-alternatives' 명령어를 사용해야 합니다. 이 명령어를 사용하면 여러 버전들 중 우리가 원하는 버전을 선택할 수 있습니다. 이 명령어를 사용해서 'python'과 'python3' 명령어를 사용할 때 버전을 3.9로 바꿔봅시다. 바꾸는 명령어는 아래와 같습니다.

sudo update-alternatives --config python
(파이썬 3.9에 해당하는 번호 입력)
sudo update-alternatives --config python3
(파이썬 3.9에 해당하는 번호 입력)

 

파이썬 버전 변경

 

이제 테스트를 진행해 봅시다. 도중에 distro 관련 모듈이 없다는 오류를 확인할 수 있습니다. 간단하게 distro를 pip3로 다운받아 봅시다. 명령어는 아래와 같습니다.

pip3 install distro

 

distro 설치

 

이후 테스트가 성공적으로 끝난 뒤, 위에서 언급한 것처럼 'make install'을 통해 기존 환경변수인 '/usr/local/bin'에 베릴레이터를 설치해봅시다.

su
(password)
make install

를 입력하여 설치할 수 있습니다. 

베릴레이터 빌드 설치(Rocky)

 

베릴레이터 명령어를 입력해서 실제로 작동하는지 확인할 수 있습니다. 

베릴레이터 빌드 후(Rocky)

 

베릴레이터도 빌드한 김에 이카루스 베릴로그도 빌드해 봅시다. 빌드과정은 베릴레이터의 것과 거의 비슷합니다. 이카루스 베릴로그 빌드의 경우 아래 링크들의 도움을 많이 받았습니다.

(https://github.com/steveicarus/iverilog)

(https://iverilog.fandom.com/wiki/Installation_Guide)

 

빌드에 필요한 소스파일 설치 명령어는 아래와 같습니다.

git clone https://github.com/steveicarus/iverilog
cd iverilog
git pull
git tag

 

이카루스 소스파일 설치

 

소스파일을 다 받았으면 빌드를 진행합니다. 빌드 명령어는 아래와 같습니다.

sh autoconf.sh
./configure
make -j `nproc`

설치 도중 gperf 관련 오류가 발생한다면 dnf를 통해 설치하도록 합시다.

sudo dnf install gperf

를 통해 설치할 수 있습니다.

gperf 설치

 

이카루스 빌드 전

 

이카루스 빌드 중

 

빌드가 끝났다면 빌드가 잘 되었는지 확인해 봅시다.

make check

를 통해 확인할 수 있습니다.

이카루스 빌드 체크

 

마지막으로, 'make install'을 통해 '/usr/local/bin'에 이카루스 베릴로그를 등록해 봅시다. 이 과정을 통해 이카루스 베릴로그를 기존 환경변수 경로에 등록합니다. 그 결과 관련 명령어를 편리하게 사용할 수 있습니다. 이 명령어는 루트 권한으로 실행해야 합니다.

su
(password)
make install

를 입력하여 설치할 수 있습니다.

이카루스 빌드 설치

 

설치가 잘 되었는지 확인해 봅시다.

iverilog

를 입력했을 때 관련 설명이 출력되어야 합니다.

이카루스 빌드 후

 

7) veriloggen 설치

 

pip install veriloggen

를 입력하여 설치할 수 있습니다.

 

veriloggen 설치

 

이제 기초 알맹이는 다 설치하였습니다. 그렇다면 프로그램이 잘 작동하는지 확인할 필요가 있습니다. 간단하게 veriloggen 패키지의 예제 파일을 깃허브에서 다운로드 받아와서 실행시켜 봅시다.

 

veriloggen의 깃허브에서 예제 파일을 다운로드 받기

 

명령어는

python hello_led.py

입니다.

 

veriloggen을 통해 파이썬 파일을 실행시킨 모습

 

LED 관련 출력을 확인했다면, 이제 주피터로 확인해 볼 시간입니다.

 

4. 주피터 노트북 설치 및 커널 연결

 

주피터 노트북은 셀 기반 코딩을 가능하게 만들어주는 아주 좋은 개발 환경입니다. 주피터 노트북 사용 시 주의해야 할 점은 셀 실행 시 'Restart' 버튼을 누르지 않는 한 코드가 계속 돌아가고 있다는 사실입니다. 따라서 새로 실행을 해야 한다면 반드시 정지 버튼이 아니라 재시작 버튼을 눌러야 합니다. 저희는 커널 연결을 통해 주피터 노트북에서 베릴로그 관련 패키지들이 설치되어 있는 가상환경으로 코드를 실행시킬 수 있습니다.

 

주피터 노트북을 설치하는 방법과 커널 연결 방법은 구글에 너무나도 많이 있기 때문에 여기서 직접 하나하나 설명하진 않겠습니다. 그러나 필요하신 분들이 있을까 봐 설치과정이 잘 적혀있는 링크를 남기겠습니다:

(https://icedhotchoco.tistory.com/entry/Jupyter-Notebook-Anaconda-Virtual-Environment)

 

주피터 커널 연결 및 주피터 노트북 실행

 

최종적으로 주피터 노트북으로 들어왔다면, 예제파일들인 노트북 파일들을 열어서 가상환경 커널로 직접 실행해 볼 수 있습니다.

(만약 'returned non-zero exit status 4294967295' 오류가 나온다면 커널을 재시작 후 처음부터 셀을 실행시켜 보기 바랍니다.)

 

주피터 노트북으로 실행시킨 예제 노트북 파일

 

5. VS Code 베릴로그 Linter 활성화

 

코딩 분야에서 Lint는 잘못된 문법을 교정해 주는 기능입니다. 단순한 코드라면 오타 또는 문법 오류를 쉽게 발견할 수 있지만 코드가 굉장히 복잡해지면 어디가 잘못된 건지 쉽게 파악하기 어렵습니다. 따라서 Lint 기능이 있다면 복잡한 코딩도 쉽게 해결할 수 있을 것입니다. 이 글에서 우리는 VS Code를 설치한 뒤, 베릴로그 관련 확장 기능을 추가하고, 최종적으로 Icarus Verilog 또는 Verilator를 통해 Linting 기능을 활성화하려 합니다. 이 기능에 대해 저는 아래 링크의 도움을 많이 받았습니다:

(https://m.blog.naver.com/lapuzen3/222880794501)

 

VScode 베릴로그 Linter 설치 절차를 크게 요약하자면 아래와 같습니다:


-------------------------------------------------------------------------------------------------------

 

1) VS Code 설치(텍스트 편집 도구(ex, 메모장 등))

2) WSL 원격접속

3) 베릴로그 확장 기능 설치

4) Icarus Verilog(iverilog) linter 설정

5) Verilator linter 설정

 

-------------------------------------------------------------------------------------------------------

 

1) VS Code 설치

 

VS Code는 텍스트파일을 읽기 쉽도록, 즉 가독성이 좋도록 다양한 기능을 추가해 놓은 텍스트 편집기, 즉 고급 메모장입니다. 메모장과 VS Code의 차이는 필기를 할 때 A4용지에 작성하기(날코딩)와 줄칸이 그어진 공책에다 작성하기(격식에 맞는 코딩)의 차이와 비슷합니다.

 

VS Code를 설치하는 방법은 구글에 너무나도 많이 있기 때문에 여기서 직접 하나하나 설명하진 않겠습니다. 그러나 필요하신 분들이 있을까 봐 설치과정이 잘 적혀있는 링크를 남기겠습니다:

(https://itlearningcenter.tistory.com/entry/C-%EA%B0%9C%EB%B0%9C-%ED%99%98%EA%B2%BD-%EA%B5%AC%EC%84%B1-VS-Code)

(https://geeks-mimic.tistory.com/62)

 

VS Code를 설치한 모습

 

2) WSL 원격접속

 

운영체제를 이미 리눅스 계열(우분투 등)로 사용하고 계신 분은 스킵하셔도 됩니다.

 

베릴로그 관련 프로그램들이 윈도우가 아니라 WSL에 설치되어 있기 때문에 우리는 WSL에 접속해야 합니다.

이를 위해서는, VS Code의 확장 기능들 중 'WSL'을 설치하면 됩니다.

WSL 확장기능 설치

 

설치가 끝났으면 접속해 봅시다.

VS Code 위쪽의 가운데를 보면 돋보기 모양과 'Search'가 보입니다. 이것을 누른 뒤,

'Show and Run Commands'를 누릅니다.

이후 명령어 창에 'WSL: Connect to WSL'을 입력한 뒤, 엔터를 눌러서 WSL로 접속합니다.

 

WSL로 접속한 모습, 좌측 아래에 'WSL: Ubuntu'를 확인할 수 있다.

 

3) 베릴로그 확장 기능 설치

 

VS Code에서 베릴로그 관련 기능들을 사용하려면 관련 확장기능을 설치해야 합니다.

이를 위해서는, VS Code의 확장 기능들 중 'Verilog-HDL/SystemVerilog/Bluespec SystemVerilog'을 설치하면 됩니다.

이때 주의해야 할 점은,

윈도우가 설치된 'LOCAL - INSTALLED'가 아니라

WSL이 설치된 'WSL: UBUNTU - INSTALLED'에 설치해야 합니다.

(리눅스 운영체제 유저는 그대로 'LOCAL - INSTALLED'에 설치하시면 됩니다.)

아래 사진 기준 좌측 위 항목이 아니라 좌측 아래 항목입니다:

 

베릴로그 확장기능, WSL 사용 시 설치 위치를 헷갈리지 않도록 주의하자

 

4) Icarus Verilog(iverilog) linter 설정

 

베릴로그 linter 기능을 활성화하려면 아래의 절차를 거쳐야 합니다:

 

-------------------------------------------------------------------------------------------------------

 

i) ctags 설치

ii) 베릴로그 확장기능 설정 변경(ctags)
iii) 베릴로그 확장기능 설정 변경(iverilog)

 

-------------------------------------------------------------------------------------------------------

 

i) ctags 설치

 

ctags는 함수 또는 변수에 태그, 즉 이름표를 달아서 어디에 있는지 쉽게 확인할 수 있는 프로그램입니다.

아래의 명령어를 입력하여 ctag를 설치할 수 있습니다:

sudo apt-get install ctags

 

만약 exuberant-ctags와 universal ctags 중 하나를 고르라는 글이 나온다면, 취향에 맞는 프로그램을 설치하시면 됩니다. (https://github.com/mshr-h/vscode-verilog-hdl-support)에 따르면 시스템 베릴로그를 지원하는 프로그램은 ' universal ctags '라고 합니다. 저는 'universal ctags'를 선택하였습니다:

 

ctags 설치

 

ii) 베릴로그 확장기능 설정 변경

 

이제 베릴로그 확장기능을 수정해서 실제로 VS Code에서 ctags의 기능을 사용해 봅시다.

먼저, 베릴로그 확장기능 창에서 설치 버튼 옆에 있는 톱니바퀴를 눌러 'Extension Settings'로 들어갑니다.

 

확장기능 설정

 

확장기능 설정으로 들어간 뒤, 

좌측 위의 'User'와 'Remote [WSL: Ubuntu]' 중

'Remote [WSL: Ubuntu]'를 선택합니다.

이후 'Verilog > Ctags: Path'에 ctags의 설치경로를 입력해야 합니다.

ctags의 설치경로를 확인하려면 아래의 명령어를 입력하면 됩니다:

which ctags

 

ctags 경로

 

눈치챈 분들도 있겠지만 가상환경이 'base'입니다. 왜냐하면 VS Code에서 베릴로그의 경우 커널 또는 인터프리터를 바꿀 수 없기 때문에 기본 환경으로 설치하려 합니다.

 

확장기능 ctags 경로


iii) 베릴로그 확장기능 설정 변경(iverilog)

 

이제 Icarus Verilog를 확장기능에 연결하여 linter로 사용해 봅시다.

확장기능 설정에서

'Verilog > Linting: Linter'로 간 다음, 'iverilog'를 선택합니다.

 

Linter로 'iverilog'를 설정한 모습

 

이후 한 가지 옵션을 설정해야 합니다.

그것은 바로 'Verilog > Linting > Iverilog: Run At File Location'입니다.

이 기능은 Icarus Verilog가 실행될 때, 베릴로그 파일이 있는 위치에서 시작될지, 아니면 VS Code의 작업공간 폴더에서 실행될지를 결정하는 옵션입니다. 보통 터미널에서 Icarus Verilog를 실행하는 경우 베릴로그 파일이 있는 위치에서 시작되기 때문에 처음 사용하는 분들은 이 옵션을 체크하는 것이 좋습니다. 보통 테스트벤치에서 모듈을 불러올 때 상대경로를 사용하기 때문에 파일이 있는 위치 기준으로 모듈 경로를 설계하는 경우가 많습니다. 그러나 VS Code의 작업공간에 익숙하신 분들은 이 옵션을 해제하고 편하게 사용하셔도 상관없습니다. 두 옵션 다 사용해 보고 본인에게 편한 옵션을 선택하면 될 것 같습니다.

 

이카루스 베릴로그의 실행 경로 관련 옵션

 

이제 VS Code를 재시작한 뒤, Linting 기능이 잘 작동하는지 확인해 봅시다.

한 가지 주의해야 할 점은, Linting 기능은 저장을 한 뒤에 작동을 한다는 사실입니다.

따라서 수정만 하고 저장을 하지 않았다면 Linting 기능이 작동하지 않을 수 있습니다.

 

이카루스 베릴로그를 통해 교정 기능이 활성화된 모습

 

5) Verilator linter 설정

 

'4) - iii)'에서 했던 것처럼

확장기능 설정에서

'Verilog > Linting: Linter'로 간 다음, 'verilator'를 선택합니다.

이때,

좌측 위의 'User'와 'Remote [WSL: Ubuntu]' 중

'Remote [WSL: Ubuntu]'를 선택해야 합니다.

 

Linter로 'verilator'를 설정한 모습

 

위에서 했던 방식과 비슷하게,

'Verilog > Linting > Verilator: Run At File Location' 옵션을 설정합니다.

이때 verilator의 경우 한 가지 더 수정해야 할 옵션이 있습니다.

바로 'Verilog > Linting > Verilator: Arguments'입니다.

이 옵션은 베릴레이터 실행 시 추가 명령어를 입력할 수 있는 기능입니다.

여기에 '--timing'을 입력하겠습니다. 만약 입력하지 않을 경우,

베릴로그 파일에서 '#time' 명령어를 사용 시

'--timing' 또는 '--no-timing' 중 하나를 선택하라는 Lint를 확인할 수 있습니다.

 

verilator의 실행 경로 관련 옵션

 

 

이제 VS Code를 재시작한 뒤, Linting 기능이 잘 작동하는지 확인해 봅시다.

위에서 언급했듯이, Linting 기능은 저장을 한 뒤에 작동합니다.

따라서 수정만 하고 저장을 하지 않았다면 Linting 기능이 작동하지 않을 수 있습니다.

 

verilator를 통해 교정 기능이 활성화된 모습

 

6. VS Code 베릴로그 Formatter 활성화

 

코딩 분야에서 Formatter는 다양한 스타일의 코드를 하나의 포맷으로 통일시켜 주는 기능입니다. 한 사람이 작성하고 한 사람이 읽는 코드를 가정해 봅시다. 이 경우 코드를 읽거나 쓸 때 큰 문제가 없습니다. 그러나 여럿이서 작업을 해야 한다면 사람마다 다양한 코딩 포맷 스타일을 가지고 있기 때문에 다른 사람의 코딩 포맷이 나의 코딩 포맷과 다를 수 있습니다. 그 결과 서로의 코드를 이해하는 데 문제가 생길 수 있습니다. 이때 Formatter 기능을 사용한다면 어떤 사람이 작성하더라도 통일된 양식이 있기 때문에 쉽게 다른 사람의 코드를 이해할 수 있을 것입니다. 이 글에서 우리는 'Verilog Format'을 설치한 다음 VS Code에서 쉽게 작동시킬 수 있도록 관련 확장기능을 추가해 볼 것입니다. 이 기능에 대해 저는 아래 링크들의 도움을 많이 받았습니다:

(https://nx006.tistory.com/62)

(https://github.com/ericsonj/verilog-format)

 

시작하기 전에,

'Verilog Format'의 경우 설치하는 방법이 구글에 많이 있습니다만 한국 자료의 경우 윈도우 설치가 주류입니다. 그러나 필요하신 분들이 있을까 봐 설치과정이 잘 적혀있는 링크를 남기겠습니다:

(https://velog.io/@pikamon/VSCode-1)

 

Verilog Format 설치

 

아무 폴더를 하나 생성한 다음, 'Verilog Format' 깃허브의 'Install in Linux' 절차를 따라 Verilog Format을 설치할 수 있습니다. ' 2. Install verilog-format '까지 명령어를 입력한 다음 3번,4번,5번 중 자신이 원하는 스타일에 따라 자유롭게 설치 방법을 택할 수 있습니다. 저는 1번 -> 2번 -> 5번 순서로 진행하였습니다.

 

'Verilog Formatter' 설치

 

Java 설치

 

Verilog Formatter를 실행하기 위해서는 자바가 필요합니다.

Java를 설치하는 방법은 구글에 너무나도 많이 있기 때문에 여기서 직접 하나하나 설명하진 않겠습니다. 그러나 필요하신 분들이 있을까 봐 설치과정이 잘 적혀있는 링크를 남기겠습니다:

(https://velog.io/@ung6860/%EA%B0%9C%EB%B0%9C%ED%99%98%EA%B2%BDUbuntu%EC%97%90-Java-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0)

 

Java 설치

 

Rocky Linux의 경우 아래의 링크를 참조할 수 있습니다.

(https://blog.iamwhatiam.co.kr/225)

 

Java 설치(Rocky)

 

이후 Verilog format을 실행시켜 봅시다. 명령어는 아래와 같습니다:

 

verilog-format

 

Verilog Format이 실행된 모습

 

환경설정 파일 생성

 

Verilog Format은 들여쓰기너비(IndentWidth) 등 다양한 값을 커스텀할 수 있습니다. 이를 위해 우리는 커스텀 정보가 담긴 환경설정 파일을 생성할 필요가 있습니다. Vim의 환경설정 파일처럼 간단하게 홈 파일(/home/사용자명)에 '.verilog-format.properties'를 하나 만들어봅시다. 설정 값은 'Verilog Format' 깃허브에 있는 예시를 참고했습니다. Vim의 환경설정 파일은 아래 링크의 ' 2) 환경설정 파일 생성 '을 참고 바랍니다:

(https://zehonyi21.tistory.com/32)

 

## File .verilog-format.properties
IndentWidth=4
IndentType=space
SpacesBeforeTrailingComments=0
SpacesAfterTrailingComments=0
AlignLineComments=true
AlignNoBlockingAssignments=true
AlignBlockingAssignments=true
SpacesInParentheses=false
SpacesInSquareBrackets=false

 

.verilog-format.properties 파일

 

이때 .verilog-format.properties의 위치는 /home/(사용자명)/.verilog-format.properties 입니다.

 

이제 Verilog Format 기능을 아무 베릴로그 파일에 적용해 봅시다. tmp.v 파일을 수정한다면 명령어는 아래와 같습니다:

verilog-format -p -f tmp.v -s ~/.verilog-format.properties

 

Verilog Format이 작동한 모습

 

실제 파일과 변환된 파일을 비교했을 때 코딩 포맷이 바뀐 사실을 확인할 수 있습니다.

 

VS Code 확장기능 설치

 

베릴로그 코드를 읽을 때마다 명령어를 친다면 매우 번거로운 일이 될 것입니다. 다행히도 VS Code에 있는 확장기능을 사용한다면 단축키를 통해 코딩 포맷을 바꿀 수 있습니다.

 

Verilog Format 확장기능

 

확장기능을 설치하고 ' 5. VS Code 베릴로그 Linter 활성화 '에서 했던 것처럼 설정으로 들어가 verilog-format 파일의 경로와 .verilog-format.properties파일의 경로를 적어줍니다.

 

Verilog Format 확장기능 설정

 

이제 아무 베릴로그 파일의 코딩 포맷을 바꿔봅시다. 만약 'Verilog-HDL/SystemVerilog/Bluespec SystemVerilog' 확장기능과 'Verilog Format' 확장기능을 둘 다 설치했다면 둘 중 하나를 고르라는 메시지를 확인할 수 있습니다. 만약 다른 확장기능의 포맷터를 쓰고 싶다면 'Ctrl + Shift + P' -> 'Format Document With'를 클릭하여 변경할 수 있습니다.

(https://stackoverflow.com/questions/63954584/how-to-make-prettier-the-default-formatter-in-vs-code)

 

베릴로그 확장기능 선택

 

Verilog Formatter 사용 전

 

Verilog Formatter 사용 후

 

III. 결론

 

오늘 우리는 간단한 과정을 통해 파이썬으로 베릴로그를 코딩하는 방법과 이를 주피터에서 실행하는 방법을 배울 수 있었으며, VS Code를 통해 교정 기능을 사용하는 방법 또한 배울 수 있었습니다. 솔직히 이런 프로그램이 없더라도 간단한 회로는 이카루스 베릴로그와 메모장만 있으면 됩니다. 그러나 모듈이 엄청나게 커지고(Very Large Scale) 테스트해야 할 입/출력 목록들도 커질 경우 더 이상 메모장으로는 버거운 상황이 오기 마련입니다. 이것은 마치 현대 AI 프로그래밍에서 LLM과 같은 굉장히 거대한 모델을 다루기 위해 복잡한 라이브러리로 무장한 프로그래머들을 보는 것과 비슷합니다. 만약 그들에게 gcc 명령어와 메모장만 주고 커다란 모델을 만들라고 한다면 그들은 바로 도망갈 것입니다. 따라서 베릴로그에서도 마찬가지로 개선된 개발 환경은 아주 중요하다고 생각합니다. 비록 위에 언급된 프로그램이 완전하게 베릴로그를 대체 또는 상위호환할 수는 없겠지만 적어도 코딩에 대한 진입장벽은 낮춰줄 수 있을 거라 생각합니다.

 

IV. 도움이 될 만한 링크

 

MyHDL

(https://www.myhdl.org/)

 

cocotb

(https://www.cocotb.org/)

 

EDA Playground

(https://www.edaplayground.com/)

 

깃허브 코파일럿 학생인증 (Github Copilot Student)

(https://hipposdata.tistory.com/72)

 

 

 

 

 

 

+ Recent posts