ver. 9.1 2009 年 12 月 1. はじめに Nios II にオプションで実装できる浮動小数演算カスタム インストラクションは 浮動小数四則演算はサポートしているものの 整数から浮動小数にキャスト ( 型変換 ) する機能やその逆の機能は備えていません この資料では 単精度浮動小数型と整数型の変換を簡単に Nios II のカスタム インストラクションに実装する方法を紹介しています なお この手法を応用することで MegaCore Function で用意されている平方根 (ALTFP_SQRT) や対数 (ALTFP_LOG) 指数関数 (ALTFP_EXP) なども実装することができます 2. 対象となるバージョン Quartus II Version 9.1 Nios II Integrated Development Environment Version 9.1 Page 1 of 14 Altima Corporation
3. 操作方法 3-1. ベース プロジェクトの作成 Nios II が動作する Quartus II プロジェクトをあらかじめ用意してください 3-2. MegaWizard Plug-In Manager を使用した HDL ソース ファイルの生成 1 Quartus II の Tools メニュー MegaWizard Plug-In Manager を選択し 表示された MegaWizard Plug-In Manager [page 1] で Create a new custom megafunction variation を指定し Next をクリックします 2 MegaWizard Plug-In Manager [page 2a] が表示されたら Arithmetic を展開し ALTFP_CONVERT を選択します その後 生成する HDL タイプ ファイル パスおよびファイル名を設定し Next をクリックします ここでは浮動小数から整数に変換する HDL を ftoi.v として生成します ver. 1.0 2009 年 12 月 Page 2 of 14 Altima Corporation
3 MegaWizard Plug-In Manager [page 3 of 7] の ALTFP_CONVERT のダイアログが表示されたら パラメータを下記の設定にして Finish をクリックします Operation mode : A floating point to an integer Integer data : 32bit Input floating point Settings : Single precision(32bit) Output floating point Settings : 設定無効 ver. 1.0 2009 年 12 月 Page 3 of 14 Altima Corporation
Optional inputs : Create a clock enable port 4 同様に 整数から浮動小数に変換する HDL を itof.v として生成します Operation mode : An integer to a floating point Integer data : 32bit ver. 1.0 2009 年 12 月 Page 4 of 14 Altima Corporation
Input floating point Settings : 設定無効 Output floating point Settings : Single precision(32bit) Optional inputs : Create a clock enable port ver. 1.0 2009 年 12 月 Page 5 of 14 Altima Corporation
3-3. SOPC Builder でのカスタム インストラクションのコンポーネントの登録 1 Quartus II から SOPC Builder を起動し File メニュー New Component を選択します 2 Component Editor で HDL Files タブを選択し Add をクリック後 先ほど生成した ftoi.v を選択します HDL に問題が無ければ Analyzing < ファイル名 > Completed ダイアログ ボックスが表示されますので Close をクリックして閉じてください ver. 1.0 2009 年 12 月 Page 6 of 14 Altima Corporation
3 Interfaces タブを開いて Custom Instruction Slave を選択し Clock Cycles に 7 Operands に 1 を設定します Clock Cycles はコアの実行から結果が出力されるまでのクロック数です ALTFP_CONVERT の Pipeline は 6 ですので ( 詳細は Floating Point Converter (ALTFP_CONVERT) Megafunction User Guide を参照してください ) +1 した 7 を設定します Operands は引数の数となりますので 入力値が一つの ALTFP_CONVERT は 1 を設定します ver. 1.0 2009 年 12 月 Page 7 of 14 Altima Corporation
4 Signals タブを選択し clk_en / clock / data / result を下記のように設定します 5 再び Interfaces タブに戻り Remove interfaces With No Signals ボタンが有効になっていればクリックします こうすることで 割り当ての無いインタフェースを削除することができます 6 Component Wizard タブを選択し Class Name や Display Name Group などを設定後 Finish ボタンをクリックして閉じます 7 同様に itof.v もカスタム インストラクションのコンポーネントとして登録します ver. 1.0 2009 年 12 月 Page 8 of 14 Altima Corporation
8 SOPC Builder の Nios II Processor を開き Custom Instructions タブを選択します 先ほどの Component Editor で追加した ftoi と itof が左側のリストに表示されますので 選択して Add をクリックして右側のリストに追加します 9 Finish ボタンをクリックして カスタム インストラクションの登録は完了です SOPC Builder において Generate 実行をし その後 Quartus II でコンパイルしてください ver. 1.0 2009 年 12 月 Page 9 of 14 Altima Corporation
3-4. Nios II IDE (Integrated Development Environment) でのカスタム インストラクションの実装 1 Nios II IDE を起動後 新規にプロジェクトを生成し Build します 2 system.h を確認して 登録したカスタム インストラクションのマクロが存在するか確認します : : /* * custom instruction macros * */ #define ALT_CI_FTOI_INST_N 0x00000000 #define ALT_CI_FTOI_INST(A) builtin_custom_ini(alt_ci_ftoi_inst_n,(a)) #define ALT_CI_ITOF_INST_N 0x00000001 #define ALT_CI_ITOF_INST(A) builtin_custom_ini(alt_ci_itof_inst_n,(a)) : : FTOI( 浮動小数 整数変換 ) が 0 番 ITOF( 整数 浮動小数変換 ) が 1 番で登録されていることが分かります 3 動作を確認するため main 関数を下記のように記述して実行してください #include <stdio.h> #include "system.h" int main() { int n = 0; float f = 1234.5678; n = builtin_custom_inf(alt_ci_ftoi_inst_n, f); printf("ftoi=%d n", n); f = builtin_custom_fni(alt_ci_itof_inst_n, n); printf("itof=%f n", f); } return 0; コンソールに ftoi=12345 itof=12345.0000000 と表示されれば正常に動作しています カスタム インストラクションのマクロは 引数と戻り値の型により下記のような記述が可能です builtin_custom_ < 戻り値の型 > n < 第一引数の型 >< 第二引数の型 >( カスタム インストラクション番号 引数 ) 例えば 戻り値が int 型 第一引数が単精度小数型 第二引数が整数型の場合 下記の記述になります builtin_custom_infi また 引数が一つしか無い場合には 最後の文字を省略し builtin_custom_inf 戻り値が無い場合には n の前の文字を省略します builtin_custom_nf 型 int float void * 記述 n f p ver. 1.0 2009 年 12 月 Page 10 of 14 Altima Corporation
4 続いて C 言語のキャスト記述でカスタム インストラクションが実行されるよう コンパイル フラグを設定します アプリケーション プロジェクトの Properties を開いて Compile Flags に -mcustom-fixsi=0 -mcustom-floatis=1 と設定します -mcustom-fixsi は浮動小数から整数への変換のためのカスタム コンポーネント (FTOI) の番号 (0) を指定し -mcustom-floatis は整数から浮動小数への変換のためのカスタム コンポーネント (ITOF) の番号 (1) を指定します 5 main 関数を下記のように変更して実行してください #include <stdio.h> #include "system.h" int main() { int n = 0; float f = 1234.5678; n = (int)f; printf("%d n", n); f = (float)n; printf("%f n", f); } return 0; 6 正常に動作していることが確認できたら カスタム インストラクションで動作しているかを確認するため Debug で起動します ver. 1.0 2009 年 12 月 Page 11 of 14 Altima Corporation
7 Debug 画面に切り替わったら Disassembly ウィンドウを確認してください 下記のように カスタム インストラクションが呼ばれるようになっていれば正常です ver. 1.0 2009 年 12 月 Page 12 of 14 Altima Corporation
4. 補足 4-1. 性能比較 単精度浮動小数による各種の演算を ソフトウェアとハードウェアで実行した際の動作クロックの比較です 検証は下記の構成で行っています Device : Cyclone III EP3C120F780C7 Processor core : Nios II/f 100MHz Instruction Memory : On-Chip RAM (Tightly Coupled instruction bus) Data Memory : On-Chip RAM (Tightly Coupled data bus) Optimize option : -O3 演算 ソフトウェア実行時 (us) カスタム インストラクション実装時 (us) 標準四則演算 型変換コア追加時 各演算コア追加時 + 3.400 0.130 0.130 0.130-3.632 0.120 0.120 0.120 * 3.551 0.140 0.140 0.140 / 5.536 0.370 0.370 0.370 (int) 0.953 0.974 0.090 0.090 (float) 2.811 2.853 0.090 0.090 sqrtf() 6.031 5.553 5.561 0.190 logf() 97.791 9.691 9.760 0.240 expf() 90.228 12.340 12.250 0.200 型変換をソフトウェアで実装した場合と比べ 整数型変換では 10 倍 浮動小数型変換では 31 倍の高速化が実現できています また 平方根 (sqrt) でも 31 倍 対数 (log) では 407 倍 指数関数 (exp) では 451 倍もの大幅な高速化が可能です なお 上記の計測結果はシステムの構成によって変動する場合がありますので 参考値としてお考えください ver. 1.0 2009 年 12 月 Page 13 of 14 Altima Corporation
弊社より資料を入手されましたお客様におかれましては 下記の使用上の注意を一読いただいた上でご使用ください 1. 本資料は非売品です 許可無く転売することや無断複製することを禁じます 2. 本資料は予告なく変更することがあります 3. 本資料の作成には万全を期していますが 万一ご不明な点や誤り 記載漏れなどお気づきの点がありましたら 弊社までご一報いただければ幸いです 4. 本資料で取り扱っている回路 技術 プログラムに関して運用した結果の影響については 責任を負いかねますのであらかじめご了承ください 5. 本資料は製品を利用する際の補助的な資料です 製品をご使用になる場合は 英語版の資料もあわせてご利用ください 横浜本社 222-8563 横浜市港区新横浜 1-5-5 マクニカ第二ビル TEL 045-476-2155 FAX 045-476-2156 大阪営業所 532-0003 大阪市淀川区宮原 3-4-30 ニッセイ新大阪ビル 17 階 TEL 06-6397-1053 FAX 06-6397-1054 名古屋営業所 460-0003 名古屋市中区錦 1-6-5 名古屋錦シティビル 7 階 TEL 052-202-1024 FAX 052-202-1025 宇都宮営業所 321-0953 宇都宮市東宿郷 4-2-24 センターズビル 7 階 TEL 028-637-4488 FAX 028-637-4489 ver. 1.0 2009 年 12 月 Page 14 of 14 Altima Corporation