컴파일 타임에 하드웨어를 반복/조건 생성
소프트웨어의 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] 으로 생성된다)
generate
if (CONDITION) begin : true_block
// CONDITION이 참일 때 생성
end else begin : false_block
// CONDITION이 거짓일 때 생성
end
endgenerate
위와 같이 조건에따라 분기하여 코드를 생성할 수 있다.
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 개