개발/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 등의 분기문을 사용할 수 있어서 조건에 따라 모듈을 다르게 생성할 수도 있다.