論理回路デザイン
ホーム
パイプライン
テクニック
テスト
設計例 ⇒
FIFO
浮動小数点
FFT
CICフィルタ
DDR制御(論理)
DDR制御(実装)
キャッシュ
クロスバス
パイプラインとは
ステージの構造
ステージの連結
結合
スループット制御
調停
同期
メモリ接続
リソースシェアリング
パラメータ
パイプライン
[1]
とは
流れ作業と同じく入力・加工・出力の工程を行います。通常、加工を連続して行うことで(処理の並列化)、性能の向上を図ります。
全体のパラメータを変えたり、前段にフィードバックを行う場合、整合性を保つため一旦動作を止める必要があります。この場合、入力から出力するまでに要する時間(Latency)が関係します。
下図は、紫色の処理AがProcess5でパラメータを使い終わるまで共通パラメータが変更できず、水色の処理Bが開始できないことを示しています。従って、点線白抜きの処理は無効にしなければなりません。汎用プロセッサ等はこのような依存関係が度々発生し、これを回避するためさまざまなテクニックを駆使し高価なものになります。
パイプラインは回路スライシングによる高速化・規模縮小などにも利用します。下図は、32bit乗算をα, βの2ステップに分けることによって、
性能アップと回路規模ダウンが実現
[2]
できることを示しています。
複数のパイプラインは
結合
ルールを使って結合します。また、繋ぎ変えることによって異なる機能が実現できます。パイプラインの再利用性を高めれば、システムの構築も比較的簡単に行えるようになります。
パイプライン設計の考え方
パイプラインは基本的に入力と出力だけなので、必要機能を連結していけば、最後には所望の機能が達成できます。パイプラインの基礎・応用・実践を経験し慣れてくれば、経験則に基づき直観的に回路イメージが頭に浮かぶようになります。
基本機能を接続して作り上げるボトムアップ設計ベースのように見えますが、設計開始時はトップダウンで性能とコストのバランスを確認しておく必要があります。例えば、以下のようなことです。
可能なら再利用できるような単位に分解し、最終的に基本要素にまで分解する。
性能ターゲットになる最小スループットを決めておく。
各要素においては最小スループットの達成を必要十分条件にし、回路規模を最小化する。
スループット制御
により、途中比率が変わる場合はその比率で設計する。
調停
や
リソースシェアリング
によりバブルサイクルが発生する場合は、スループットの減少を考慮するコスト優先か、考慮しない性能優先かを仕様として決めておく。
単独のパイプラインを設計するのは簡単です。しかし外部メモリやコストの高い
パイプラインリソースを共有
したり、
パラメータを圧縮
したりするため、パイプラインは分岐・結合して構成されます。また、最もバグが潜みやすいのはパイプラインどうしの
結合
部分です。検証を繰り返しても漏れることも多いので、細心の注意を払ってソースのチェックをします。
動作周波数はプロセスなど物理的な要素と、論理段数によりほぼ決定付けられます。設計者が積極的に関与できるのはパイプラインの構造即ち論理段数であり、要素ごとの論理段数を考慮しながらパイプラインを設計します。
パイプラインの要素となる
ステージ
の管理単位やインターフェイス仕様はシステムもしくは組織で定めておき、可読性や再利用性を高めておきます。
パイプラインは必要最小限の機能を
時間軸方向に並列化
[3]
するため、性能コスト比に優れます。一方、ステージ単位で並列化を行う場合があります。コストは並列数分増大します。メモリなどシステム上どうしても送受信しなければいけない単位に合わせるため冗長性能でも並列化する場合があります。周波数を途中落とす、またはデータを時分割処理するなどの手法の長所(回路削減)と短所(複雑化や拡張性の維持)を見比べて決定します。
バブルサイクルが発生するとその欠落分の性能は取り返しが困難なため、可能な限り発生を除去することが肝心です。例えば、パイプラインどうしの同期化のため全体の流れを止める場合はパイプランの長さを合わせたり、
調停
によるランダムな揺らぎをFIFOで吸収し平均化したりします。
入力のスループットと出力のスループットは個別の揺らぎを持つため、パイプラン全体で両者の揺らぎが吸収できているか最終的なチェックが必要です(
バッファ型(S
2
)の連結
や
FIFO
を利用します)。入力流量と出力流量の平均の許容量が決まっていれば、吸収が完全にできる場合は論理的にいずれか少ない方のスループットまで出すことが可能です。しかし、吸収が全くできない場合は、入出力双方が作用しあい、平均許容量の積のスループットしか出せません。入出力の平均許容量がそれぞれ50%と40%なら、前者でmin(50%, 40%)の40%、後者で50%x40%の20%になります。
パイプライン構造を意識した設計は、パイプライン全体、もしくはそれぞれのステージの独立性が高くクロックゲーティングが容易です。全体の回路規模に占める割合も算出しやすく、バランスのとれた低消費電力化が可能です。
回路デザイン
>
パイプライン
> パイプラインとは
次のページ(ステージの構造)
このページのTOP ▲
[1]
こちらでは、パイプライン機能としてある程度まとまっているものを1つの単位として管理しています。これらを組み合わせることで高度なモジュールを提供したいと考えています。
我々はこのような設計スタイルが身についていますが、それが正解とも限らず日々考えている次第です。
[2]
例えば、32bitどうしの乗算を1サイクルで行うとセルライブラリにもよりますが、50段以上の論理段数になってしまいます。この50段と言う値をどう見るかですが、個人的な経験上で言うと結構多いなと感じる閾値です。
レイテンシが気にならなければ16bit程度に分解し、何段かのステージで実行した方がいいでしょう。なお、基本的に論理段数の多い回路は、論理合成時にコストの高いセルを使うので回路が増える傾向にあります。
[3]
例えば、画像のRGBなどは32bitワードにパッキングされていることが多く、この単位で並列に処理するとパイプライン構造は簡単になります。
一方、RGBがそれぞれの要素に分かれている場合(Planer)、それぞれの要素だけの処理ならコストが抑えられます。ただし、異なる要素を組み合わせる処理は同期の関係で面倒になります。
回路品質的には前者の方がシンプルでいいと思います。コスト軽減にはパッキングでありながらRGBを交互に処理する方法もありますし。