본문으로 바로가기

1. 설치


공학관련 공부를 하면서 느낀 건데, 뭐든지 처음 접할 때는 관련된 도구의 기초적인 사용법부터 익혀야 한다. 우선 VHDL 코드를 돌릴 수 있는 시뮬레이터부터 구해야 한다. 학생용 버전을 무료로 구할 수 있는 Modelsim 프로그램을 사용하도록 한다. 다음 홈페이지에 접속한다.


http://model.com/


학생용 버전을 클릭한다. 다운로드 창에 들어가면 정보를 입력하라고 나오는데 적당히 입력하도록 한다. 다운로드를 받은 뒤, 라이센스 파일도 얻도록 한다. 홈페이지 설명을 읽어보면 안다;;;;; (사실, 재등록해서 스샷 찍기가 귀찮다 ㅡㅡ;;)


2. 가장 간단한 Simulation 수행법


설치된 프로그램으로 간단한 하드웨어 시뮬레이션을 만들면서 사용법을 살펴본다. 가장 단순한 방법은 코드만 짜서 라이브러리에 추가한 후 시뮬레이션 하는 방법이다. 프로젝트를 이용해 수행하는 방법도 있는데, 뒤에서 설명하도록 한다. 지금은 코드만 라이브러리에 추가해서 수행해 본다. 우선 설치된 프로그램을 실행하면 다음과 같은 창이 뜬다.



우선 시뮬레이션을 생성할 폴더를 선택해야한다. File >> Change Directory를 선택해 사용할 폴더를 선택한다.  일단 c:/test 폴더를 선택했다고 가정하자. 폴더를 선택하면 가장 아래쪽의 Transcript창에 폴더가 이동되었다는 메세지가 뜬다. (정확히 말하면 폴더 이동 명령어이다. 참고로 Transcript창에 적절한 명령어를 치면 GUI 메뉴로 선택한 것과 같은 동작이 수행된다.) 폴더가 이동되어도 큰 변화는 없는데, 우선 library 부터 살펴본다. 



위 라이브러리들은 기본으로 제공되는 것으로 C언어의 표준 헤더파일과 비슷한 개념을 가지고 있다. 일단 이 정도로만 알아둔다. ModelSim에서는 다음과 같은 과정을 거쳐 시뮬레이션을 만들 수 있다.



VHDL로 작성된 .vhd 파일을 컴파일 하면 모두 work 라이브러리에 자동 등록이 된다. 이 등록된 Entity를 이용해 시뮬레이션을 할 수 있다.(Entity 개념은 뒤에서 설명. 일단 '설계한 회로' 라고만 이해한다.)  그럼 working library부터 만들어 본다.




새로운 라이브러리를 생성한다. 라이브러리를 생성한 뒤, 라이브러리 창을 살펴보면 work 라이브러리가 추가된 것을 확인할 수 있다. c:/test를 탐색기로 열어보면 c:/test/work 폴더가 생성된 것을 알 수 있고, 그 안에는 _info 파일이 존재한다. 이 파일은 라이브러리의 정보를 기록한 파일인데, 그냥 가만히 둔다. 또, c:/test 폴더 안에 modelsim.ini 파일이 새로 생긴 것을 확인할 수 있다. 이것도 그냥 가만히 둔다. 참고로 Transcript 창을 살펴보면 여러 명령어와 경고 문구가 새로 생긴 것을 확인할 수 있다.


vlib work

vmap work work

# Copying C:\Modeltech_pe_edu_10.1a\win32pe_edu/../modelsim.ini to modelsim.ini

# Modifying modelsim.ini

# ** Warning: Copied C:\Modeltech_pe_edu_10.1a\win32pe_edu/../modelsim.ini to modelsim.ini.

#          Updated modelsim.ini.


위에서 말했듯이 위 명령을 그대로 입력하면 GUI 없이 똑같은 작업을 수행할 수 있다. # 뒤에 문장은 설명문인데 읽어보면 알겠지만 ini 파일을 복사해 library mapping을 수행했다는 뜻이다.


설계할 회로(Entity)를 저장할 라이브러리를 만들었으니, 이제 본격적인 회로 설계를 한다. 



새로운 파일을 생성한다. VHDL 언어로 만들 것이므로 VHDL을 선택한다. 선택하면 옆에 Edit 창이 새로 생겨나게 된다. Visual Studio를 써 봤던 분들은 이제 좀 안심이 되기 시작할 것이다. 어쨋든 간단한 회로를 작성한다. 가장 쉬운 or 게이트 회로를 만들어 보겠다.


