こんにちは。頭領です。

今回は「新人が新たな領域に首を突っ込んじゃったシリーズ」の第二弾として、複雑な処理を行うテクノロジと FPGA の「ビミョーな関係」から、ツール仕様における便利な情報を紹介します。

 

 

 

ある日、お客様から「 Quartus® II に関する質問があるのですが」という電話が来た。

新人は「ツール、Quartus II ~♪」と心ではタカをくくりながら、「はい、Quartus II のご質問ですね。お伺いいたします。」とご用件を伺った。

 

『 Quartus II は論理合成時に DSP ブロックと内部ロジックのどちらを使うか、どのような判断基準で決めているのですか?』

 

ドーーーーーーーーーーーーーン!!という音が、頭領の頭に響いた。

Quartus II の判断基準?ど、どうしよう…

 

折り返し連絡する旨を伝えて電話を切った後、まずは「 DSP と FPGA のビミョーな関係 」について調べてみた。

 

DSP は Digital Signal Processor (デジタルシグナルプロセッサ)の略だったり、 Digital Signal Processing (デジタル信号処理) のことだったりするが、アルテラ社 FPGA 内の DSP Block というとデジタル信号を算術演算するデジタル信号処理のことだった。本コラムでは、デジタル信号処理について DSP という表現を使う事にする。

 

DSP は主に、ビデオ監視システム、放送機器、ワイヤレス基地局、医療画像処理、レーダーなど、様々なアプリケーションに使用されている。

 

演算処理を高速、かつ効率的に実行できるように、アルテラ社 FPGA には乗算器や加算器が含まれた DSP ブロックがハード IP として用意されているのだ。

 

アルテラ社 FPGA による DSP ソリューションの詳細に関しては、アルテラ社ホームページ上部の「テクノロジ」→「 DSP 」を参照

すると、最新デバイスにおける新機能や、 IP 、リファレンスデザイン、資料などを閲覧できる。

アルテラ社 FPGA に DSP を実装するには、

 

1. DSP ブロックを使用する

2. 内部ロジックを使用する

 

という2つの方法がある。

ちなみに、この DSP ブロックと内部ロジックは、デバイス・ファミリによって呼称が “ ビミョーに ” 異なる。

※但し、最新の Cyclone V については、 Arria V 、Stratix V と同様、 DSP ブロック / ALM という呼び方になっています。

 

そして、 DSP を含むデザインを行うには以下の3つの方法がある。

 

1. アルテラ社の提供する IP を使用してデザインを組み立てる

2. 自分で HDL 記述ベースで作成する

3. MathWorks 社のソフトウェア「 MATLAB® / Simulink® 」の環境でアルテラ社 DSP Builder のライブラリを使用して計算モデルを作成し、 HDL に変換する

 

3 の場合、 DSP Builder 上で DSP ブロック / 内部ロジック のどちらを使用するのかをコントロールできる。

しかし、お客様にお伺いしたところ、今回は 2 のパターンで、 HDL で記述した乗算器に対して Analysis & Synthesis を実行した結果、 DSP ブロックを使用せずに内部ロジックを使用しているとの事。

演算処理部分において DSP ブロックを使用することで、内部ロジックを節約できるが、今回、予想外なことにせっかくのリソースを無駄にしてしまっている。

果たして、 Quartus II 上ではどのような基準で判断しているのだろうか。

 

先輩に聞いてみた。

 

先輩 「うーん、非常に良い質問だけど回答が非常に難しいな」

 

頭領 「えっ、どういうことですか」

 

先輩 「 DSP ブロックか内部ロジックかを決定する要素って様々だから、一言では言えないんだよ」

 

頭領 「そうなんですか?」

 

先輩 「俺も以前同じことに疑問を感じて色々試してみたんだけど、どうやら仮に同じ HDL 記述だったとしても、制約条件やターゲットデバイス、周辺回路の構造、リソースの使用状況によって合成結果って変わってくるみたいなんだよ。

例えばこの、自作の乗算器をターゲットデバイスを変更して Analysis & Synthesis すると…」

先輩 「ほらね。デザインは同じなのに、片方は DSP ブロック のリソースを使用していて、もう片方はしていない」

 

頭領 「へぇ~。まさに、 “ ビミョーな関係 ” なんですね」

 

先輩 「 Quartus II は論理合成やフィッティングのフェーズで、タイミングや面積を最適化するようにリソースを選択するからね。」

 

頭領 「まじっすか…困ったなぁ。お客様に回答できないなあ…」

 

先輩 「でも、どちらを使用するかを “ 優先させる ” 方法ならあるよ!」

 

頭領 「おお!!そんな設定あるんですか!!」

 

先輩 「実は、2つあるんだな~」

 

頭領 「ええ! 2つも!」

 

先輩 「設定のかけ方としては、以下の4つがあるね」

 

1. 回路全体に適用する設定を、.tcl もしくは .qsf ファイルに記述

2. インスタンスに個別に適用する設定を、.tcl もしくは .qsf ファイルに記述

3. 回路全体に適用する設定を、Quartus II の GUI ベースで行う

4. インスタンスに個別に適用する設定を、Quartus II の GUI ベースで行う

 

先輩「まず 1 の方法だけど、 .qsf ファイルもしくは .tclファイルを開くとデフォルトでは "AUTO" になっているから、以下の通り該当箇所を変更するんだ」

 

set_global_assignment -name DSP_BLOCK_BALANCING "DSP BLOCKS"

 

先輩「2 の方法は同じファイルに以下の記述を行うんだ」

 

set_instance_assignment -name DSP_BLOCK_BALANCING "DSP BLOCKS" -to *****

 

頭領「ほうほう」

 

先輩「この記述の末尾の " -to " の次の部分の " ***** " に設定するインスタンス名を記述するんだ」

 

頭領「なるほど。では、3 と 4 のように Quartus II で設定するにはどうしたらいいんですか?」

 

先輩「今から説明するよ」

 

3. Quartus II を使って回路全体に設定する

 

先輩「 Assignments > Settings > Analysis & Synthesis Settings > More Settings > DSP Block Balancing でプルダウンして選択するんだ」

4. Quartus II を使って個別に設定する

 

先輩「 Assignments > Assignment Editor で Assignment Name をプルダウンして " DSP Block Balancing " を選択し、Value で自分の設定したいものを選べばいいんだよ」

 

頭領「おーなるほど!Quartus II での設定も簡単ですね!」

 

先輩「そうそう!これらの設定方法を使って DSP ブロックを使用するように設定し、コンパイルを実行すれば…」

頭領「おお!ちゃんと反映されてる」

 

先輩「良かったね」

 

頭領「良かったです!」

 

先輩「じゃあ、これから FPGA のテクノロジについてもっと勉強して、今度は私のサポートをしてね」

 

頭領「は、はい!頑張ります」

 

こうして頭領は少々複雑な質問に答えることが出来た。

これからもテクノロジをさらに追求し、難しい質問に対して「ビミョーな」回答ではなく、質の高いサポートをしようと心に誓った頭領であった。