[FPGA와 Verilog 초보자 가이드 3] 시뮬레이션

그러면 이제 시뮬레이션을 돌려 모듈이 예상대로 동작하는지를 살펴보겠습니다. 모듈을 시뮬레이션하기 위해서는 모듈에 어떤 입력값을 주어야 합니다. 입력값을 주기 위해서는 test bench를 먼저 생성해야하며 이 테스트 벤치가 모듈에 필요한 입력값을 생성하여 낼것입니다. 테스트 벤치는 어떤 특별한 프로그램은 아니며 신호를 생성하고 다른 모듈에 공급할 수 있는 또다른 verilog 모듈입니다. 시뮬레이션동안 테스트벤치는 I/O포트 없는 top module(top level module)이 되어야 하지만 실제 FPGA에 구현할 시에는 탑 모듈은 I/O포트를 가지게 되고 top level module이 되지는 않습니다. 아래는 테스트벤치 코드입니다.

module myModule_tb();
wire out;
reg clock;
always begin
#1 clock =!clock;
end
initial begin
//Initialize clock
clock = 0;
//End simulation
#10
$finish;
end
myModule notGate(clock, out);
endmodule

테스트 벤치 코드를 살펴보도록 하겠습니다.

테스트 벤치는 I/O포트가 없는 또다른 모듈입니다. 코드를 보면 "out"이라는 이름의 wire와 "clock"이라는 이름의 reg를 생성하였습니다. reg "clock"을 주기적으로 인버트 시켜 클럭을 생성하고 그 클럭을 myModule의 입력포트 A에 공급합니다. wire "out"은 myModule의 출력포트 B에 연결되었습니다. 시뮬레이션의 결과는 wire "out"에 나타나게 됩니다.

위의 코드에서 "always" 키워드로 시작하는 블럭은 그 이름이 암시하듯 시뮬레이션이 수행되고 있는 한 계속 실행이 되는 블럭입니다. 이 블럭안에서 reg "clock"은 매 단위 시간 딜레이 뒤에 인버트됩니다. 심볼 #은 verilog에서 딜레이를 정의하는 방법입니다. 이렇게 always블럭 안에서는 스퀘어 웨이브 형태의 웨이브폼이 생성이됩니다. 참고로 # 심볼은 synthesize 가능한 요소가 아닙니다. 코드를 synthesize할때 디자인에서 딜레이가 필요하다면 다른 방법을 찾아야 합니다. 하지만 시뮬레이션에서는 잘 동작합니다.

다음 설명할 코드부분은 initial 블럭입니다. 이름이 암시하듯 이 블럭은 오직 한번만 시간이 t = 0 일때 실행됩니다. 그렇기 때문에 초기화를 하여야 할 부분이 있다면 그것은 이 블럭 안에 넣어주어야 합니다. initial 블럭은 보통의 경우에 테스트 벤치에서만 사용이 됩니다. 합성된 코드에서는 거의 사용되지 않으며 대신에 합성된 코드에서 초기화가 필요할 경우에는 리셋로직이 대신 생성되어 사용됩니다. 다시 주제로 돌아가서 reg "clock"을 0으로 초기화합니다. 이 초기화는 매우 중요한데 만약 초기화를 해주지 않는다면 unknown 상태로 남아 있게되고 unknown상태를 수없이 인버트 시키더라도 결과값은 unknown상태이기 때문입니다. 그래서 만약 초기화 시켜주지 않는다면 클럭은 생성되지 않습니다. initial 블럭의 마지막 부분은 $finish 선언자입니다. $finish 선언자는 10번의 단위 딜레이 이후에 위치하여 있는데 이것이 의미하는 바는 10번의 단위 시간동안 디자인을 시뮬레이션한 후에 시뮬레이터가 멈추게 된다는 것을 의미합니다. $ 심볼로 시작하는 모든 함수는 task라고 불립니다. task는 시뮬레이터에게 주는 명령들이며 회로의 동작형태를 변경하지는 않습니다.

마지막 부분은 모듈이 인스턴스화 되는 것을 보여줍니다. myModule notGate(clock, out) 구문은 "myModule" 모듈을 notGate라는 이름의 인스턴스로 생성시켜 줍니다. 정의된 모듈로부터 원하는 숫자만큼의 많은 인스턴스를 생성할 수 있습니다. 여기서 중요한 하나는 wiring입니다. 코드를 보면 reg "clock"이 첫번째 파라메터로 나오고 wire "out"이 두번째 파라메터로 나오는 것을 볼 수 있습니다. 이것은 reg "clock"이 모듈 인스턴스의 포트 A에 연결되고, wire "out"은 모듈 인스턴스의 포트 B에 연결되는 것을 의미합니다.

이제, 시뮬레이션을 돌려보겠습니다. Verilog 파일 전체(Verilog file here)를 받으시고 폴더에 저장하십시오. 아래의 절차를 따라 Xilinx ISE Webpack에 있는 시뮬레이터를 실행하십시오.

1. 윈도우 프로그램 메뉴에서 ISE Project navigator를 실행합니다.


2. File 메뉴에서 "New Project"를 선택합니다.

3. 프로젝트 이름을 정하고 프로젝트파일을 저장할 디렉토리를 선택합니다.


4. 프로젝트 셋팅을 필요한대로 수정합니다. 보드에서 사용하는 FPGA를 선택합니다. Spartan 3A FPGA 개발보드 Elbert는 아래의 그림과 같이 설정합니다.


5. Xilinx ISE Webpack에 empty project를 생성하였습니다. 프로젝트를 오른쪽 마우스 클릭하여 팝업메뉴에서 "Add source"를 선택합니다. Verilog 파일을 선택합니다.


6. design view에서 "Simulation"을 선택하여 시뮬레이션을 실행시킬 준비를 합니다.


7. process view창에서 ISim 프로세스를 마우스 오른쪽 클릭하고 "Run"을 선택하여 시뮬레이션을 시작합니다.


8. ISim 시뮬레이터가 시작되면 아래와 같은 시뮬레이션 웨이브폼을 볼 수 있게 됩니다.


웨이브폼을 조사하고 Verilog모듈이 예측대로 동작했는지 확인합니다. 위에 있는 이미지에서 보듯이 출력인 입력클럭이 인버트된 형태로 표시됩니다. 이것은 NOT 게이트의 동작으로 우리가 원하는 결과 였습니다. 다음 강좌에서는 이 모듈을 실제 하드웨어로 어떻게 구현하는지 설명하겠습니다.  

Comments