library IEEE;

use IEEE.std_logic_1164.all;


entity or_gate is

    port( X, Y : in std_logic;

          A : out std_logic);

end;


architecture design of or_gate is

begin

        

        A <= X or Y;

        

end design;


처음 보는 분은 코드 내용이 이해가 안되겠지만 지금은 프로그램 사용법만 보는 것이므로 복사해 붙여넣도록 한다. 붙여넣은 뒤 File >> save 메뉴를 선택해 저장한다. 창이 뜨는데, 적당한 이름을 정한다. test.vhd란 이름으로 저장하도록 하겠다. 파일 형식은 말 안해도 알겠지만 VHDL Files를 선택한다. 확장자도 반드시 입력한다.


파일을 저장한 뒤에는 컴파일을 해야한다. 이전에 저장한 파일을 선택한 뒤 Compile을 클릭한다. 여기서 알 수 있겠지만, test.vhd 파일은 사실 아무 폴더에 던져놔도 크게 상관없다. 하지만 관리를 위해 같은 폴더에 두는게 좋다.



컴파일을 클릭해도 아무 변화가 없는데 이럴 때는 Transcript 창을 살펴본다. 


vcom -reportprogress 300 -work work C:/test/test.vhd

# Model Technology ModelSim PE Student Edition vcom 10.1a Compiler 2012.02 Feb 22 2012

# -- Loading package STANDARD

# -- Loading package TEXTIO

# -- Loading package std_logic_1164

# -- Compiling entity or_gate

# -- Compiling architecture design of or_gate


컴파일이 되었음을 확인할 수 있다. 위 내용이 가리키는 내용은 package를 설명할 때 다시 언급하겠다.(별 내용은 아니지만...)

 

위에서, 설계한 회로(Entity)는 모두 work 라이브러리에 보관된다는 설명을 기억할 것이다. 그럼 당연히 work 라이브러리에 무슨 일이 생겼는지 확인해보고 싶은 생각이 들 것이다. 



or_gate 회로가 추가된 것을 확인할 수 있다. 소스코드의 Path를 확인해보면 C:/test/test.vhd 임도 확인할 수 있다. test 폴더를 탐색기로 열어보면 work 폴더 안에 or_gate 폴더가 새로 생성되어 있고 안에 이상한 파일 몇 개가 생성되어 있음을 확인할 수 있다. 간단히 말하자면 or_gate란 회로가 만들어졌고 그 내부는 or_gate 폴더 내부 2진 파일들로 저장이 되어 있는 형태이다. 즉, 이제 소스코드는 지워버려도 상관 없다는 뜻이다. 하지만, 회로 설계가 잘못되어 수정하거나 기능을 추가할 때 쓸 일이 분명히 있을테니 삭제할 필요는 없다.


이제 회로도 완성되었고, 작동시키는 일만 남았다. 하지만 그 전에 해야할 일이 한가지 더 있다. 바로 testbench 파일을 작성하는 것이다. testbench를 작성하는 이유는 간단하다. 회로 그 자체만 가지고는 입력이 어떤 것이 들어오는지 정해지지 않은 상태인 것이다. 하드웨어적인 관점에서 살펴보면 회로만 만들어진 상태이고 입력이 없으니 회로에 입력을 가해주는 다른 부가회로가 더 필요한 것이다. 관용적으로 이 부가 회로를 testbench라고 부르고 있다. 새로운 파일을 생성한 뒤 이름은 test_tb.vhd로 정해준다. 그 뒤 저장을 하고 컴파일을 한다. 코드는 다음과 같다.


library IEEE;

use IEEE.std_logic_1164.all;


entity tb_or_gate is

end tb_or_gate;


architecture design of tb_or_gate is

    

    component or_gate is

      port( X, Y : in std_logic;

            A : out std_logic);

    end component;

    

    signal X, Y : std_logic := '0';

    signal A : std_logic := '0';

    

begin

   

   U0 : or_gate port map(X=>X, Y=>Y, A=>A);

   

   

   process

   begin

      X <= '0';

      Y <= '0';

      wait for 10ns;

      X <= '0';

      Y <= '1';

      wait for 10ns;

      X <= '1';

      Y <= '0';

      wait for 10ns;

      X <= '1';

      Y <= '1';

      wait;

   end process;

   

end design; 


