ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Verilog][기초문법] generation 구문 사용법
    개발/Verilog 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 등의 분기문을 사용할 수 있어서 조건에 따라 모듈을 다르게 생성할 수도 있다.

     

Designed by Tistory.