« FPGAの動作周波数を上げる5つの方法 | Main | FPGAの消費電力の最適化 »

2008.03.18

FPGAのエリアを最適化する

Advanced FPGA Design: Architecture, Implementation, and Optimizationから

リソースシェアリングの話
FPGAの使用率を下げるには、リソースシェアリングが基本。パイプラインをループに変換(rolling up)することで、エリアが小さくなる。

リセットの話
必要のないリセットは取ってしまうことで、エリアの最適化を図れる。タイミング調整のために、FFで叩くだけの回路はリセットを入れない事で最適化される。例えば100bitのシフターであれば、普通にリセット付きで回路を書くと、当然FFを100個使う。リセットを取り外すことで、FFの数を1/5以下に減らすことができる。

例えばこういう回路(100bitシフタ)があったとする。

module shift(input clk, input rst_x, input ind, output outd);
 reg [99:0] shifter;
 always @ (posedge clk or negedge rst_x)begin
  if(rst_x == 0)begin
   shifter <= 0;
  end else begin
   shifter <= {shifter[98:0], ind};
  end
 end
 assign outd = shifter[99];
endmodule

Cycloneをターゲットにして、Quartus2で合成した結果はこうなる。
Total logic elements 100 (register 100)
Total memory bits 0

計算通り、100個のレジスタが使われている。

これをリセット部分を抜いてみる。

always @ (posedge clk )begin
 shifter <= {shifter[98:0], ind};
end


合成した結果はこう。
Total logic elements 12 (register 7)
Total memory bits 98
レジスタの数が100個から7個に減っているのがわかる。Alteraの場合は、シフタの分メモリを使っているのに注意する。要するに内部メモリを使ってシフタを実現し、FFの数を減らしている。

シフタの最適化に関してはXilinx Deviceは優秀で、LUTをシフトレジスタとして使用することができる。Spartan3で試してみると
リセット有り:Number of occupied Slices 49
リセット無し:Number of occupied Slices 4
Spartan3は1SliceにFFが2つなので、リセット付きの回路はそのままFFを並べ、リセットを抜くと最適化されてSliceの数が減っているのがわかる。これだけみると、最適化の効果はたいしたことが無いと思われがちだが、メモリコントローラ等で、64bit、128bitのデータに対して行うと、FF100個単位で効いてくる。

ほかにもRTLでメモリを記述したときに、リセットを入れると全部FFで構成され、リセットを抜くことで内蔵メモリをうまく推論させたりしている。

おっさんの昔話的には、APEXでエリア優先にしたとき、使用率が下がったにもかかわらず動作速度がほとんど落ちないときがあった。回路規模が小さくなって、結果的に配線が短くなったから。今のデバイスは、配線の遅延よりもfanoutの影響の方が大きいのでこういう結果にはなりにくい。APEXだと、Ptermや内蔵メモリを駆使して回路を作ったので余計に配置に制約があったのかもしれない。

|

« FPGAの動作周波数を上げる5つの方法 | Main | FPGAの消費電力の最適化 »

Comments

The comments to this entry are closed.

TrackBack


Listed below are links to weblogs that reference FPGAのエリアを最適化する:

« FPGAの動作周波数を上げる5つの方法 | Main | FPGAの消費電力の最適化 »