어찌된게 or 회로보다 코드가 더 길다 ㅡㅡ;;; testbench 작성법도 나중에 따로 설명하기로 하고 일단 복사해서 사용하자. 컴파일을 한 뒤 라이브러리 창을 살펴보면 마찬가지로 tb_or_gate 가 추가되어 있다. 이제 외부 입력을 가해주는 회로가 완성이 된 것이다. 그러므로 시뮬레이션을 할 때는 testbench 회로를 이용해야 한다. Simulation >> Start Simulation을 선택하면 다음과 같은 창이 뜨는데 work 라이브러리에서 tb_or_gate를 선택한 뒤 OK를 누른다.



화면이 버벅이다가 여러 창이 뜨게 되는데, Wave 창이 뜨는지 확인 한다. 없으면 View 메뉴에서 Wave에 체크 표시를 한다. 웨이브 창이 뜨면 다음과 같은 화면을 이루게 된다.



이제 Wave 창에 우리가 확인할 신호 값을 넣어 파형을 확인해야 한다. 다음 그림과 같이 추가하도록 한다.



아니면 간단하게 드래그해서 추가할 수 도 있다. 편한 방법을 쓰자.


이제 Transcript 창에 run 명령을 이용해 시뮬레이션을 수행한다. run 시간 을 입력하면 된다. 

run 20ns 를 입력하면 다음과 같은 파형을 확인할 수 있다.



우리가 원하는 동작을 하는지 살펴보고 잘못되었으면 코드를 수정해 다시 시뮬레이션을 수행해본다. 시뮬레이션을 종료할 때는 Simulation >> End Simulation을 선택한다.


시뮬레이션을 수행한 뒤, 종료하고 탐색기로 test 폴더를 열어보면 vsim이라는 정체불명의 파일이 존재한다. 이 파일은 방금 수행한 시뮬레이션 결과값을 2진 코드로 저장하고 있다. 이 파일을 클릭해 열어보면 정체불명의 언어들이 쓰여있는데, 이를 ModelSim으로 읽어들이면 이전 시뮬레이션과 똑같은 파형을 확인할 수 있다. 즉, 시뮬레이션 결과값만 남에게 보내주고 싶으면 vsim.wlf 파일만 건네주면 되는 것이다. 시뮬레이션 데이터를 읽어 오려면  다음과 같은 명령을 Transcript에 입력한다.


vsim -view vsim.wlf



3. Project를 이용한 Simulation 수행법


보통 시뮬레이션을 할 때는 2번 방법 보다는 Project를 이용한 방법을 주로 사용한다. 굳이 Project 없이 해도 되지만 파일 관리가 편해서 이 방법을 많이 쓴다. 과정은 다음 그림과 같은데, 자세히 보면 알겠지만 2번과 거의 비슷하다.


일단 실습하기 전에 c:/test 폴더를 계속 쓸 것이므로 폴더 내부의 내용을 전부 삭제한다.

File >> New >> Project를 선택하면 다음과 같은 창이 뜬다. 



Project Name 에는 적당한 이름을 넣어주고, Project Location에는 프로젝트를 저장할 폴더를 선택한다. Default Library Name을 보면 work로 지정되어 있는데, 2번에서 열심히 쓰던 그 work이다. 즉, 프로젝트를 생성하면 굳이 work 라이브러리를 따로 만들어 주지 않아도 자동으로 생성되게 됨을 알 수 있다.

일단 프로젝트 이름은 test2로 지정하였다. OK를 선택하면 Item 추가 창이 뜨는데, 새로운 파일을 추가할 수도 있고 이미 만들어둔 파일을 프로젝트로 추가할 수 도 있다. 보통 소스 코드를 프로젝트 폴더로 옮긴 뒤에 추가하는데 굳이 그러지 않아도 상관없다. 하지만 관리의 편의성을 위해 소스 코드를 옮겨서 쓰도록 한다.

일단 소스코드를 다시 작성할 것이므로 New Item을 선택한다.



다음과 같이 입력한다. 확장자는 써도 되고 안써도 된다. testbench 파일도 추가해 준다. 코드는 2번에서 사용한 코드를 그대로 사용한다. 코드 작성을 완료하면 모두 저장을 해준다. 저장을 하면 project 창에 다음과 같이 뜨게 될 것이다.



