copy from ment book
設計および検証プロセスの削減
高抽象度での作業は、記述に必要な詳細が少なくなる。
例えば、機能レベルでは、エンジニアは階層やプロセス、クロック、テクノロジといった実装の詳細を気にする必要がなくなる。
エンジニアは、。実現しようとしている動作のみに注目すればよい。これによって、コード記述がずっと楽になる。
コードの行数も減り、エラーのリスクも減少し、また、ソース内で津とを必要とする項目も少なくなるため、モデルの検証も格段に簡単になる。
高位モデルの記述と検証の後は、。HLSがRTL実装プロセスを自動化してくれる。
しかし、HLSツールが手動作業の介入やエラーを排除しても、エンジニアリング介入はなくならない。-> 判断と決定
高位合成では、エンジニアがコントロール権を持ち意思決定を行うが、実装を行うはHLSツールである。
これは単に、HLSツールのほうが効率よく実装を行えるからである。
例えば、設計者は最適アーキテクチャの並列性の適切なレベルを決定し、それにあわせたHLSツールの制約を行う。
逆に、必要とされるハードウェアリソースのアロケーションおよびスケジューリングや、完全に機能的で最適化された実装を作成するためのデータパスおよび制御構造の構築はツールが行う。HLSでは正しいRTLをより早く取得するため、作成フェーズの短縮につながる。すなわち。デバックのオーバーヘッドが低下し、検証にかかるストレスが軽減されることとなる。
再利用の効率化
高抽象度での作業には、他にも利点がある。
デザインのソースは完全に一般化されるため、多用途なものとなる。
過去には、IPと再利用がデザインの複雑性を解消するための手法として推奨されてきた。
しかし、こういった方法には限界がある。
RTLでは2つのクロックエッジ間に起こる動作を記述する。これは、定義によって特定のテクノロジとクロック周波数に結び付けられる。
従来のRTLをリターゲットすることが可能であれば、多くの場合それは電力やパフォーマンス、面積を犠牲にする可能性がある。
また、既存のIPに小さな変更を加えて派生版を作成すると、またたく間にプロジェクトが予想以上に大きくなることもある。
反対に、真に機能的な仕様で作業を行っていると、ソースにはクロックやテクノロジ、マイクロアーキテクチャといった詳細は存在しない。
これは高位合成のプロセスにて自動的に追加される情報となる。
そして新たな機能がIPに加えられたとしても、変更は抽象化されたソースでより簡単に作成/検証され、パイプラインを壊したりステートマシンを書き直したりという心配はない。??
HLSでは、機能IPの再利用とリターゲットはより簡単なものとなる。
高位合成の基礎
C++からハードウェアを合成する際によくある誤解のひとつは、
アルゴリズムを記述するのにどのようなスタイルのC++コーディングを使ってもよい、というものである。
高位C++合成を使う設計では、C++でハードウェアを記述しているという点を忘れてはならず、
また、下手な記述が最適とは呼べないRTL実装につながる可能性に注意しなければならない。
C++でコーディングを行うときに、デザインの内部メモリアーキテクチャを考慮に入れるだけでなく、
C++合成に推奨されるコーディングスタイルを遵守することもユーザの責任となる。
トップレベルデザインモジュール
HLSえは、RTL設計と同様に、どこがデザインのトップなのかを、
ユーザが指定する必要がある。
これは、デザインと外界とのインターフェースであり、
ポート定義、方向、ビット幅、そしてC++の場合はデータ型といったものから構成されている。
module top (
clk,
narst,
din,
dout
);
input clk;
input narst;
input [31:0] din;
output [31:0] dout;
reg [31:0] dout;
always @ (posedge clk or negedge narst) begin
if (~narst) dout <= 0;
else dout <= din;
end
endmodule
void top (
int din,
int& dout
){
dout = din;
};
出力のレジスタ化
高位合成では、デフォルトで同期デザインを実装する。
これは、トップレベルデザインのすべての出力は、他のデザインと接続したときに
タイミングが合うことを保証するためにレジスタ化されることを意味する。
より小さい組み合わせブロックを実装する機構もあるが、一般的にデザインは同期となる。
制御ポート
C++コードにはタイミングの概念が無いので、クロックやイネーブル、リセットは
ソースに記述されない。その代わりに、合成ツールによって信号が加えられる。
極性やリセットの種類などは、デザイン制約を設定することによって制御することになる。
ポート幅
簡単なケースでは(合成でのインターフェース制約がごく少ない場合)、
クロックおよびリセットを除くトップレベルポートのビット幅はデータ型によって暗黙的に決まる。
上記のデザイン例では、データ型が「int」であるため、32bitということになる。
任意のビット幅を記述するには、ビットアキュレートデータ型を使用する。
入力ポート
インターフェース変数が読み込みのみの場合は、入力ポートとみなされる。
出力ポート
出力ポートには2つのケースがある。
1つは、トップレベル関数が値を返す場合。
引数に対し書き込みのみが行われている場合は、参照もしくはポインタとして宣言する必要がある。
双方向ポート
同一デザイン内でインターフェース変数に読み込みと書き込みの両方を行っている場合は、
双方向ポートとして扱われる。
このためには、その変数は参照またはポインタとして宣言される必要がある。
最終更新:2013年05月19日 13:12