[Verilog 문법] 4.1 Generate 문

YUN·2026년 1월 23일

디지털 회로 설계

목록 보기
14/20

Generate 문

컴파일 타임에 하드웨어를 반복/조건 생성

소프트웨어의 for문과 다르게, 실제로 하드웨어가 복제된다.

(1) 반복 생성 : generate-for

genvar i;  // generate 전용 인덱스 변수

generate
    for (i = 0; i < 4; i = i + 1) begin : gen_block
        // 이 블록이 4번 복제됨
        // 각각 gen_block[0], gen_block[1], ... 로 명명
    end
endgenerate

위의 코드는 begin-end block을 gen_block 이라는 이름으로 4번 복제한다.

generate 내부의 begin-end block이 복제되어 4개 생기는 것이다.

(이름은 gen_block[0], gen_block[1], , gen_block[2], gen_block[3] 으로 생성된다)

(2) 조건부 생성 1 : generate-if

generate
    if (CONDITION) begin : true_block
        // CONDITION이 참일 때 생성
    end else begin : false_block
        // CONDITION이 거짓일 때 생성
    end
endgenerate

위와 같이 조건에따라 분기하여 코드를 생성할 수 있다.

(3) 조건부 생성 2 : generate-case

module shifter #(
    parameter MODE = 0  // 0: logical, 1: arithmetic, 2: rotate
)(
    input      [7:0] data_in,
    input      [2:0] shift_amt,
    output reg [7:0] data_out
);
    generate
        case (MODE)
            0: begin : logical_shift
                always @(*) data_out = data_in >> shift_amt;
            end
            1: begin : arith_shift
                always @(*) data_out = $signed(data_in) >>> shift_amt;
            end
            2: begin : rotate
                always @(*) data_out = (data_in >> shift_amt) | 
                                       (data_in << (8 - shift_amt));
            end
            default: begin : default_shift
                always @(*) data_out = data_in;
            end
        endcase
    endgenerate
endmodule

위와 같이 조건에따라 분기하여 코드를 생성할 수 있다.

(MODE 값 비교시 False인 부분들은 코드가 생성되지 않는다)

퀴즈

parameter N = 4;
genvar i, j;

generate
    for (i = 0; i < N; i = i + 1) begin : outer
        for (j = 0; j <= i; j = j + 1) begin : inner
            and_gate u_and (.a(a[i]), .b(b[j]), .y(y[i][j]));
        end
    end
endgenerate

위의 코드의 경우 몇 개의 AND Gate가 생성될까?

정답 : 10 개

profile
안녕하세요. 전자공학부 학부생의 공부 기록입니다.

0개의 댓글