이 창에서 얻을 수 있는 정보는 여러가지가 있는데, 주의할 것은 Status와 Order 부분이다. Status는 모두 4가지 표시가 가능하다. 모양이 물음표 표시일 때는 파일 내용이 변경된 뒤에 라이브러리에 반영이 아직 되지 않았다는 뜻이다. 즉, 컴파일을 다시 해 라이브러리에 반영해야 한다. 그러므로 코드를 수정한 뒤에 저장만 하고 시뮬레이션을 돌리면 아무 소용이 없다. 



파일 위에서 오른쪽 버튼을 클릭하면 위와 같은 메뉴가 뜨는데, 선택한 파일만 컴파일, 전부 컴파일, 날짜 순대로 컴파일, Order 순대로 컴파일 등등의 메뉴가 있다. 학생인 우리들은 손쉽게 전부 컴파일을 눌러주면 되지만, 프로젝트 규모가 엄청나게 커지면 컴파일 하는데도 몇시간이 걸리므로 그 때는 변경된 것들만 컴파일 해주는 요령이 필요하다. Compile All을 하면 다음과 같이 표시가 녹색 체크로 변환된다. 



녹색 체크는 아무 에러, 경고 없이 컴파일이 되었다는 뜻이고, 노란색 표시가 있는 체크는 에러는 없지만 경고가 있다는 뜻이다. 테스트 벤치의 경고는 큰 문제가 없는 것이지만 사실, 모든 경고를 전부 체크하는 것이 좋다. 이 경고는 컴파일 과정이 이상해서 발생하는 것으로, testbench내의 component가 test 파일에 존재해서 생기는 것이다. 이 경고를 없애려면 컴파일 순서를 조정해야 하는데 다음과 같이 진행한다.

파일 위에서 마우스 오른쪽을 클릭한 뒤, Compile Order를 선택한다. 그러면 다음과 같은 창이 뜨는데 Auto Generation을 선택해 준다. 물론, 수동으로 순서를 조정해도 된다.



그럼 컴파일러가 자동으로 서로 의존 관계를 알아내서 순서대로 컴파일을 해준다. 이제 프로젝트 창의 Status를 확인해보면 모두 녹색 체크로 변한 것을 확인할 수 있다.


이제 라이브러리를 확인해보면 work 라이브러리 안에 설계한 회로가 등록된 것을 확인할 수 있다. 그 다음에는 2번과 마찬가지로 시뮬레이션을 해주면 된다.


이제 test 폴더를 탐색기로 열어보자. 탐색기로 확인해보면 또 이상한 파일들이 몇개 생겨있는 것을 확인할 수 있다. 그 중 체크할 것은 test2.mpf 파일이다. 아마 더블클릭하면 이상한 프로그램이 실행될텐데, 연결 프로그램을 ModelSim으로 바꿔주면 저장되있던 project가 열려 작업을 계속할 수 있다.


마지막으로 프로젝트 관리를 위한 폴더 생성법을 알아본다. 프로젝트 윈도우에서 마우스 오른쪽 클릭한 뒤에 Add  to Project >> Folder를 선택하면 폴더 추가 창이 뜬다. 적당한 이름을 입력하고 Location을  결정한다. 지금은 Top level로 선택한다.



이제 Folder 내부로 옮길 파일을 선택한 뒤에 오른쪽 버튼을 클릭, Properties를 선택한다. 그럼 다음과 같은 창이 뜨는데 Place in Folder를 선택해서 Code 폴더를 선택해 준다.



여기서 재미있는 것을 또 알 수 있는데, 폴더를 만들었다고 해서 실제 폴더가 C:/test 내부에 생성되는 것이 아니라 Project 내에서만 만들어 지는 것이다. 그러므로 test.vhd를 Code 폴더로 옮겼다고 해서 그 파일의 경로가 C:/test/Code/test.vhd가 되는 것이 아니다. 단지 관리 편의를 위해 가상 폴더가 만들어졌고 그 안으로 위치를 옮겨준 것이라고 생각하면 된다. 참고로 이런 정보들은 모두 mpf 파일 내부에 등록이 되게 되고, 나중에 프로젝트를 열면 mpf 파일 내부의 정보를 읽어 위와 같이 가상의 Code 폴더 내부에 test.vhd를 위치시키게 된다.


지금쯤이면 느끼겠지만, 프로젝트 내부의 파일들 하나하나 세세하게 알 필요는 없고, 탐색기로 관리하기 보다는 ModelSim을 통해 관리하는 것이 훨씬 효율적인 방법이다. 


이것저것 설명했는데 전부 알 필요는 없고 3번 project 생성부터 시뮬레이션 방법까지만 알면 거의 모든 실습을 해 볼 수 있다.