このコラムでは「意外と知られていないけど、知っていると差がつく FPGA の技術情報」をご紹介します。
FPGA初心者の方からベテランの方まで、幅広くご活用いただける内容ですので、ぜひ最後までお付き合いください。

【第 8 回】 動作周波数(F)とトグル率(N)を低減する方法

消費電力計算式の中からダイナミック電力に影響する “F” と “N” を低減する方法を検討します。
“F” と “N” を低減するには、とにかく動かさないことが重要です。 

クロック・ゲーティング

クロックを止めて、クロックネット、マルチプレクサ、レジスタ、レジスタ以降の組み合わせ回路の消費電力を削減する方法です。クロック・ゲーティングを使用する際の注意点は以下の 2 つです。
  -できるだけクロックの元で止める
  -ベンダーがサポートする方法でクロック・ゲーティングする

1 つのゲート回路においては、できるだけ長いクロックラインとより多くのレジスタを止めないと効果が低くなってしまうため、枝分かれする前のクロックラインの根元でクロックを止めるようにします。

また、クロックラインを AND 等で止めるとタイミングを保障ができなくなり(同期回路ではなくなるため)、さらにクロックにグリッジが乗る可能性があるため、FPGA ベンダーが推奨する方法でクロック・ゲーティングを行うようにしてください。 

インテル社はクロック・ゲーティングをサポートする PLL を提供しています。
上記の 2 点をクリアし、かつ効果も高いのでぜひご利用ください。

データ・イネーブル

クロック・ゲーティングに制約があるデバイスや、クロック遷移よりもデータ遷移が多い場合は、データ信号をイネーブルにして無駄な遷移を止めるデータ・イネーブルを使います。 

PLL の活用

動作周波数が低くてよいブロックは PLL を使って動作周波数を低くします。

リソースの共有

リソースを共有すると、共通項を使うので演算回数が減り遷移が少なくなります。
例えば、Z =AB + AC は、Z = A(B + C) にすると、遷移数が減ります。

図 1 : ツリー型 (Z=AB + AC)
図 2 : チェーン型 (Z=A(B + C))

リソースの非共有

リソース共有は、入力データが不変でも共通項を切り替える度に遷移します。
入力データの遷移が少ない場合は、リソースを共有しない方が切り替え動作が不要なので、消費電力は低くなります。

図 3 : リソースの共有
図 4 : リソースの非共有

例えば図2 は、追加したマルチプレクサ分の消費電力に加えて、(A と B が遷移しなくても)加算器の入力を切り替える度に電力を消費します。

演算回路のグリッジ削減

演算回路では出力が決定するまでに、内部で多くのグリッジが発生します。
このグリッジをより少なくすることで消費電力を低くすることができます。


(a)入力タイミングを合わせる
演算回路の入力タイミングを合わせると内部グリッジを削減することができます。
  - 演算回路の各入力ピンにレジスタを付ける。
    →入力タイミングが同じになり、演算回路内のグリッジが削減。
  - 全ブロックの演算順番を変え、ターゲットブロックの信号入力タイミングのずれを減らす。
  - チェーン型をツリー型に変更
    →段数が減るので、入力タイミングが近くなる。

例えば、4 Bitsのチェーン型 Adder は4 Bitsのツリー型 Adder より約45% もグリッチによるトグルが多くなります。

Z <= A + B + C + D
図 5 : チェーン型
Z <= (A + B) + (C + D)
図 6 : ツリー型

演算回路をパイプライン化すると、論理の深さが浅くなりグリッチが減少します。

構造化された回路を平坦化すると消費電力が下がるケースがあるので実機でお確かめください。
(パワーシミュレータでは検証できない可能性あり。) 

(b)パイプライン化する
大きな演算回路は、小さな回路に分けてパイプライン化します。
演算回路内部を通る信号の遅延差によるグリッジが大幅に削減されます。

数の表現の最適化

(a)Bus invert encoding
バスや加算器の遷移数を減らす技術です。
Bus invert encoding は、ランダムに変化するデータバスに有効な手法です。
具体的には、前クロックのデータの半数以上が変化した場合、制御信号を上げ、データを反転させます。データバスは制御信号用に 1 ビット増えます。

表1 : Bus invert encoding

 

(b)グレイコードやジョンソンカウンタ
バスやカウンタで、連続したデータの遷移数を減らす技術です。
グレイコードカウンタやジョンソンカウンタはカウントする度に 1 ビットだけ遷移するので、バイナリカウンタより遷移数が少なくなります。

以下に、3bit の場合のそれぞれの例を示します。
ジョンソンカウンタの回路は簡単ですが、表現できる数が少なくなります。
下記の例では 010 や 101 の状態値がジョンソンカウンタに存在しません。

表2 : コーディングによる遷移数の違い

グレイコードの遷移数は、バイナリコードの 1/2 ~ 1/1 で、ビット数が多くなる程効果が高くなります。

(c)2 の補数より符号-絶対値表現
2 の補数は、負の値の加減算を簡単に行えるので多く用いますが、2 の補数では、"-1" から "0" に変化すると、全てのビットが変化します。よって、2 の補数を使うより、符号-絶対値表現を用いた方が遷移数が少なくなり、消費電力が低減します。
符号-絶対値表現は、1 ビットを符号に割り当て、あとのビットはデータの絶対値の表現に用いた表現です。 

乗算器をシフト-加算器に変更

乗算器をシフト回路と加算器の組み合わせ回路に変更すると遷移数が減ります。
例えば、Z =X *8 の乗算演算は、シフトレジスタを用いて 3 回シフトするだけで同じ結果ですが、遷移数は大幅に少なくなります。

出力バッファ

出力バッファは容量が非常に大きな外部配線を駆動するので、必要な動作の時だけ信号を出力したり、グリッジが収まって出力が安定してから信号を出力するように設計します。

Pre-computation

一部の計算を先に行い全体を動作させる必要がないと判断した場合は、動作を止めて遷移数を削減します。

例えば n Bitのcomparator は、結果が同じになると判っていても全ビットを比較します。
そこで、最初にMSBの 1 ビットだけを比較し、同じ値の時だけ他 Bit を比較するようにします。すると MSB の 1 ビットだけで大小が分かった場合は他の Bit の比較を行わないため、遷移を大幅に削減することができます。

オペランド・アイソレーション

演算回路は組合せ回路で構成されているので、結果が確定するまで内部の論理が頻繁にトグルします。
計算結果が不要な時は入力信号を止めて演算回路の内部動作を止めます。

例えば、演算回路の出力にマルチプレクサがあった場合に、そのセレクト信号を使って入力データを止めます。これは多ビット演算回路で使われます。 

バスの分離

バスは共有化して時分割動作をするより、分けた方が遷移数は少なくなります。
また、下位ビット(LSB)と上位ビット(MSB)の遷移数が大きく違う場合は、バスを分けると、消費電力を削減できます。

例えば、ワード幅が大きい RAM は、上位ビット(MSB)と下位ビット(LSB)の遷移を比較し、マルチプレクサを使ってワード分割すると消費電力が減る場合があります。
これは一般的に、下位ビットの方が上位ビットよりも頻繁に遷移するためです。 

コード・カバレッジの活用

コード・カバレッジを実行して、動作していない無駄な回路を削減します。 

細粒度並列

FPGA がマルチプロセッサや GPU などより低消費電力なのは、並列できる処理の粒度が小さいからです。
プロセッサや GPU で行っている処理を FPGA で処理すると消費電力が下がります。
ソフト処理を行っていたプログラムを OpenCL SDK で FPGA に変換することも可能です。