2017.02.20

FPGAにおける浮動小数点の計算速度

FPGAの固定小数点の乗算であれば1クロックで動きますが、浮動小数点はどのくらいかかるのでしょうか?

以前、HLSで演算回路を作ろうとしたら、加算に11クロックかかるとかいうレポートが出てきて唖然としました。HDLで書いて、その実力を探ってみたいと思います。

sun

実験に用いた回路は下の図のようなものです。

Float_1

使ったLogiCoreは、Floating-point 5.0というもの。デバイスは、Kintex-7のXC7K160-1。浮動小数点のフォーマットは単精度です。

Float_7

設定次第で、いろいろな演算回路になります。

Float_8


作る回路は、固定小数点で入ってきたIとQを浮動小数に直して、二乗して和を取って、固定小数点に戻すというものです。これらの回路をISE14.7とCoreGenで作ります。まずはfixed→floatからです。

Float_2Float_3Float_4


レイテンシの部分を変えて、どのくらいリソース使用量が変わるかを試してみました。

latency	LUT	SLICE	DSP    WorstTime
----------------------------------
1	173	58	0
6	204	78	0

fixed2floatはレイテンシを増やしてもLUTやSLICEの使用量が増えるだけで、あまり意味はありませんでした。レイテンシ1でも250MHzで動くようなので、これは1クロックでやるべきだと思います。

sun

次は浮動小数点の乗算です。この場合は同じ値の二乗を取る回路になります。結果は、

latency	LUT	SLICE	DSP    WorstTime
----------------------------------
1	194	139	6    8.2ns 100MHz OK
2	152	81	6    4.4ns 200MHz OK
3	154	76	6    3.6ns 250MHz OK
6 162 64 6    3.6ns

となって、レイテンシ1以上であれば使用量はそれほど変化しないことがわかります。クロックを250MHzにしてImplementすると、タイミングエラーが出て、

   Source:               inst_fix2floatQ/blk00000065 (FF) 
   Destination:          inst_Qsq/blk00000030 (FF) 
   Requirement:          4.000ns 
   Data Path Delay:      8.165ns (Levels of Logic = 5)(Component delays alone exceeds constraint) 
   Clock Path Skew:      -0.022ns (0.702 - 0.724) 
   Source Clock:         adcclk_i_BUFGP rising at 0.000ns 
   Destination Clock:    adcclk_i_BUFGP rising at 4.000ns 
   Clock Uncertainty:    0.035ns 

となるので、レイテンシ1の回路の遅延は頑張っても8.2ns程度かかるということがわかります。

100MHzならレイテンシ1で計算できるのですが、125MHz以上ならばレイテンシ2は欲しいところです。

sun

浮動小数点で一番難しいのは、加減算だと思います。これもCoreGeneratorで作ります。

Float_5Float_6

条件をいろいろ変えて実験してみると、下のような結果となりました。

latency	LUT	SLICE	DSP  WorstTime
----------------------------------
1	183	74	2    15ns
2	213	105	2    7.8ns 100MHzOK
3	234	100	2    5.1ns
4 - - 2    4.7ns 200MHzOK
5 - - 2    3.9ns 6 215 90 2    4.8ns 250MHzOK 11 210 94 2    2.7ns

レイテンシ1では100MHzも通りません。100MHzで動作させるならレイテンシ2、200MHzで動作させるならレイテンシ4。250MHzで動作させるならレイテンシ6は必要です。

sun

回路全体の動作は下の図ようになりました。

Float_9

判明した結果をまとめると、以下のようになります。

one リソース使用量はレイテンシによってあまり変化しない。したがって、クロック速度が間に合えば、レイテンシを遅くする必要はない。

two 浮動小数点数の乗算には8.5nsほど。加算には14~15nsかかる。

three クロック100MHzならば乗算器のレイテンシは1でよく、200MHzならばレイテンシ2にする必要がある。

