728x90
반응형
[SystemVerilog] generate-for loop와 for loop의 차이
1. generate-for loop
설명
- 컴파일 타임에 실행: generate 블록 안의 for문은 컴파일 시간에 반복적으로 실행되며, 그 결과로 고정된 하드웨어 구조를 생성한다.
- 하드웨어 인스턴스 생성: generate 블록 내에서 반복된 코드는 물리적 하드웨어 리소스로 변환됩니다. 즉, 각 반복마다 새로운 하드웨어가 생긴다. 이 반복은 정적이기 때문에, 반복 횟수가 미리 정해져 있어야 한다.
- genvar 사용: generate 블록에서는 genvar를 사용하여 반복 변수를 정의하는데, 이 변수는 컴파일 타임 변수로, 하드웨어 구조를 생성할 때만 사용된다. 이 변수는 시뮬레이션 중에는 값을 가지고 있지 않고 사라진다.
Example
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
generate
for (genvar i = 0; i < 4; i++) begin
logic [7:0] reg_array[i];
end
endgenerate
//////////////////////////////////////////
logic [7:0] reg_array[0];
logic [7:0] reg_array[1];
logic [7:0] reg_array[2];
logic [7:0] reg_array[3];
// 위 아래 코드는 일치한다.
|
cs |
2. for loop
설명
- 런타임에 실행: 일반 for문은 런타임에 반복된다. 이때 반복문은 하드웨어를 생성하지 않고, 이미 존재하는 하드웨어 내에서 특정 로직을 실행할 때 사용된다.
- 동작 제어: 일반 for문은 기존에 정의된 하드웨어 자원 위에서 동작을 반복적으로 수행하는 데 주로 사용된다. 하드웨어 자체는 이 반복문으로 인해 생성되지 않으며, 동작의 흐름만 제어된다.
- 합성 여부: 반복 횟수가 고정된 경우에 한해서, 일반 for문도 합성될 수 있다. 이 경우 컴파일러가 반복문을 풀어서 고정된 논리로 변환한다.
1
2
3
4
5
6
7
8
|
logic [7:0] reg_array[dynamic_size]; // 동적 배열 크기
always_ff @(posedge clk) begin
for (int i = 0; i < dynamic_size; i++) begin // dynamic_size가 동적으로 변함
reg_array[i] <= reg_array[i] + 1;
end
end
|
cs |
위 코드는 dynamic_size가 런타임에 결정되기 때문에, 하드웨어로 합성될 수 없다.
Example
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
always_ff @(posedge clk) begin
for (int i = 0; i < 4; i++) begin
reg_array[i] <= i;
end
end
//////////////////////////////////////////
always_ff @(posedge clk) begin
reg_array[0] <= 0;
reg_array[1] <= 1;
reg_array[2] <= 2;
reg_array[3] <= 3;
end
// 위 아래 코드는 일치한다.
|
cs |
3. generate-for loop vs for loop example
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
generate
for (genvar i = 0; i < 2; i++) begin
always_ff @(posedge clk) begin
reg_array[i] <= i;
end
end
endgenerate
//////////////////////////////////////////
always_ff @(posedge clk) begin
reg_array[0] <= 0;
end
always_ff @(posedge clk) begin
reg_array[1] <= 1;
end
// 위 아래 코드는 일치한다.
|
cs |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
always_ff @(posedge clk) begin
for (int i = 0; i < 2; i++) begin
reg_array[i] <= i;
end
end
//////////////////////////////////////////
always_ff @(posedge clk) begin
reg_array[0] <= 0;
reg_array[1] <= 1;
end
// 위 아래 코드는 일치한다.
|
cs |
4. Summary
- generate-for loop: 하드웨어 자원(예: 레지스터, 모듈)을 컴파일 타임에 생성하는 데 사용된다. 반복 횟수가 고정된 경우에만 사용할 수 있으며, 반복마다 새로운 하드웨어 자원이 생성된다.
- for loop: 런타임에 실행되는 로직으로, 이미 존재하는 하드웨어 자원 위에서 동작을 수행한다. 고정된 반복 횟수일 경우 합성이 가능하지만, 새로운 하드웨어 자원을 생성하지는 않는다.
- 결론적으로, compile time에 실행되는지 run time에 실행되는지, 이것만 기억하면 모든 것이 이해된다.
항목 | generate-for loop | for loop |
실행 시점 | Compile Time | Run Time |
목적 | 하드웨어 자원(인스턴스) 생성 | 동작 제어 (하드웨어 자원을 생성하지 않음) |
반복문 변수 | genvar (Compile Time 변수) | int, logic 등 (Run Time 변수) |
합성 가능성 | 반복 횟수가 고정되어야 하며, 하드웨어 자원으로 변환됨 | 고정된 반복 횟수일 경우 합성 가능 |
하드웨어 자원 생성 여부 | 새로운 하드웨어 자원을 컴파일 타임에 생성 | 하드웨어 자원 생성 X |
주요 사용 사례 | 반복적인 하드웨어 자원 생성 | 동작 흐름 제어, 데이터 처리 |
728x90
반응형
'VLSI > Design' 카테고리의 다른 글
인코더와 디코더(Encoder and Decoder) (1) | 2022.07.26 |
---|
댓글