모바일 개발하는 자바리안의 메모장

베릴로그(Verilog) - 게이트 설계 본문

Verilog/Verilog.study

베릴로그(Verilog) - 게이트 설계

자바리안 2016. 9. 10. 08:20
반응형

난생 처음들어본 언어 베릴로그,,,

이 언어는 HDL(hardware description language) 중 하나로, 하드웨어 디자인을 할 때 쓰인다.

처음 사용해보는 터미널에서 코딩을 하는 게 너무 낯설고, 불편하게 다가와 스트레스도 많이 받았음.


혹시 해당 언어를 처음 접하고, 막막함을 느끼고 있을 사람들을 위해 베릴로그 기초 강좌 게시물을 작성해본다.


우선 기본적인 3개 게이트, OR, AND, NOT를 이용해 베릴로그 코드를 작성해보자.





자, 이제 circuit이란 이름의 verilog 파일을 생성해보자! 터미널 명령어는 다음과 같다.

vim circuit.v



[circuit.v]


module circuit_tb; // 테스트벤치에는 보통 작성한 베릴로그명 뒤에 _tb를 붙여준다.

	// 테스트벤치에서는 reg가 input, wire가 output 역할을 한다.
	reg[1:0] in; // []는 어레이 선언을 의미한다, [1:0]일 경우 0번 칸에서 1번칸까지 있는 어레이(총 2칸)를 뜻한다. 
	wire[2:0] out; // 출력의 경우 f1,f2,f3 총 3개이기 때문에 [2:0]어레이가 필요하다.

	circuit mycircuit(out[2],out[1],out[0],in[1],in[0]); // 위 circuit의 인스턴스를 생성해서 out, 
	module circuit_tb; // 테스트벤치에는 보통 작성한 베릴로그명 뒤에 _tb를 붙여준다.

	// 테스트벤치에서는 reg가 input, wire가 output 역할을 한다.
	reg[1:0] in; // []는 어레이 선언을 의미한다, [1:0]일 경우 0번 칸에서 1번칸까지 있는 어레이(총 2칸)를 뜻한다. 
	wire[2:0] out; // 출력의 경우 f1,f2,f3 총 3개이기 때문에 [2:0]어레이가 필요하다.

	circuit mycircuit(out[2],out[1],out[0],in[1],in[0]); // 위 circuit의 인스턴스를 생성해서 out/in어레이에 넣음

	// 현재까지 작성한 걸 보면 우선
	// 1. in 이란 이름으로 입력값을 받을 2칸 어레이 리스트 생성 
	// 2. out 이란 이름으로 출력값을 받을 3칸 어레이 리스트 생성
	// 3. circuit 인스턴스를 가져와 in, out 어레이를 모두 채움
	// 모든 설정 완료! 이제 입력값에 신호를 넣고, 어떤 결과가 출력되는지 시각화해주는 기능을 구현해보자 

	
	initial // initial 블록은 프로그램 실행 시, 해당 구간이 바로 실행되게 함
		begin // begin ~ end 까지가 위 initial이 적용되는 구간...(자바의 경우 {})
		in = 2'b00; // 입력값을 A: 0 / B: 0 으로 초기화해준다. 
		repeat(3) #5 in = in + 1'b1; // repeat(a) : a횟수만큼 반복을 설정한다. 초기값 00을 제외하여 3회 반복한다.
		// #5 는 딜레이를 부여하는 블록이며 밀리초(1/1000초)를 의미하므로,
		// "5밀리초 단위로 i값 1증가를 3번 한다."라는 명령 구간이다.
		// 입력이 2개이므로 총 4개의 상태에 대한 출력값을 확인해야 하므로,
		// 초기값 00 + 증가값 3개 , 총 4개 상태에 대해 확인할 준비 완료
	end // initial 끝~


	initial // 자 이제 텍스트로 시각화되는 부분을 구현해보자~
		begin
		$monitor("AB : %b, F1 : %b, F2 : %b, F3 : %b", in, out[2], out[1], out[0]);
		// $monitor 문법을 통해 쌍따옴표("") 내 코드들을 문자열로 우리 눈에 보이게 출력해준다.
		// [%b] 는 입력될 데이터가 들어갈 공간이며,
		// 쌍따옴표 밖에 쉼표(,)로 구분지어 들어가야 할 데이터를 순서대로 추가해준다.
		// AB, F1, F2, F3 순서로 쌍 따옴표 안에 작성하였으므로,
		// in, out[2], out[1], out[0] 와 같이, 순서 그대로 쌍따옴표 밖에 입력해준다.
		// in의 경우 AB : 00 / AB : 01 과 같은 식으로 출력시켜주기 위해, in을 통째로 입력

	end // 이제 끝~

endmodule



자 이제 상기 2개 verilog 파일을 컴파일하고, 실행해보겠다.

우선, 컴파일 코멘드는 다음과 같다.

iverilog -o circuit.vvp circuit.v circuit_tb.v


컴파일 이후 circuit.vvp 가 생긴 걸 확인할 수 있을것이다,

해당 파일을 실행해보자!

vvp circuit.vvp



 

각 입력 상태에 대한 출력값을 확인할 수 있다.

F1이 OR게이트였으니,, 맞고, F2가 AND였으니,, 맞고, F3가 A에 대한 NOT이니,, 다 맞다.(다행)

반응형
Comments