four 加算は遅く、14~15nsかかる。100MHzならばレイテンシ2、200MHzならばレイテンシ4、250MHzならばレイテンシ6は必要である。

five クロックを速くしてもレイテンシがかさむし、消費電力が増えるので、クロックは100~200MHzくらいがちょうどよい。

sun

なお、積和計算を行う場合は、加算の結果が出ないと積算もできないので、レイテンシが2ならばインターバルは2になります。加算の性能がシステム全体の性能に影響します。

今回はISEでやりましたが、HLSで作る場合でもツールにすべて任せるのではなく、どの程度のリソースと計算時間を使うかを頭の中で把握できていれば、高位合成でももっと良い回路が作れるようになると思います。

この成果をもとに、ある種の無線の回路を作ってみたところ、HLSだとインターバルに41クロックかかっていたのが、8クロックでできました。「この結果はここでは使わない」みたいなことが人間の頭ではわかるので、そういったことも含めての最適化なので、単純に5倍とは言えないのですが、最短のクロック数が何クロックであるかというゴールがわかるようになるので、HLSのディレクティブを指定するときにもやりがいが出るのではないかと思います。

これで、私も浮動小数点デビューできそうです。

| | コメント (0)

2017.02.16

Cosmo-Kの新基板が出来てきた

本日、Cosmo-Kの新基板の実装が上がってきました。

Cosmok_6pcs

Cosmo-K0が2個、Cosmo-K+が3個、Cosmo-K-が1個です。

今回の改版の大きなポイントは、DDR3メモリの配線のパターン変更です。

旧基板は、FPGAから2個のDDR3メモリへの配線がT型に分岐していて、しかも片側にしか終端抵抗がついていないという間違った設計になっていました。そのため、1000MHzまでしか動作することができませんでした。

正確に言えば、終端抵抗の付いている方は1600MHzまでいけるのですが、終端抵抗の付いていないほうが1000MHzどまりでした。

オシロで波形を見ると、1.5V振幅のSSTLなのに2V近い反射が見えるなど、ひどいものでした。

sun

そこで、今回の改版では一筆書きのようにFPGAからDDR3メモリへアドレス・コントロール線を配線し、末端に終端抵抗を付けました。

その結果、1600MHzでのアクセスができるようになり、DQSを見ても綺麗に800MHzでトグルしているのがわかります。

Dqs

sun

それから、QSFP+の40Gbpsの信号を4本の10Gbpsにバラして、1本ずつIBERT試験も行いました。

Ibert_1

ちゃんと10Gbpsでリンクアップしています。もちろん、エラーは出ません。

バスタブカーブを描かせてみると、43~50%も開いています。

Ibert_2

アイが50%開いているということは、20Gbpsで0%になると考えていいのでしょうかね。15Gbpsくらいまではいけるのではないかと思えてきます。

少し時間をかけて、2次元のバスタブ試験というものやってみました。

Ibert_3

まぁ、なんというか、完璧に近い性能が出ているのではないでしょうか。

Cosmo-K+は、40Gbpsで通信できます、と胸を張って言えます。

あとは、ブラケットです。ブラケットがないと、PCIeのスロットに挿したとき、がたがたしてしまので、大変危険です。(PCIeのスロットには12Vが来ているので・・)

ブラケットは金属加工業者に特注で作ってもらっていますが、あと1週間くらいかかる見込みです。

とりあえずはEXPARTAN-6Tのブラケットを削って代用しています。

Bracket

そんなこんなで、早速、Cosmo-K+を2台、出荷しました。

サンプルデザイン等が出そろうのは、来週になりそうです。

| | コメント (0)

2017.02.15

Cosmo-Zのアクリルケース入り

納品用のCosmo-Zをアクリルケースに納めました。

1つ目は18bit ADコンバータで拡張されたCosmo-Zです。

Csz18_1

Csz18_2Csz18_3

