FPGAで加算器つくるとき、何入力にすればいいの??
と思ってググったら、
を見つけた。
Altaraでは3入力にするとコスパがいいらしい。
ALMの共有演算モードというのを使うことができるから、とのことだが、こいつはIntel(Altera)のデバイスのプリミティブである。Arria10の共有演算モードに詳細が書いてある。
で、Xilinx(Kintex Ultrascale)はどうなの???
と調べたところ、3入力と4入力はあまりかわらず、2入力のFmaxが400MHz越えとかなり良い結果になった。
Xilinxでは200MHz程度の動作周波数でよければ3入力、400MHz動作が必要な場合は2入力が良さそう。
Xilinxのデバイスの下調べ
DSPについての話はいくつかあって、公式にも記載されている。
- 7 SeriesのDSP48E1の資料(ug479) → 3入力加算器が構成できるらしい
- UltrascaleのDSP48E2の資料(ug579) → 4入力加算器が構成できるらしい
LUT(CLB?)についてはug574に書いてあるが、加算器の構成についてはよくわからない。
Xilinxデバイスでの実験
KCU105のボード設定で、クロック入力を300MHzに制約してVivado 2018.2でインプリしてみた。雑な実験なのでクロックだけ別にして全部まとめてimplしたので、その悪影響はあるかもしれない。LUT/FF使用量は、synthの結果で、WNSはimplの結果を記載している。
(冒頭の記事を参考に、VHDLに書き直したのと雑なシミュレーション環境とかを追加した)
なんか、Fmaxが異常に良いし、素直に2入力加算器使えってことなのかな?
あと、下調べで多入力できることが分かっているDSP使うとどうなるのかな?
Latency | LUT | FF | WNS1 | Fmax2 | (Altera Fmax3) | |
---|---|---|---|---|---|---|
256入力加算器 | 1clk | 4149 | 32 | -4.246ns | 132MHz | (70MHz) |
2入力加算器 | 8clk | 8160 | 8160 | +0.921ns | 415MHz | (225MHz) |
3入力加算器 | 6clk | 4224 | 4224 | -0.380ns | 269MHz | (213MHz) |
4入力加算器 | 4clk | 7735 | 2720 | -0.598ns | 254MHz | (159MHz) |
Xilinxデバイスでの実験(DSP)
単純に、以下のような記述を追加して同じようにimplを実施してみた。(今ug901見たらuse_dsp
が推奨なのね。。。)
attribute use_dsp48 : string;
attribute use_dsp48 of sum_reg : signal is "yes";
性能は悪くなった。DSP使用数をみると意図通りにできていないようにも見える。
Latency | LUT | FF | DSP | WNS1 | Fmax2 | |
---|---|---|---|---|---|---|
256入力加算器(DSP) | 1clk | 0 | 0 | 254 | -11.332ns | 68MHz |
2入力加算器(DSP) | 8clk | 7936 | 7680 | 7 | +0.751ns | 387MHz |
3入力加算器(DSP) | 6clk | 4220 | 4064 | 2 | -0.681ns | 249MHz |
4入力加算器(DSP) | 4clk | 7574 | 2432 | 4 | -1.008ns | 230MHz |
-
create_clock -period 3.333
で制約したときのimpl結果 ↩ -
1000 / (3.333 - WNS)で算出(参考URL(AR# 57304)) ↩
-
Cyclone V / Quartus 17.0.0 Lite Edition / 300 MHz 制約 (元記事から引用) ↩