Способы сокращения потребления | Определение |
---|---|
Оптимизация дерева синхронизации Clock tree optimization and clock gating |
Отключаются ветви дерева синхронизации, которые не используются в данный момент времени.
|
Операция изоляции Operand isolation
|
Уменьшается рассеиваемая мощность, путем использования разрешающего сигнала, если разрешающий сигнал не активен, то переключение блока не произойдет.
|
Логическое деление блоков Logic restructuring
|
Разделение логики на блоки, работающие на высокой частоте и на низкой, на сколько это возможно.
|
Изменение размеров транзисторов Logic resizing (transistor resizing)
|
Уменьшается динамический ток потребления (входные и выходные паразитные емкости), а так же токи утечки при переключении (сквозные токи).
|
Использование буферов Transition rate buffering
|
Снижает мощность переключения путем уменьшения времени переключения.
|
Замена точек подключения Pin swapping
|
Выбираются точки подключения с минимальной емкостной нагрузкой.
|
Использование разных порогов Multi-Vth
|
Использование нескольких библиотек с разными характеристиками транзисторов (с низким порогом переключения – быстрее и выше утечки) или с более высокими – медленнее с более низкими утечками.
|
Несколько напряжений питания в схеме Multi-supply voltage (MSV or voltage islands)
|
Функциональные блоки работают при различных напряжения питания.
|
Динамическое изменение напряжения питания (DVS) Dynamic voltage scaling (DVS)
|
Позволяет менять напряжение питания блока во время работы схемы на лету.
|
Динамическое изменение напряжения и частоты (DVFS) Dynamic voltage and frequency scaling (DVFS)
|
Позволяет менять напряжение питания и частоту блока во время работы схемы на лету.
|
Адаптивное изменение напряжения и частоты Adaptive voltage and frequency scaling (AVFS)
|
In this variation of DVFS, a wider variety of voltages are set dynamically, based on adaptive feedback from a control loop; involves analog circuitry. |
Отключение питания (PSO) Power shut-off (PSO) [or power gating]
|
Отключение питания блоков, если он не используется.
|
Разделение памяти Memory splitting
|
Если данные постоянные в одной области памяти и перезаписываются в другой, то целесообразно разделить области и отключать питание той области, где данные не изменяются.
|
Смещение питания Substrate biasing (bodybiasing or back-biasing)
|
Смещение напряжения на кармане p-транзисторов выше VDD и подложки n-транзисторов ниже VSS.
|
Dynamic Power Savings | Leakage Power Savings | Timing Penalty | Area Penalty | Complexity and Time-to-Market (TTM) Penalties | Implementation Impact | Design Impact | Verification Impact | |
---|---|---|---|---|---|---|---|---|
Dynamic power reduction techniques | ||||||||
Clock gating | 20% | ~0X | ~0% Clock tree insertion delay |
<2% | None | Low | Low | None |
Operand isolation | <5% | ~0X | ~0% May add a few gates to pipeline | None | None | None | None | |
Logic restructuring | <5% | ~0X | ~0% | Little | None | None | None | None |
Logic resizing | <5% | ~0X | ~0% | ~0% to –10% | None | None | None | None |
Transition rate buffering | <5% | ~0X | ~0% | Little | None | None | None | None |
Pin swapping | <5% | ~0X | ~0% | Little | None | None | None | None |
Leakage power reduction techniques | ||||||||
Multi-Vth | 0% | 2–3X | ~0% Automated | 2 to –2% | Low | Low | None | None |
Multisupply voltage (MSV) | 40–50% | 2X | ~0% Adds level shifters; clock scheduling issues due to latency changes | <10% Power routing and power interconnect; level shifters | High Design time, turnaround time, TTM | Medium | Medium | Low |
DVFS | 40–70% | 2–3X | ~0% Adds level shifters, power-up sequence; clock scheduling issues due to dynamic latency changes | <10% Adds level shifters and a power management unit | High Design time, turnaround time, TTM | High | High | High |
Power shut-off (PSO) | ~0% | 10–50X | 4–8% Adds isolation cells, complex timing, wakeup time, rush currents | 5–15% Adds isolation cells, state retention cells, alwayson cells; may have wider power grid due to rush currents; power management unit | High System architecture, support for power control, verification, synthesis, implementation, DFT | Mediumhigh | High | High |
Memory splitting | ~0% | Varies | Varies Adds isolation cells for power shut-off | Varies | Varies | Mediumhigh | High | High |
Substrate biasing | ~0% | 10X | 10% | <10% | High | High | Mediumhigh | Medium |
library ieee, std, djin18; use ieee.std_logic_1164.all; use ieee.numeric_std.all; architecture beh of xcontroller is signal count : unsigned (7 downto 0); signal do_i : std_logic; begin -- beh process (clk, rst) begin if rst = '1' then count <= x"00"; elsif clk'event and clk = '1' then count <= count + 1; end if; end process; DO_i <= '1' when count > x"0F" else '0'; do <= do_i when en = '1' else '0'; end beh;
architecture beh2 of xcontroller is signal count : unsigned (7 downto 0); signal count_i : unsigned (7 downto 0); signal do_i : std_logic; begin -- beh process (clk, rst) begin if rst = '1' then count <= x"00"; elsif clk'event and clk = '1' then count <= count + 1; end if; end process; count_i <= count when en = '1' else x"00"; DO_i <= '1' when count_i > x"0F" else '0'; do <= do_i when en = '1' else '0'; end beh2;
library ieee, std, djin18; architecture beh4 of xcontroller is signal count : unsigned (7 downto 0); signal count2 : unsigned (7 downto 0); begin process (clk, rst) begin if rst = '0' then count <= x"00"; count2 <= x"00"; elsif clk'event and clk = '1' then count <= count + 1; if count = 10 then count2 <= count2 + 1; end if; end if; end process; dbuso <= std_logic_vector(count2); end beh4;
architecture beh of xcontroller is signal count : unsigned (7 downto 0); signal count2 : unsigned (7 downto 0); signal strob : std_logic; begin process (clk, rst) begin if rst = '0' then count <= x"00"; strob <= '0'; elsif clk'event and clk = '1' then count <= count + 1; if count = 10 then strob <= '1'; else strob <= '0'; end if; end if; end process; process (strob, rst) begin if rst = '0' then count2 <= x"00"; elsif strob'event and strob = '1' then count2 <= count2 + 1; end if; end process; dbuso <= std_logic_vector(count2); end beh;
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.NUMERIC_STD.ALL; ARCHITECTURE BEH1 OF MILLER IS SIGNAL OUTPUT_DATAI : STD_LOGIC; SIGNAL OUTPUT_DATAII : STD_LOGIC; TYPE ST IS (a1,a2,a3,a4); SIGNAL STATE , STATEI : ST; signal input_data_i : std_logic; begin input_data_i <= input_data; coder_proc: process (clk_i_d, rst) begin -- process coder_proc if rst = '1' then state <= a1; elsif clk_i_d'event and clk_i_d = '0' then state <= statei; end if; end process coder_proc; acincro: process (state,statei,input_data_i) begin -- process acincro case state is when a1 => if input_data_i = '0' then statei <= a2; else statei <= a4; end if; when a2 => if input_data_i = '0' then statei <= a3; else statei <= a4; end if; when a3 => if input_data_i = '0' then statei <= a2; else statei <= a1; end if; when others => if input_data_i = '0' then statei <= a3; else statei <= a1; end if; end case; end process acincro; |
suncrodata: process (state,input_data_i,clk_i_d) begin -- process suncrodata case STATE is when a1 => if input_data_i = '0' then output_datai <= not clk_i_d; else output_datai <= '0'; end if; when a2 => if input_data_i = '0' then output_datai <= clk_i_d; else output_datai <= '0'; end if; when a3 => if input_data_i = '0' then output_datai <= not clk_i_d; else output_datai <= '1'; end if; when others => if input_data_i = '0' then output_datai <= clk_i_d; else output_datai <= '1'; end if; end case; end process suncrodata; syn_out: process (clk, rst) begin -- process syn_out if rst = '1' then output_data <= '1'; elsif clk'event and clk = '1' then output_data <= output_datai; end if; end process syn_out; end beh1; |
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.NUMERIC_STD.ALL; ARCHITECTURE BEH3 OF MILLER IS TYPE ST IS (a1,a2,a3,a4); SIGNAL STATE , STATEI : ST; SIGNAL OUTPUT_DATAI : STD_LOGIC; SIGNAL OUTPUT_DATAIi : STD_LOGIC; signal input_data_i : std_logic; begin input_data_i <= input_data; coder_proc: process (clk_i_d, rst) begin -- process coder_proc if rst = '1' then state <= a1; elsif clk_i_d'event and clk_i_d = '0' then state <= statei; end if; end process coder_proc; statei <= a1 when input_data = '1' and (state = a4 or state = a3) else a2 when input_data = '0' and (state = a1 or state = a3) else a3 when input_data = '0' and (state = a2 or state = a4) else a4; output_datai <= '1' when statei = a1 else not clk_i_d when statei = a2 else clk_i_d when statei = a3 else '0'; suncrodata: process (clk, rst) begin -- process suncrodata if rst = '1' then output_data <= '1'; elsif clk'event and clk = '1' then output_data <= output_datai; end if; end process suncrodata; end beh3; |
architecture beh4 of miller is signal input_data_i : std_logic; signal syn_input_data_i : std_logic; signal output_data_i : std_logic; signal output_data_ii : std_logic; --signal output_data_iii : std_logic; signal syn_output_data_i : std_logic; begin -- beh4 input_data_i <= input_data; coder_proc: process (clk_i_d, rst) begin -- process coder_proc if rst = '1' then syn_input_data_i <= '0'; elsif clk_i_d'event and clk_i_d = '1' then syn_input_data_i <= input_data_i; end if; end process coder_proc; pre_code_data: process (clk_i_d, rst) begin -- process pre_code_data if rst = '1' then syn_output_data_i <= '1'; elsif clk_i_d'event and clk_i_d = '1' then syn_output_data_i <= output_data_i; end if; end process pre_code_data; |
output_data_ii <= (not clk_i_d) xor syn_output_data_i when input_data_i = '1' else (not syn_output_data_i) xor syn_input_data_i; output_signal_code_proc: process (clk, rst) begin -- process output_signal_code_proc if rst = '1' then output_data_i <= '1'; elsif clk'event and clk = '1' then output_data_i <= output_data_ii; end if; end process output_signal_code_proc; output_data <= output_data_i; end beh4; |
architecture beh5 of miller is signal input_data_i : std_logic; signal syn_input_data_i : std_logic; signal output_data_i : std_logic; signal output_data_ii : std_logic; signal output_data_iii : std_logic; signal syn_output_data_i : std_logic; begin -- beh4 input_data_i <= input_data; coder_proc: process (clk_i_d, rst) begin -- process coder_proc if rst = '1' then syn_input_data_i <= '0'; elsif clk_i_d'event and clk_i_d = '1' then syn_input_data_i <= input_data_i; end if; end process coder_proc; pre_code_data: process (clk_i_d, rst) begin -- process pre_code_data if rst = '1' then syn_output_data_i <= '1'; elsif clk_i_d'event and clk_i_d = '1' then syn_output_data_i <= output_data_i; end if; end process pre_code_data; |
output_signal_code_proc: process (clk, rst) begin -- process output_signal_code_proc if rst = '1' then output_data_i <= '1'; elsif clk'event and clk = '1' then if input_data_i = '1' then if syn_input_data_i = '1' then if syn_output_data_i = '1' then output_data_i <= clk_i_d; else output_data_i <= not clk_i_d; end if; else if syn_output_data_i = '1' then output_data_i <= clk_i_d; else output_data_i <= not clk_i_d; end if; end if; else if syn_input_data_i = '1' then if syn_output_data_i = '1' then output_data_i <= '1'; else output_data_i <= '0'; end if; else if syn_output_data_i = '1' then output_data_i <= '0'; else output_data_i <= '1'; end if; end if; end if; end if; end process output_signal_code_proc; output_data <= output_data_i; end beh5; |
set encoding binary;
Encodings for ST values value ST[1-0] ======================== a1 00 a2 01 a3 10 a4 11 ................... ******************************************************* Cell: fm0_miller View: beh2 Library: digital ******************************************************* Cell Library References Total Area fdr alib5 2 x 322 645 um_2 fds alib5 1 x 342 342 um_2 n alib5 3 x 31 94 um_2 na alib5 2 x 51 101 um_2 nao alib5 5 x 73 364 um_2 xnor2 alib5 1 x 100 100 um_2 Number of ports : 6 Number of nets : 19 Number of instances : 14 Number of references to this view : 0 Total accumulated area : Number of um_2 : 1647 Number of accumulated instances : 14
set encoding auto;
Encodings for ST values value ST[1-0] ======================== a1 00 a2 01 a3 10 a4 11 ******************************************************* Cell: fm0_miller View: beh2 Library: digital ******************************************************* Cell Library References Total Area fdr alib5 2 x 322 645 um_2 fds alib5 1 x 342 342 um_2 n alib5 3 x 31 94 um_2 na alib5 2 x 51 101 um_2 nao alib5 5 x 73 364 um_2 xnor2 alib5 1 x 100 100 um_2 Number of ports : 6 Number of nets : 19 Number of instances : 14 Number of references to this view : 0 Total accumulated area : Number of um_2 : 1647 Number of accumulated instances : 14
set encoding grey;
Encodings for ST values value ST[1-0] ======================== a1 00 a2 01 a3 11 a4 10 ******************************************************* Cell: fm0_miller View: beh2 Library: digital ******************************************************* Cell Library References Total Area fdr alib5 2 x 322 645 um_2 fds alib5 1 x 342 342 um_2 n alib5 2 x 31 63 um_2 na alib5 3 x 51 152 um_2 nao alib5 2 x 73 146 um_2 no alib5 1 x 52 52 um_2 no3a alib5 1 x 93 93 um_2 xnor2 alib5 1 x 100 100 um_2 xor2 alib5 1 x 108 108 um_2 Number of ports : 6 Number of nets : 19 Number of instances : 14 Number of references to this view : 0 Total accumulated area : Number of um_2 : 1702 Number of accumulated instances : 14
set encoding binary;
Clock Frequency Report Clock : Frequency =============================================================================== clk_i_d : 287.4 MHz clk : 310.3 MHz Critical Path Report Critical path #1, (path slack = 66.7): NAME GATE ARRIVAL LOAD ================================================================================ rst/ 0.00 0.00 up 0.11 reg_STATE(0)_ix1_ix1_ix1/q fdr 1.28 1.28 up 0.07 ix442/y n 0.22 1.50 dn 0.04 ix444/y na 0.25 1.76 up 0.02 ix23/y na3o 0.59 2.35 dn 0.04 ix11/y nao 0.26 2.61 up 0.02 reg_STATE(0)_ix1_ix1_ix1/d fdr 0.00 2.61 up 0.00 data arrival time 2.61 data required time 69.30 ================================================================================ data required time 69.30 data arrival time 2.61 ========== slack 66.69 ================================================================================
Clock Frequency Report Clock : Frequency ===================================== clk_i_d : 287.4 MHz clk : 310.3 MHz Critical Path Report Critical path #1, (path slack = 66.7): NAME GATE ARRIVAL LOAD ================================================================================ rst/ 0.00 0.00 up 0.11 reg_STATE(0)_ix1_ix1_ix1/q fdr 1.28 1.28 up 0.07 ix442/y n 0.22 1.50 dn 0.04 ix444/y na 0.25 1.76 up 0.02 ix23/y na3o 0.59 2.35 dn 0.04 ix11/y nao 0.26 2.61 up 0.02 reg_STATE(0)_ix1_ix1_ix1/d fdr 0.00 2.61 up 0.00 data arrival time 2.61 data required time 69.30 ================================================================================ data required time 69.30 data arrival time 2.61 ========== slack 66.69 ================================================================================
Clock Frequency Report Clock : Frequency ==================================== clk_i_d : 238.9 MHz clk : 277.7 MHz Critical Path Report Critical path #1, (path slack = 66.0): NAME GATE ARRIVAL LOAD ================================================================================= rst/ 0.00 0.00 up 0.11 ix455/q fdr 1.33 1.33 up 0.09 ix23/y xnor2 0.77 2.10 up 0.07 ix477/y na 0.34 2.44 dn 0.02 ix17/y nao 0.26 2.70 up 0.02 ix474/y na 0.35 3.05 dn 0.02 ix453/y nao 0.26 3.31 up 0.02 ix455/d fdr 0.00 3.31 up 0.00 data arrival time 3.31 data required time 69.30 ================================================================================ data required time 69.30 data arrival time 3.31 =========== slack 65.99 =================================================================================