性能はなかなかのもので、無信号時のノイズは±5LSB程度(156μV程度)でした。

Cosmoz18_3

正弦波を入れてFFTでスペクトラムを見ても、歪率は-80~-90dBは行っていそうです。

sun

もう一つは、全LEMOコネクタ化されたCosmo-Zです。

Cosmoz_lemo_1

Cosmoz_lemo_2

LEMOコネクタは、やはり抜き差しがしやすいですね。

サクサクという感覚がたまりません。

| | コメント (1)

2017.02.14

ZYNQ UltraScale+のボードをさらに輸入

ZYNQ UltraScale+のボードをどんどん輸入しています。

Te0808

下記のオンラインショップから購入できます。

https://shop.tokudenkairo.co.jp/shopping/detail.php?shpdi=TE0808

(為替レートで少し変動するかもしれませんが)定価で販売しています。

輸入の手数料や国際配達代、海外送金手数料などは要りません。

日本円で取引。送料無料。在庫があれば即納。代引きも可。

大学・官公庁には掛け売り対応します。

見積書、納品書などの書類も発行します。

どうぞよろしくお願いします。

| | コメント (0)

2017.02.13

特電からのバレンタイン基板チョコを送りました

ヴァンアレン帯デー企画として、今年も基板チョコを送りました。

題して「基板の名は&トランプ」チョコ。

ホワイトチョコレートの基盤(原文ママ)に、食用インクで印刷してあります。

Choko1

図柄はこんなのです。

Choko5Choko4

これをスタッフ総出で箱に詰めて、

Choko2

郵便で発送しました!

Choko3

お送りしたのは、今年に入ってから、特電から何かをご購入していただいた方で、かつ、代理店(商社)ではない方です。お送りした総数は50名ほどでした。

関東の方には、2月14日に届くはずです。届いた方は、ぜひ、TwitterとかFacebookで紹介していただけると嬉しいです。

お楽しみに。

happy01

| | コメント (0)

2017.02.09

ZYNQ UltraScale+のボードを輸入

ZYNQ UltraScale+のボード「TE0808」を入荷しました。

正確には、モジュールの「TE0808-03ES2 UltraScale+ Module (ES2)」と、ベースボード「TEBF0808-04」を入荷しました。

Te0808

ZYNQのモジュールは、XCZU9EG-1FFVC900 ES2というFPGAが乗っていて、64bit接続のDDR4メモリが2GByteと、ギガビットトランシーバはGTRが4つ、GTHが16個付いています。

Te0808_up

それでいて52×76mmに納まっている、恐ろしい密度の基板です。

また、ベースボードはMiniITX形状で、パソコンのマザーボードのようにUSBコネクタやHDMIコネクタ Displayportも出ています。USBはUSB3ホストだそうです。また、SFP+が2つと、16レーンのPCI Expressまで付いています。

Te0808base

もはやZYNQでできたパソコンですね。

Te080803es2_0_600x600Tebf080804_0_600x600

実は、ZYNQでできたパソコン(のようなもの)もあるのです。下の写真はTE0808スタータキットといいます。

Zynqpc

今回の輸入した分は販売先が決まっているのですが、ご要望があればどんどんお取り寄せいたします。

下記のオンラインショップで販売します。

https://shop.tokudenkairo.co.jp/shopping/detail.php?shpdi=TE0808

在庫があれば即納ですが、今は在庫がないので、納期1~3週間程度です。

すでに次のオーダーも入れています。その時の為替レートにもよりますが、「定価」で販売しますので、どうぞよろしくお願いします。

| | コメント (0)

2017.02.06

DDR3 DIMMのアクセス不具合の原因を瞬時に発見

Kintex-7にDDR3 DIMMを接続している装置があるのですが、不具合が生じたとのことで、検査依頼が来ました。

