SoC 설계/Verilog, SystemVerilog

Verilog: Icarus Verilog, GTKwave

yztech 2021. 10. 16. 13:45
반응형

하드웨어 프런트엔드 (Hardware frontend) 설계를 위해서는 HDL 시뮬레이터와 합성 툴이 필요하다.
C나 C++, Python과 같은 SW 들은 무료로 사용할 수 있는 Visual Studio, GCC와 같은 컴파일러들이 있지만, 하드웨어 설계 분야는 거의 대부분이 유료의 상용 소프트웨어들이고, 개인이 구매하기엔 소프트웨어 가격이 매우 높다.
주로 사용되는 상용 툴로는 Synopsys사의 VCS, Cadence사의 NCS, Mentor사의 Questa, Modelsim 등이 있다.
Doulos가 운영하는 EDA Playground는 회원가입을 하면, Cadence, Synopsys, Mentor의 상용 시뮬레이터를 무료로 사용해 볼 수 있다.
또한, 디자인이 작거나, 약간의 불편함을 감수한다면, 개인이 무료로 사용할 수 있는 툴들도 있는데, Verilator, Icarus Verilog 등이 무료로 사용 가능한 컴파일러를 포함한 시뮬레이터들이다.

Icarus Verilog: Ubuntu 버전 설치

Icarus Verilog는 무료 Verilog 합성 및 시뮬레이션 툴이다. 이 툴은 Verilog (IEEE-1364) 소스들을 컴파일해서 바이너리 형태의 netlists를 생성하고, 시뮬레이션할 수 있다.
Icarus Verilog에 관련된 다양한 정보들은 해당 홈페이지(http://iverilog.icarus.com/)에 들어가서 확인해본다.
우분투에서 Icarus Verilog를 설치하기 위해서는 커맨드 창에서 아래 명령들을 수행한다.
(1) 로컬 저장소 캐시를 업데이트하고,
(2) Icarus Verilog 패키지를 설치한다.

sudo apt update
sudo apt install iverilog

OS별로 설치 방법을 확인해보려면, Installation Guide(https://iverilog.fandom.com/wiki/Installation_Guide)를 참고한다.

GTKWave: Ubuntu 버전 설치

GTKWave는 Icarus Verilog 혹은 Verilator 개발자들이 가장 많이 사용하는 무료 waveform viewer이다.
GTKWave는 Verilog VCD/EVCD 파일들을 읽어서, GUI형태의 waveform으로 보여준다.
관련된 정보는 GTKWave의 공식 사이트 (http://gtkwave.sourceforge.net/)에서 확인할 수 있다.
설치를 위해서는, 터미널 창에서 아래 명령들을 수행한다.
(1) 로컬 저장소 캐시를 업데이트하고,
(2) gtkwave 패키지를 설치한다.

sudo apt update
sudo apt install gtkwave

기본 사용방법

컴파일 방법은 다음과 같이, iverilog 실행파일의 인자로 -o 옵션 다음에 출력 파일이름 (test.out)을 넣고, 그 다음에는 컴파일할 파일명들 (test.v a.v b.v)을 나열하면, 컴파일된 netlist가 바이너리 파일(test.out)로 생성된다.

# Usage: iverilog -o [output file] [input files]
iverilog -o test.out test.v a.v b.v

시뮬레이션 방법은 vvp 실행파일의 인자로 바이너리 파일 (test.out)을 넣어주면 실행결과가 터미널에 출력된다.

vvp test.out

만약 waveform을 확인하고자 한다면, testbench에서 vcd 출력 파일을 생성할 수 있도록 (4-5)와 같이 두 개의 문장을 추가해야 한다. $dumpfile은 GUI를 통해 waveform을 확인할 수 있도록 VCD파일을 생성하는 것이고, $dumpvar는 해당 모듈 (testbench)의 신호들을 dump 한다.

module testbench;

initial begin
        $dumpfile("testbench.vcd");
        $dumpvars(0,testbench);
    end
...
end

dumpvars 사용법

$dumpvar의 문법은 아래와 같이, dump 할 모듈의 level과 dump할 모듈명을 인자로 넣어준다.

$dumpvar(level, module);
문법 설명
$dumpvars; 현재 testbench 의 모든 변수들을 dump한다.
$dumpvars(0, testbench); testbench 라는 모듈의 모든 하위 module들의 변수들을 dump한다.
$dumpvars(0, testbench.top); testbench.top 모듈의 모든 하위 module들의 변수들을 dump한다.
$dumpvars(1,testbench.top); testbench.top 모듈의 변수들만 dump한다.
$dumpvars(2,testbench.top); testbench.top 모듈의 첫번째 하위 module들의 변수까지 dump한다.

GTKwave를 사용하여 waveform을 확인하고자 한다면, 위 시뮬레이션을 통해 만들어진 VCD 파일을 gtkwave로 열면 된다.

gtkwave testbench.vcd

 

Makefile

Verilog를 이용한 HW logic설계 시에는 컴파일, 시뮬레이션, waveform확인 등의 작업이 반복된다. 지금까지 수행한 내용들을 바로 실행해서 확인할 수 있도록 makefile을 만들면, 모든 과정을 한 번에 일괄적으로 처리할 수 있어서 매우 편리하다.

CC = iverilog
FLAGS = -Wall -Winfloop

default: test.v a.v b.v
    $(CC) $(FLAGS) -o test.out test.v a.v b.v
    vvp test.out

    gtkwave testbench.vcd

위 makefile이 동작하라면 모든 .v, .vcd 파일들이 같은 폴더에 있어야 한다. 터미널에서 간단하게 make라고 입력하면 컴파일, 시뮬레이션, waveform까지 한 번에 확인할 수 있다.

make
반응형

'SoC 설계 > Verilog, SystemVerilog' 카테고리의 다른 글

SystemVerilog: Arrays  (0) 2023.03.10
SystemVerilog: modport  (0) 2023.03.10
SystemVerilog: Testbench  (0) 2023.02.23
SystemVerilog: 소개  (0) 2023.02.22
Verilog: timescale, delay  (0) 2021.10.16