RTL Design에서 저전력 설계 기법의 대표적인 예시로는 Clock Gating, Power Gating, Multi-Voltage Domain이 있다. 특히 현대의 SoC 설계에서는 열 방출을 관리하고 전체 시스템 안정성을 향상시키는 데도 도움을 주기 때문에 이 기술들에 대해 정리해보고자 한다.
0. Low Power Design 정의
저전력 설계의 목표는 전체 전력 소비를 줄이기 위해 전력 방정식의 개별 구성 요소를 최대한 줄이는 것이다. 전력 방정식은 동적 전력과 정적 전력으로 구성되는데,
1) Dynamic Power
CMOS에서 On/Off가 되는 순간(Transition이 일어나는 순간)에 소비되는 전력을 뜻한다. 동적 전력은 용량성 부하(C)가 충/방전하면서 소모되는 전력으로, 트랜지스터의 Short Citcuit 전류(Isc)와 스위칭 전류(Iswitch)에 의해 발생한다.
- Switching power
신호가 0에서 1로 혹은 1에서 0으로 변경될 때 발생하는 power.
0에서 1로 변경되려면 캐패시터를 충전해야 하기 때문에 switching power가 소모되며, 1에서 0으로 변경될 때에는 캐패시터를 방전할 때 switching power가 소모됨.
- Short-circuit current
Shrort-circuit current는 nMOS와 pMOS가 서로 toggle될 때 발생한다.
nMOS와 pMOS는 항상 반대되는 상태를 유지하다가 서로 상태를 스위칭 할 때 일시적으로 short가 발생하게 되는데 이 때 소모되는 power를 의미한다.
2) Static Power
CMOS가 동작하지 않을 때 발생하는 누설 전력을 뜻한다.
Dynamic, Static Power는 다음 요인들과 관련이 있으며, 이들은 서로 Trade-Off 관계를 갖고 있다.
- 활동성
- 주파수
- 전이 시간
- 용량성 부하
- 전압
- 누설 전류
- 최대 전류
이제부터 설명할 기법들은 위 전력 방정식에서 다음과 같은 구성요소를 줄이기 위한 설계 기법들이다.
- Clock Gating: Dynamic Power 감소
- Power Gating: Dynamic & Static Power 감소
- Multi - Voltage Domain: Dynamic & Static Power 감소
1. Clcok Gating
Clock gating은 Clock이 필요한 특정 로직이나 레지스터 등이 활성 상태일 때에만 클럭을 공급하는 방식이다.
일반적으로 PLL(Phase-Locked Loop)에서 클럭이 생성되어 로직들로 분배하게 되는데, 모든 로직에 대해 Clock을 공급하게 된다면, 사용하지 않는 모듈에서 불필요한 Dynamic power가 발생하게 된다. Clock Gating 방식을 이용하면 중간 중간에 있는 불필요한 Cell들의 전력 소모를 줄일 수 있게 된다.
module clock_gating (
input clk,
input enable,
input [7:0] data_in,
output reg [7:0] data_out
);
wire gated_clk;
// Clock gating cell
CLKGATE clk_gate_inst (
.CLK(clk),
.EN(enable),
.GCLK(gated_clk)
);
always @(posedge gated_clk) begin
data_out <= data_in;
end
endmodule
2. Power Gating
Power Gating은 전력 관리 장치(PMU)를 이용하여 전원을 관리하는 설계 기법이다. 여러 로직들이 모여 하나의 블록을 이루고 있는 구조에서 Power Gating은 블록의 전원을 완전히 차단하여 전력 소비를 모두 줄이는 방식이다. 가장 전력을 크게 줄일 수 있는 방법으로, Clock Gating은 회로 내부의 더 세밀한 부분에 적용되는 반면, Power Gating은 더 큰 블록 단위로 적용되는 차이가 있다.
module power_gating (
input clk,
input reset_n,
input power_on,
input [7:0] data_in,
output reg [7:0] data_out
);
wire virtual_vdd;
wire isolation_enable;
// Power switch cell
POWER_SWITCH power_switch_inst (
.VDD(VDD),
.VVDD(virtual_vdd),
.EN(power_on)
);
// Isolation cell
ISOLATION iso_cell (
.D(data_in),
.ISO(isolation_enable),
.Q(isolated_data)
);
always @(posedge clk or negedge reset_n) begin
if (!reset_n)
data_out <= 8'b0;
else if (power_on)
data_out <= isolated_data;
end
endmodule
3. Multi - Voltage Domain
Multi-Voltage Domain은 성능에 따른 전압 할당: 고성능 블록에는 높은 전압을, 저성능 블록에는 낮은 전압을 사용하 전원을 관리하는 설계 기법이다. Multi Voltage는 모든 블록에 전원을 공급하면서 전압 레벨을 조절하는 반면, Power Gating은 사용하지 않는 블록의 전원을 완전히 차단하는 차이점이 있다.
module multi_voltage_domain (
input clk_high,
input clk_low,
input [7:0] data_in,
output [7:0] data_out
);
// High voltage domain (1.2V)
reg [7:0] high_voltage_reg;
always @(posedge clk_high) begin
high_voltage_reg <= data_in;
end
// Level shifter (1.2V to 0.9V)
LEVEL_SHIFTER ls_inst (
.A(high_voltage_reg),
.Y(level_shifted_data)
);
// Low voltage domain (0.9V)
reg [7:0] low_voltage_reg;
always @(posedge clk_low) begin
low_voltage_reg <= level_shifted_data;
end
assign data_out = low_voltage_reg;
endmodule
4. DVFS
위의 설계 기법들과 별개로 DVFS에 대해 설명하자면, Dynamic Voltage and Frequency Scaling의 약자로, 동적 전압 및 주파수 조절을 의미한다.
시스템의 현재 작업 부하나 요구 사항에 따라 전압과 주파수를 동적으로 조절하여 에너지 효율성을 최적화하는 방법으로
- 높은 성능이 필요한 경우에는 전압과 주파수를 높여 성능을 높이고
- 낮은 부하나 저전력 상태에서는 전압과 주파수를 낮추어 전력 소비를 줄인다
module DVFS (
input clk,
input [1:0] control_signal,
output new_clk
);
reg [1:0] current_frequency;
// 주파수에 따른 분주비 정의
parameter FREQ_LOW_DIVIDER = 2'b00;
parameter FREQ_MEDIUM_DIVIDER = 2'b01;
parameter FREQ_HIGH_DIVIDER = 2'b10;
reg [1:0] clk_divider; // 분주비 레지스터 추가
// 현재 주파수에 따른 분주비 선택
always @(posedge clk) begin
case (current_frequency)
FREQ_LOW: clk_divider <= FREQ_LOW_DIVIDER; // 주파수에 따른 분주비 설정
FREQ_MEDIUM: clk_divider <= FREQ_MEDIUM_DIVIDER;
FREQ_HIGH: clk_divider <= FREQ_HIGH_DIVIDER;
default: clk_divider <= 2'b00;
endcase
end
// 새로운 클럭 생성
always @(posedge clk) begin
if (clk_divider == FREQ_LOW_DIVIDER) begin
new_clk <= clk >> 1; // 2로 나눈 클럭
end else if (clk_divider == FREQ_MEDIUM_DIVIDER) begin
new_clk <= clk; // 원래 클럭
end else if (clk_divider == FREQ_HIGH_DIVIDER) begin
new_clk <= clk << 1; // 2배로 늘린 클럭
end else begin
new_clk <= clk;
end
end
// 제어 신호에 따라 주파수 변경
always @(posedge clk) begin
case (control_signal)
2'b01: current_frequency <= FREQ_LOW;
2'b10: current_frequency <= FREQ_MEDIUM;
2'b11: current_frequency <= FREQ_HIGH;
default: current_frequency <= 2'b00;
endcase
end
endmodule
References)
https://www.reddit.com/r/ECE/comments/138btu8/what_is_low_power_rtl_design/?rdt=44653
https://www.synopsys.com/glossary/what-is-low-power-design.html
'이론 공부 > 기타 학습' 카테고리의 다른 글
FPGA를 Flash Memory를 통해 프로그래밍하기 (0) | 2025.03.24 |
---|---|
자료구조 (Array, Linked-List), 추상적 자료형 (Stack, Queue) (0) | 2025.01.27 |
ADDER Algorithm : Simulation (0) | 2025.01.23 |
COMMON SOURCE AMPLIFIER (0) | 2025.01.23 |
Multiplier Algorithm : Array Multiplier, Booth Multiplier, Wallace Tree Multiplier (0) | 2025.01.23 |