この装置は特電製なので、USB3.0からDDR3メモリの読み書きができる例のコアが入っています。そこで、USB3.0を通じたDDR3の読み書きテストをしてみたところ、確かに16384バイト以上のバーストアクセスでエラーが出ています。

今回はDDR3 DIMMを使っているので、データバスは64bitです。8192バイトまではアクセスできるので、A10あたりが切れているのかな・・と思ったのですが、実際の基板でそれを確かめるのは結構大変です。

なぜならば、FPGAとDDR3 DIMMとの接続を調べるだけのために、わざわざFPGAにテスト用の回路をプログラミングするのはとても面倒だからです。

sun

そんなとき、MITOUJTAGというソフトを使うと便利です。MITOUJTAG(みとうジェイタグ)はJTAGバウンダリスキャンを活用するソフトなので、FPGAを書き換えることなく、I/Oの端子だけを自由に操作できます。

画面に表示されたKintex-7の絵を見ながら、マウスクリックで操作したい端子をクリックします。

Ddr3buzz

MITOUJTAGの2.9あたりからは、BUZZ機能といって、クリックした端子から100Hzくらいの矩形波を出す機能を付けました。

Ddr3_buzz2

これを使うと端子の状態が自動的にHLHLHL・・・とチカチカするので、DDR3のソケットにオシロのプローブを当てておけば、問題のある個所が瞬時にわかります。

Ddr3_conn


実際にやってみると、BA0やA15、RAS、CASなどの端子は1.8Vくらいの振幅でトグルするのですが、

Ddr3_ba0

A10の端子だけは、なぜか、振幅が異常に小さいという結果になりました。

Ddr_a10

MITOUJTAGを使ったら、あっという間にDDR3メモリの不具合の原因が発見できました。

もし、MITOUJTAGを使わなかったら、どれだけ面倒なことになっていたでしょう。

| | コメント (0)

2017.02.05

Artix-7のDDR3メモリで1066MHz動作

あるお客様から、Artix-7ボードのDDR3メモリで1066MHz動作させるとビットエラーが出るという、ご連絡を受けました。

A7ddr3


特電の用意しているUSB3-AXI-DDR3のリファレンスデザインは、800MHzで動作させています。このリファレンスデザインのMIG設定を変えて試したみたところ、確かに1066MHzにするとエラーが出ます。

Artix-7は、スピードグレードが3段階あって、-1と-2は800MHzまで、-3は1066MHzまで対応できるはずです。Artix-7ボードを最初に作ったときにはMicron製のメモリを使っていたのですが、いつしか入手できなくなったため、Alliance Memory社のDDR3を使うようになりました。Alliance Memory社のDDR3が800MHzまでと書かれていたので、それが原因かと思ったのですが、どうやら800MHzまでというのはクロックであって、データレートは1600MHzまでという意味でした。

つまり、FPGAもメモリも1066に対応しています。

そこで、昔作ったMIGのサンプルデザインを呼び出してきて、試してみると、1066MHzでも動きました。

動いているときの様子をオシロで見てみました。

まずは、クロック。

Ddr3_clock

綺麗な533MHzが見えています。

次は、DQSです。

Dqs_1Dqs_2

おそらく読み書きで波形が違うのですが、こちらも綺麗です。

単純なMIGアプリでは、波形的には全く問題ありませんでした。

では、なぜビットエラーが出たのかというと、おそらくAXIの部分での速度変換が原因です。

XILINXのMIGは、DDR3のデータレートの1/8の速度のクロックでアクセスします。DDR3が1066MHzならば、MIGのユーザポートのクロックは133MHzになります。

特電のAXI-USB3コアは、データレートが100MHzなので、そこでのミスマッチが原因だと思います。Vivadoで論理合成したときにもタイミングエラーが出ていました。

Timing_error


本当はAXIインタコネクトでクロック変換ができるのだと思いますあ、まだ上手くいくデザインを書いたことがありません。

| | コメント (0)

«FIRフィルタの実機テスト