이번 Verilog 세번째 포스트에서는 Module과 Port에 대해서 정리해보도록 하겠습니다.


- Module

Verilog를 이용해 설계를 진행할 때는 Module 단위로 설계를 진행하게 됩니다.

즉, Module이라는 것은 Verilog 설계 시의 기본단위라고 볼 수가 있는데요.

따라서 어떤 Verilog 코드를 보더라도 module로 시작해서 endmoudle로 끝나는 것을 보실 수가 있습니다.

module d_flipflop(		//module 선언
  input  wire i_clk,		//input 선언
  input  wire i_rst_n,
  input  wire d,
  output reg  q			//output 선언
);

always @(posedge i_clk or negedge i_rst_n) begin	//회로 동작부
...
...

endmodule

위는 베릴로그 코드의 전반적인 구조를 확인하고자 작성해봤습니다.

module (module_name)으로 Verilog 설계 기본 단위인 module을 선언하고
input 선언, output 선언 그리고 회로동작부를 기술한 후에 endmodule로 module 설계를 마치게 됩니다.

 

한가지 중요한 것은 .v 파일에 베릴로그 코드를 작성하게 될텐데 하나의 .v 파일에는 하나의 module만이 선언될 수 있다는 것입니다. 

예를 들어 아래와 같이 한 .v파일안에 여러개의 module을 설계할 수 없다는 의미죠.

module m_a(		//module a 선언
  input i_a,
  output o_a
);

....

endmodule		//module a 종료

module m_b(		//module b 선언
  input i_b,
  output o_b
);

....

endmoudle		//module b 종료

그러면 여러개의 module을 어떻게 사용할 수 있을까요?

아니면 하나의 .v파일에 모든 회로 Block들을 모두 설계할까요?

복잡한 회로를 하나의 파일에서 설계한다면 코드가 매우 복잡해지고 오류수정도 쉽지가 않을겁니다.

 

따라서 보통 회로의 Block별로 개별의 .v 파일에서 module을 선언합니다. 

clock_gen.v, counter.v 등등과 같이 여러개의 .v파일이 생겼겠네요.

각 .v파일에는 module이 하나씩만 선언되어 있을테고요.

그러면 이를 하나로 합쳐야 할텐데 이는 나중에 top.v라는 .v파일을 하나 만들어서 Top Module을 선언하고
아래 그림처럼 Top Module에 이 여러가지 module들을 한데로 묶습니다.

Instantiation

이를 Instantiation이라고 하는데 이 부분에 대해서는 나중에 설명해보도록 하고
여기서는 한 .v파일에서는 하나의 module만 선언된다와 베릴로그 코드의 큰 구성이 어떻게 되는지 정도 파악하고 넘어갑시다.


- Port

다음으로는 Port에 대해서 살펴봅시다.

.v파일에서 Module을 선언을 했으면 이제 Module의 입출력 단자, Input Port/Output Port를 선언해주어야 합니다.

input wire i_clk,
output reg i_q

앞서 짧게 적었던 코드에서 위의 내용이 Input Port/Output Port 관련해 선언해준 부분이죠.

Port에는 입력 포트인 Input Port와 출력 포트인 Output Port가 있고
추가적으로 Inout Port라고 해서 양방향성을 가지는 Port도 존재합니다.

 

또 선언할 때 보게되면 wire, reg라는게 있는데 이게 무엇인지 정리해보고 넘어갑시다.

wire와 reg의 차이는 단순합니다.

wire는 값을 저장할 수 없는 단순한 물리적인 선 reg는 값을 저장할 수 있는 물리적인 선입니다.

 

예를 들어 clock에 동기화를 시킨 시스템에서
reg로 선언한 port라면 이전 clock의 상승 엣지에서 Capture했던 값을 hold하고 있다가
다음 clock의 상승 엣지에서는 또 그때의 값을 Capture해서 hold하는 방식인 반면
wire는 단순한 선으로 값을 저장할 수 없기 때문에 들어오는 값이 바뀌는 대로 휙휙 바뀌게 됩니다. 

 

Port 연결 규칙

이렇게 wire와 reg를 사용해서 port를 선언하는데 있어 나름대로의 규칙이 존재하는데

module 내에서 input port를 선언할 때는 wire로 선언을 해야하고
output port를 선언할 때에는 reg혹은 wire로 선언을 할 수가 있으니 해당 규칙을 참고하시면 좋을 것 같습니다.

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기