이 글에서는 HDL 중 하나인 베릴로그(verilog)의 개요와 simulation 방법에 대해 소개하겠습니다.
HDL(Hardware Description Language) 이란?
HDL은 기본적인 소자에서 실제 반도체 chip에 이르기까지 디지털 시스템의 설계와 검증에 사용되는 하드웨어 기술 언어로, 회로의 기능과 timing에 관해 기술할 수 있습니다.
유의할 점은, 소프트웨어 설계 언어가 아니라 하드웨어 설계 언어이기 때문에 일반적인 컴퓨팅 언어와 차이가 있습니다.
HDL을 사용하는 이유
그렇다면 왜 반도체는 설계도가 아닌 HDL로 설계하는 걸까요?
회로도 예시를 가져와 봤습니다. 여러 component와 and gate도 보이는데요, 요즘의 칩은 과거에 비해 성능이 월등히 좋습니다. 그렇기 때문에 기본적으로 억대의 트랜지스터로 이루어져 있습니다. 이걸 일일이 그리는 것은 불가능하겠죠??
예전에는 논리 게이트를 일일이 그려서 설계했다고는 하는데, HDL을 합성해 주는 EDA(Electronic design automation) tool이 나온 뒤로는 HDL을 통해 반도체 설계를 합니다.
Verilog simulation 환경 세팅
EDA playground
Verilog는 VHDL과 마찬가지로 HDL 중 하나입니다, VHDL은 대학이나 연구기관에서 사용하고 Verilog는 산업에서 많이 사용하는 것으로 알고 있습니다.
시뮬레이션과 합성은 앞에서 말한 EDA tool을 통해 진행합니다. 하지만 이러한 tool은 거의 유료여서 웹상에서 무료로 시뮬레이션을 할 수 있는 EDA playground를 소개해 드리겠습니다.
먼저 우측 위에 Log in을 눌러 로그인하셔야 합니다. 그리고 좌측 중간에 있는 Tools & Simulators를 아래와 같이 세팅해 주세요.
Icarus Verilog는 무료로 simulation을 할 수 있는 tool입니다. ‘Open EPWave after run’을 체크하면 시뮬레이션이 끝난 뒤 waveform을 볼 수 있습니다.
그러면 testbench.sv에 다음과 같이 작성해 보겠습니다, design.sv는 작성하지 않아도 됩니다.
module top ();
initial begin
#1000
$finish;
end
endmodule위의 코드가 무슨 의미인지는 차차 설명하겠습니다. 상단의 run을 누르면 simulation이 시작됩니다.
그러면 아래 Log에 다음과 같은 에러 코드가 뜹니다.
No *.vcd file found. EPWave will not open. Did you use ‘$dumpfile(“dump.vcd”); $dumpvars;’?
이건 dump 파일을 만들지 않았다는 의미인데, waveform을 보려면 dump 파일을 만들어줘야 합니다. 코드를 다음과 같이 수정해 봅시다.
module top ();
//시뮬레이션 time
initial begin
#1000
$finish;
end
//dump file 만들기
initial begin
$dumpfile("dump.vcd");
$dumpvars;
end
endmodule그리고 다시 한번 run을 누르면 아래와 같은 waveform 창이 나옵니다.
아직 아무것도 선언하지 않았기 때문에 waveform에 아무 정보도 나오지 않습니다. 그러면 마지막으로 코드를 다음과 같이 수정하고 시뮬레이션을 시작해 보겠습니다.
module top ();
//reg 선언
reg a;
//reg control
initial begin
a = 1;
#100
a = 0;
#100
a = 1;
end
//시뮬레이션 time
initial begin
#1000
$finish;
end
//dump file 만들기
initial begin
$dumpfile("dump.vcd");
$dumpvars;
end
endmodulea라는 reg가 1 -> 0 -> 1로 바뀌는 것을 확인할 수 있습니다. 위 코드는 앞으로 설명하도록 하겠습니다.
이렇게 EDA playground에서 verilog를 사용해 시뮬레이션을 진행해 보았습니다.
Icarus verilog & gtkwave
EDA Playground는 분명 좋은 사이트지만, 인터넷이 연결되어야 하고 로그인해야 사용할 수 있습니다. 그리고 simulation time이 길어지면 waveform 결과를 볼 수 없다는 단점이 있습니다.
이를 해결하기 위해 window에서 Icarus verilog라는 툴을 사용해서 시뮬레이션을 해볼 수 있습니다. 우선 Icarus verilog와 gtkwave 설치 방법은 이 글을 참고해 주세요.
위의 top module을 top.v라는 이름의 파일로 저장했습니다. 그리고 윈도우+R 키를 눌러 실행 창을 열고 cmd를 입력하면 cmd창을 열 수 있습니다. 그리고 cd 명령어를 사용해서 top.v를 저장한 폴더로 이동해주세요.
그 후 아래 명령어를 입력하면 됩니다.
- 컴파일: iverilog -o test.vvp top.v (test.vvp 파일 생성됨)
- 시뮬레이션 실행: vvp test.vvp (top.v에서 만들기로 한 dump.vcd 파일 생성됨)
- waveform 열기: gtkwave dump.vcd (생성된 dump.vcd 파일로 waveform 창을 확인)
컴파일
컴파일할 때 생성할 파일 이름(test.vvp)과 컴파일에 사용되는 파일(top.v)을 입력합니다. 컴파일 후 파일 목록을 보면 test.vvp 파일이 생성된 것을 확인할 수 있습니다.
하지만 설계하다 보면 컴파일에 사용되는 파일들이 점점 많아지게 됩니다. 만약 컴파일 목록이 top.v module_1.v module_2.v 라고 한다면 컴파일 명령어는
iverilog -o test.vvp top.v module_1.v module_2.v
가 될 겁니다. 너무 귀찮죠;;;;; 그래서 list 파일을 만들어서 명령어를 간단하게 만들 수 있습니다. 만약 list 파일을 test.f라고 한다면
//test.f
top.v
module_1.v
module_2.v
이렇게 입력하고 저장합니다. 그리고 명령어를 다음과 같이 입력하면 동일한 컴파일 결과를 얻을 수 있습니다.
iverilog -o test.vvp -c test.f
그러니까 test.f (list 파일)만 수정하면 동일한 명령어로 컴파일을 돌릴 수 있는 겁니다.
Simulation 실행
실제 시뮬레이션이 실행되면 top.v의 initial 문에서 설정했던 dump 파일이 생성됩니다.
//dump file 만들기
initial begin
$dumpfile("dump.vcd");
$dumpvars;
endWaveform 확인
마지막으로 waveform을 여는 명령어를 입력하여 시뮬레이션 결과를 확인하면 됩니다. 그리고 모든 과정이 끝나면 dump 파일인 .vcd 파일과 .vvp 파일은 삭제하시면 되겠습니다.
유의할 점은 명령어에 입력한 파일 이름들을 꼭 확인해야 합니다!!!
Makefile
이카루스 툴을 사용할 때 컴파일, 시뮬레이션 실행, waveform 확인을 위한 각각의 명령어가 있습니다. 하지만 이것을 일일이 다 외우기에는 힘든데요, Makefile을 사용하면 명령어를 간소화할 수 있습니다.
파일에 대한 반복적인 명령을 자동화시켜 주는 기능인데요, 원래는 리눅스 환경에서 사용하지만, GNU make를 설치하면 window 환경에서도 사용할 수 있습니다. 설치 방법은 이 글을 참고해 주세요.
그러면 top.v와 test.f 파일이 있던 디렉토리에 Makefile이라는 파일을 만들고 아래 코드를 입력해주세요.
run:
iverilog -o test.vvp -c test.f
dump:
vvp test.vvp
wave:
gtkwave dump.vcd
#----------------------------------------------------------------------------------------------------
# Rule to clean temp files
#----------------------------------------------------------------------------------------------------
clean:
del *.vcd *.vvp
위에서 설명해 드린 컴파일, 시뮬레이션 실행, waveform 확인 명령어가 각각 run, dump, wave라는 명령어로 변환시켜달라는 의미입니다. clean은 .vcd .vvp 파일을 모두 삭제(del)한다는 뜻입니다. 참고할 점은 run, dump, wave, clean 같은 명령어는 유저가 마음대로 설정할 수 있습니다.
위와 같이 설정했으면 cmd 창에서 입력하는 명령어는 다음과 같습니다.
- 컴파일: make run
- 시뮬레이션 실행: make dump
- waveform 확인: make wave
- dump file 제거: make clean