Intel PACでstreaming_dma_afuを試してみる

Intel PACの開発環境 inteldevstack に同梱されているサンプルのstreaming_dma_afuを試してみました。このサンプルは、

のように、PAC上のロジックに対してストリームで入出力するサンプルです(画像はサンプルのREADME.txtより・クリックで拡大)。

合成

合成は、以下の手順です

$ cd ${OPAE_PLATFORM_ROOT}/hw/samples/streaming_dma_afu
$ afu_synth_setup --source hw/rtl/filelist.txt build_synth
$ ${OPAE_PLATFORM_ROOT}/bin/run.sh

これで、streaming_dma_afu.gbs ができあがります。実機で動かすには、PACSignが必要なので

$ PACSign PR -t UPDATE -H openssl_manager \
             -i streaming_dma_afu.gbs \
             -o streaming_dma_afu_unsigned.gbs

とします。できあがったら fpgaconf でFPGAをコンフィギュレーション。

$ fpgaconf streaming_dma_afu_unsigned.gbs

動作確認

ソフトウェア側をコンパイルして動作を確認します。

$ cd ../sw
$ make

できあがった fpga_dma_st_test を実行して動作が確認できます。

$ ./fpga_dma_st_test -l on -s 1024000 -p 102400 -t fixed
Memory to Stream BW = 2805 MBps, Stream to Memory BW = 3572 MBps

fpga_dma_st_testをオプションなしで実行すると、設定可能なオプションを確認することができきます。

デザインを眺めてみる

合成した作業ディレクトリ中にある .qpf ファイルをQuartusで開くと、デザインを眺めることができます(画像はクリックで拡大)。

dcp_top→fpga_top→inst_green_bs→ccip_std_afu→afu_instとたどると、Platform Designerで作られたthe_streaming_dma_test_systemという名前のstreaming_dma_test_systemモジュールのインスタンスが見つかります。

次のスクリーンショットは、ダブルクリックしてPlatform Designerで開いたところです。

Pattern checkerはm2s_custom_pattern_checker、s2m_custom_pattern_checherという名前の、それぞれcustom_pattern_checkerとcustom_pattern_generatorモジュールのインスタンスです。

Platform DesignのSystem Viewを観察してみると、m2s_dma_bbb/s2m_dma_bbbというモジュールを介して、データ供給・出力されることが確認できます。

なお、custom_pattern_generatorのカーネルは

${OPAE_PLATFORM_ROOT}hw/samples/streaming_dma_afu/hw/rtl/TEST_streaming_dma/A10/ip/streaming_dma_test_system/s2m_custom_pattern_generator/custom_pattern_generator_20/synth/mtm_custom_pattern_generator.v

に、custom_pattern_checkerのカーネルは、

${OPAE_PLATFORM_ROOT}hw/samples/streaming_dma_afu/hw/rtl/TEST_streaming_dma/A10/ip/streaming_dma_test_system/m2s_custom_pattern_checker/custom_pattern_checker_20/synth/mtm_custom_pattern_checker.v

に、それぞれあります。

GPU拡張ボックスでAlveo U50を使ってみる

PCIeタイプのFPGAを使おうと思うとどうしてもシステムがおおきくなりがちです.ちょっと持ち運んで使いたい場合を想定してGPU拡張ボックスに接続してみました.

フルレングス・フルハイトのGPUも入るボックスなだけあって,Alveo U50は余裕で入ります.なんか,上も結構あいてるから少し前のFPGA評価ボードを入れてもよいかも.

Alveo U50の場合,PCIe x16でデスクトップPCに接続した場合と比べて,転送性能が1/8程度しか出ないものの,とりあえず認識して使えることが確認できました.

続きを読む

Alveo U50で100GbEを使ってみる

XilinxのFPGAボード Alveo U50には,100GbEのポートが用意されています.内蔵されている100GbEコアを使うと,結構簡単にでデータのやりとりができます.

というわけで,とりあえず,Alveo U50の100GbEを使ってみた手順の紹介です.

これは,およそ9000バイトのデータが233サイクル@322MHz(おそらく)で受信されてる様子.

関連情報

続きを読む

Alveo U50のセットアップをする

HBMを搭載したAlveo U50をセットアップしてみました.セットアップ対象は,x86_64の普通のパソコンです.スペックは,

  • CPU: Intel(R) Core(TM) i5-8400 CPU @ 2.80GHz
  • メモリ: MemTotal: 64GB  DDR4 2400 MT/s

OSはUbuntuで18.04で,詳細は次の通り.

$ uname -a
Linux dev-8800 4.15.0-74-generic #84-Ubuntu SMP Thu Dec 19 08:06:28 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
$ cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.3 LTS"

Vitisの正式サポートはUbuntu 18.04.2までなのですが,とりあえず動作は確認できました.
重要なのは,libjson-glibとunzipのインストールです.

続きを読む

sbtでSynthesijer.Scala開発を始める

Synthesijer.Scalaは,Synthesijer内のHDLビルディングブロックをScalaを使って組み立てるライブラリです.ChiselやSpinalHDLほど細かくはいじれませんが,その分,気軽にステートマシンベースのハードウェアを設計できる…と思っています.VeriloggenのSeqとThread.Streamの間くらいかな?どうかな?

以前,シンプルなSynthesijer.Scalaの始め方(1)シンプルなSynthesijer.Scalaの始め方(2)でも簡単に導入方法を書いたのですが,今回はもっと簡単に,sbtのマネージ依存性を使った開発手法を紹介します.

続きを読む

Intel PACのAFUを開発する その2

hello_afuより少し複雑なサンプルとしてDMAを使ったサンプルに手をいれてみることにします.DMAを使ったサンプルはユーザロジックがQsysを使ってデザインされています.そこで,今回はQsys上に新しいコンポーネントを追加する開発フローを試してみます.

続きを読む

Intel PACのAFUを開発する その1

Intel PACでは,PCIeやオンボード上のメモリなどへのアクセスがBlue bitとして提供されていて開発者はGreen bitのみの設計に注力して,アクセラレータであるAFU(Application Function Unit)を開発できるようになっています.とっても便利なのですが,その反面,想定される開発フローに乗っかれるまでは,何をどうしたものかという状態に陥ってしまいます.

まずは,hello_afuにレジスタを追加することで,独自回路をPACで動かすまでの手法を確認します.なお,本来の開発ではシミュレーションを有効に活用すべきですが,ここではシミュレータは使いません.

続きを読む