Ubuntu で Intel HLS Compiler を使いたい


##概要
__Ubuntu 16.04 PC で 無料版 Intel HLS Compiler v18.0 を動かしてみました。その内容を書かせていただきます。__

Intel HLS Compiler (Cコードから Intel FPGA -旧Altera FPGA- 用のRTLコードを生成してくれるやつ) が無償で使えるバージョン(Lite Edition)が出ているんですが、公式ドキュメントでは、実行できる Linux 環境は Red Hat 系 のみで Ubuntu はサポート外(有償版も状況は同じ)。
でもまぁ、何とかなるんじゃないの?同じLinuxなんだから、と思い、下記先人の記事を参考にさせていただきながら、チャレンジしてみました。おおまかに、必要な作業としては、

+ Quartusツールのインストール
+ ModelSimを動かすための細工
+ gcc 4.4.7 のインストール
+ HLSコンパイラを動かすための環境設定

といった内容になります。
 
####参考資料:
["Install modelsim on linux"] (https://yoloh3.github.io/linux/2016/12/24/install-modelsim-in-linux/) by Ho Huy Hung さん 
["How to install gcc-4.4 on Ubuntu 16.04"](https://askubuntu.com/questions/789179/how-to-install-gcc-4-4-on-ubuntu-16-04) from askubuntu.com
["Intel HLS Compilerを使える状態にする（CentOS編）"](https://qiita.com/yukitaketake/items/d78bc18d5e7ba2b5d3b0) by @yukitaketakeさん
["Ubuntu16の上で手軽にIntel HLSを使うためにDockerでCentOS7を動かす"](https://qiita.com/miyox/items/852faa5fee6fd6adf2ac) by @miyoxさん
["Intel HLS Compilerの感想"](https://blogs.yahoo.co.jp/verification_engineer/71363263.html) by @Vengineerさん

##使った Ubuntu 16.04 PC:
Ubuntuの公式サイトからダウンロードしてきたisoイメージ(ubuntu-16.04.4-desktop-amd64.iso)でインストール後、デフォルトで動いている Software Updater のお勧めに従い、16.04のアップデートを行いました。lsb_release -d は 16.04.5 LTS 、 uname -r (Kernel version) は 4.15.0-33-generic となっています。この時点でインストールされている gcc は、5.4.0 です。

##Quartus & HLSコンパイラのインストール:
Intel のサイトからダウンロードしてきた Quartus-lite-18.0.0.614-linux.tar を tar xf し、sudo setup.sh で、/opt の下にインストールしてます。ModelSim とのco-simulationがHLSのウリなので、ModelSim-Intel FPGA Starter Edition(Free) も忘れずインストール。この状態で、デスクトップに生成された Quartus アイコンから Quartus が起動できることを確認。
この先の便宜のため、ツールのインストールパスを環境変数に設定しておきます。
`export INTELFPGA_TOOLDIR=/opt/intel/intelFPGA_lite/18.0 #お使いの環境に合わせて下さい`
`export MODELSIM_DIR=${INTELFPGA_TOOLDIR}/modelsim_ase`
`export QUARTUS_ROOTDIR=${INTELFPGA_TOOLDIR}/quartus`

##ModelSim を動作させる:
Quartus に付属の ModelSim の起動に必要なライブラリをインストールをします。
`sudo dpkg --add-architecture i386` 
`sudo apt-get update `
`sudo apt-get install libxft2:i386 libxext6:i386 libncurses5:i386 libstdc++6:i386`
あと、不足しているフォルダを補います。
`sudo ln -s $MODELSIM_DIR/linux $MODELSIM_DIR/linux_rh60`
(これを行わず \$MODELSIM_DIR/bin/vsim を実行すると、linux_rh60 が無いぞ、という旨のエラーが。\$MODELSIM_DIR/bin/vsim はシェルスクリプトだったのでチラっと読んでみると、Kernel Versionが 4.x.x の場合はなぜか __linux_rh60__ フォルダ下のファイルを呼び出すようになっている、けどそんなフォルダは存在していない...エラーが出るはずです。で、対策として、3.x.x Kernel の時に使われるフォルダと同じものを **linux_rh60** として作ってやる、を取ります。\$MODELSIM_DIR/bin/vsim を修正してしまうという手もアリです。)
以上により `$MODELSIM_DIR/bin/vsim` でModelSimが起動できるようになりました。

##gcc 4.4.7 のインストール:
ドキュメントによると、HLS Compiler は gcc 4.4.7 でないと動かないとのことですので、インストールします。gcc 4.4.7 のバイナリは、14.04 (trusty) のリポジトリに入っているようなので、apt でのサーチ先に追加。
`sudo add-apt-repository "deb http://jp.archive.ubuntu.com/ubuntu/ trusty main universe"`
`sudo add-apt-repository "deb http://jp.archive.ubuntu.com/ubuntu/ trusty-updates main universe"`
`sudo apt-get update`
インストール実行
`sudo apt-get install g++-4.4`
`sudo apt-get install g++-4.4-multilib`
複数の gcc のバージョンがインストールされた状態になった(4.4.7と5.4.0)ので、どちらのバージョンをデフォルトで使うかを簡単に切り替えられるよう、update-alternatives コマンドに登録しておきます。で、4.4.7 をデフォルトに切り替えます。 
`sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 10 --slave /usr/bin/g++ g++ /usr/bin/g++-5`
`sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.4 5 --slave /usr/bin/g++ g++ /usr/bin/g++-4.4`
`sudo update-alternatives --set gcc /usr/bin/gcc-4.4`
(ちなみに元の 5.4.0 に戻すには、`sudo update-alternatives --set gcc /usr/bin/gcc-5` ですね)
`gcc --version` を実行してみて、表示内容に "4.4.7" が含まれていればOKです。

##HLS を動作させるための設定:
~~まずは、co-sim のための dpi (Direct Programming Interface) を使うために追加で必要なライブラリのインストール。~~
~~`sudo apt-get install gcc-multilib`~~ _(不要ですね)_

gcc 4.4.7 を使うために ModelSimに付属している別バージョンの gcc ライブラリが HLS コンパイル作業で使われないようデフォルトパスから適当なフォルダに待避させます。
`cd $MODELSIM_DIR`
`sudo mkdir UnUsed_GCCFiles`
`sudo mv gcc-4.* UnUsed_GCCFiles`

コマンドラインベースの HLS Compiler を動かすための環境変数の設定。
`export QUARTUS_ROOTDIR_OVERRIDE=${QUARTUS_ROOTDIR}`
`export QSYS_ROOTDIR=${QUARTUS_ROOTDIR_OVERRIDE}/sopc_builder/bin`
`export PATH=${QUARTUS_ROOTDIR_OVERRIDE}/bin:${MODELSIM_DIR}/bin:$QSYS_ROOTDIR:$PATH`
`source ${INTELFPGA_TOOLDIR}/hls/init_hls.sh`
最後に g++4.4.7 のインクルードパスを明示的に指定(i++ のコンパイルには必要)
`export CPLUS_INCLUDE_PATH=/usr/include/c++/4.4.7:/usr/include/c++/4.4.7/x86_64-linux-gnu`

以上で一通りの設定は終了です。ここまでに出てきた `export XXXX=yyyy` たちと `source .../init_hls.sh` は、コンパイルを実行する shell 毎に実行が必要なので、設定用の shell スクリプトとしてまとめておくと良いと思います。あと、update-alternatives での gcc バージョンのケアもお忘れなく。


##おためし:
実際に使ってみます。作業ディレクトリを作って、そこにツール付属の examples フォルダをコピーし、コンパイル＆実行を試します。
`mkdir ~/HLS_work && cd ~/HLS_work`
`cp -r $INTELFPGA_TOOLDIR/hls/examples . && cd examples`

各フォルダには、Makefile が用意されてますが、ターゲット FPGA が Arria10 となっているので、Lite Edition でサポートされている CycloneV に一括変更しちゃいます。
`find . -name Makefile | xargs sed -i.org 's/Arria10/CycloneV/'`

counter フォルダでコンパイル。
`cd counter`
`make test-fpga`
エラー無く "Run ./test-fpga to execute the test." と最後に表示されるはずです。

出来上がった co-sim テストベンチを実行
`./test-fpga`
__PASSED__ と表示されればOKです。これは、CPU で実行した結果と、ModelSim での RTL simulation から得られた回路出力が一致したことを示しています。詳細は、counter.cpp のメイン処理を見ると分かります。

さらに、RTL simulation の詳細結果波形を見たい場合は、make の引数に "HLS_CXX_FLAGS=-ghdl" を追加し(i++ コマンドのオプションに -ghdl を追加するのと等価)、テストベンチを実行し直します。
`make HLS_CXX_FLAGS=-ghdl test-fpga`
`./test-fpga`
__PASSED__ 
すると、test-fpga.prg/verification/vsim.wlf というファイルが出て来るので vsim で見えます。
`vsim test-fpga.prg/verification/vsim.wlf`
(Wave ウインドウを開いて、見たい信号を Objects ウインドウから D&D します）
![Screenshot_modelsim.png](https://qiita-image-store.s3.amazonaws.com/0/175992/61b1bc2f-d3f1-52c6-561e-17c22eb302b8.png)

他のサンプルコードも同様に確認できます。ただし、画像処理系のサンプル image_downsample, YUV2RGB 等は co-sim では結構時間がかかる(無償版の ModelSim は sim 速度が遅い...) ので、co-sim の際は、入力データサイズを小さくしておくのが良い気がします。

##まとめ
ということで、Intel HLS Compiler のウリである co-simlation も含め、無料の環境が Ubuntu 16.04 で動くことが確認できました。より新しい Ubuntu バージョンでも同様に動くと思います。また、HLS (Quartus) は Lite Edition を使いましたが、同様に、Standard, Pro Edition でも動くはずです。

以上でございます。