개발/Verilog

[Verilog][기초문법] generation 구문 사용법

개발과 공부 사이 2022. 1. 8. 23:21

 

반복적 블록 생성을 위한 generation 사용법

 

generate - endgenerate 블록 안에 있는 모듈을 반복적으로 생성하게 만들어준다.

똑같은 설계요소를 반복적으로 생성해야 할 때 유용하다.

 

 

블록 안에 들어올 수 있는것은 다음과 같다.

 

1. 모듈

2. 프리머티브

3. UDP

4. continuous assign

5. initial , always 블록

 

또한 generate 블록 안에서 wire, reg, integer, time, event 등의 변수 선언도 가능하다.

 

 

다음 예제를 통해 generate 구문 사용법을 알아본다.

4bit ripple carry adder 설계 예제이다.

module adder #(parameter N = 4) (
  output [N-1:0] sum,
  output cout,
  input [N-1:0] A,
  input [N-1:0] B,
  input cin
);
  
  wire [N:0] carry;
  
  assign carry[0] = cin;
  assign cout = carry[N];
  
  // generate 구문을 위한 루프변수 생성
  genvar i;
  
  generate for (i = 0; i < N; i = i+1) begin : gen_loop
  	wire w1, w2, w3;
    xor g1(w1, A[i], B[i]);
    xor g2(sum[i], w1, carry[i]);
    and g3(w2, A[i], B[i]);
    and g4(w3, w1, carry[i]);
    or g5(carry[i+1], w2, w3);
  end
  endgenerate
  
  function reg fnc();
    
  endfunction  
endmodule

루프문 안에서 1bit fulladder를 게이트 레벨로 설계하고 이를 반복적으로 생성 및 연결한다.

 

genvar i 는 루프 변수인데 설계에만 사용되고 시뮬레이션에선 사용되지 않는다.

또한 루프문의 블록에 이름을 설정하여 (gen_loop) 계층적인 참조가 가능하다.

 

파라미터 N 값이 4로 설정돼있지만, adder 모듈을 인스턴스 할 때, 파라미터 값을 바꿔주면 32bit, 64bit 등으로 길이를 조절할 수 있다.

 

 

또한 generate 블록 안에서 if-else / case 등의 분기문을 사용할 수 있어서 조건에 따라 모듈을 다르게 생성할 수도 있다.