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や内蔵メモリを駆使して回路を作ったので余計に配置に制約があったのかもしれない。
The comments to this entry are closed.
Comments