-
[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 등의 분기문을 사용할 수 있어서 조건에 따라 모듈을 다르게 생성할 수도 있다.
'개발 > Verilog' 카테고리의 다른 글
[Verilog][기초문법] task, function (0) 2022.01.09 [Verilog][기초문법] 조건문, 분기문 (0) 2022.01.08 [Verilog][기초문법] 모듈, 포트 (0) 2022.01.05 [Verilog][기초문법] 데이터 형 (0) 2022.01.03