본문 바로가기
VLSI/Design

[SystemVerilog] generate-for loop와 for loop의 차이

by 리미와감자 2024. 10. 18.

[SystemVerilog] generate-for loop와 for loop의 차이

 

1. generate-for loop

설명

 
  1. 컴파일 타임에 실행: generate 블록 안의 for문은 컴파일 시간에 반복적으로 실행되며, 그 결과로 고정된 하드웨어 구조를 생성한다.
  2. 하드웨어 인스턴스 생성: generate 블록 내에서 반복된 코드는 물리적 하드웨어 리소스로 변환됩니다. 즉, 각 반복마다 새로운 하드웨어가 생긴다. 이 반복은 정적이기 때문에, 반복 횟수가 미리 정해져 있어야 한다.
  3. 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

설명
 
  1. 런타임에 실행: 일반 for문은 런타임에 반복된다. 이때 반복문은 하드웨어를 생성하지 않고, 이미 존재하는 하드웨어 내에서 특정 로직을 실행할 때 사용된다.
  2. 동작 제어: 일반 for문은 기존에 정의된 하드웨어 자원 위에서 동작을 반복적으로 수행하는 데 주로 사용된다. 하드웨어 자체는 이 반복문으로 인해 생성되지 않으며, 동작의 흐름만 제어된다.
  3. 합성 여부: 반복 횟수가 고정된 경우에 한해서, 일반 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

 

  1. generate-for loop: 하드웨어 자원(예: 레지스터, 모듈)을 컴파일 타임에 생성하는 데 사용된다. 반복 횟수가 고정된 경우에만 사용할 수 있으며, 반복마다 새로운 하드웨어 자원이 생성된다.
  2. for loop: 런타임에 실행되는 로직으로, 이미 존재하는 하드웨어 자원 위에서 동작을 수행한다. 고정된 반복 횟수일 경우 합성이 가능하지만, 새로운 하드웨어 자원을 생성하지는 않는다.
  3. 결론적으로, compile time에 실행되는지 run time에 실행되는지, 이것만 기억하면 모든 것이 이해된다.
항목 generate-for loop for loop
실행 시점 Compile Time Run Time
목적 하드웨어 자원(인스턴스) 생성 동작 제어 (하드웨어 자원을 생성하지 않음)
반복문 변수 genvar (Compile Time 변수) int, logic (Run Time 변수)
합성 가능성 반복 횟수가 고정되어야 하며, 하드웨어 자원으로 변환됨 고정된 반복 횟수일 경우 합성 가능
하드웨어 자원 생성 여부 새로운 하드웨어 자원을 컴파일 타임에 생성 하드웨어 자원 생성 X
주요 사용 사례 반복적인 하드웨어 자원 생성 동작 흐름 제어, 데이터 처리

 

'VLSI > Design' 카테고리의 다른 글

인코더와 디코더(Encoder and Decoder)  (1) 2022.07.26

댓글