FC2カウンター FPGAの部屋 同じ Vivado HLS IP を複数個インスタンスした場合、Vivado 2018.3 でハードウェアをエクスポートしてSDKを立ち上げたときにその他のVivado HLS のIPのドライバがSDKのハードウェア・プラットフォームに入らない
FC2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

同じ Vivado HLS IP を複数個インスタンスした場合、Vivado 2018.3 でハードウェアをエクスポートしてSDKを立ち上げたときにその他のVivado HLS のIPのドライバがSDKのハードウェア・プラットフォームに入らない

Vivado 2018.3 でハードウェアをエクスポートしてSDKを立ち上げたときに、同じ Vivado HLS IP を複数個インスタンスした場合、その他のVivado HLS のIPのドライバが入らないという問題があったので、ブログに書いておく。多分バグじゃないのかな?

Vivado 2018.3 の sums_ex4 プロジェクトを示す。このプロジェクトはZybo Z7-10 用のプロジェクトだ。
SDK_bug_1_190914.png

sums_bd ブロックデザインを示す。
SDK_bug_2_190914.png

ブロックデザインを見ると DMA2axis8 IP が 2 つあるのが分かる。これらは、DDRメモリからDMA Read を行って、s_squares_axis IP にAIX4-Stream でデータを供給し、平方数の和を取って、axis2DMA IP にAIX4-Stream でデータを送る。axis2DMA IP はAXI4-Stream で送られてきたデータをDMA Write するというような回路になっている。
s_squares_axis IP のソースコードは”2つのAXI4 Stream 入力データを演算してAXI4 Stream 出力1”だ。
DMA2axis8.cpp を貼っておく。

// DMA2axis8.cpp (2019/09/10 by marsee)

#include <ap_int.h>
#include <hls_stream.h>
#include <ap_axi_sdata.h>

int DMA2axis8(volatile ap_int<8> *in, hls::stream<ap_axis<8,1,1,1> >& outs){
#pragma HLS INTERFACE s_axilite port=return
#pragma HLS INTERFACE axis register both port=outs
#pragma HLS INTERFACE m_axi depth=10 port=in offset=slave
    ap_axis<8,1,1,1> out_val;

    for(int i=0; i<10; i++){
#pragma HLS PIPELINE II=1
        out_val.data = in[i];
        if(i == 0)
            out_val.user = 1;
        else
            out_val.user = 0;
        if(i==9)
            out_val.last = 1;
        else
            out_val.last = 0;
        outs << out_val;
    }
    return(0);
}


axis2DMA.cpp を貼っておく。

// axis2DMA.cpp (2018/05/18 by marsee)

#include <ap_int.h>
#include <hls_stream.h>
#include <ap_axi_sdata.h>

int axis2DMA(hls::stream<ap_axis<32,1,1,1> >& ins, volatile ap_int<32> *out){
#pragma HLS INTERFACE s_axilite port=return
#pragma HLS INTERFACE m_axi depth=10 port=out offset=slave
#pragma HLS INTERFACE axis register both port=ins
    ap_axis<32,1,1,1> in_val;

    for(int i=0; i<10; i++){
#pragma HLS PIPELINE II=1
        ins >> in_val;
        out[i] = in_val.data;
    }
    return(0);
}


論理合成、インプリメンテーション、ビットストリームの生成を行った。レポートを示す。
SDK_bug_3_190914.png
SDK_bug_4_190914.png

ハードウェアをエクスポートしてSDKを立ち上げた。
SDK_bug_5_190914.png

axis2DMA, DMA2axis8, s_squares_axis が入っているのは見えるが、ハードウェア・プラットフォームの drivers には、DMA2axis8 しか入っていないのが分かる。これだと他のVivado HLS IP のドライバ関数が使用できなかった。

次に Vivado 2018.3 で sums_ex4_temp プロジェクトを作成した。
SDK_bug_6_190914.png

sums_bd ブロックデザインを示す。
SDK_bug_7_190914.png

DMA2axis8 を 1 個のみインスタンスして、他は Constant で代用した。
これで論理合成、インプリメンテーション、ビットストリームの生成を行った。レポートを示す。
SDK_bug_8_190914.png
SDK_bug_9_190914.png

これでハードウェアをエクスポートしてSDKを立ち上げたところ、ハードウェア・プラットフォームには、3 個のVivado HLS で作成したIP のドライバが入っている。
SDK_bug_10_190914.png

やはり、Vivado 2018.3 のブロックデザインでVivado HLS で作成したIP を複数個入れているとSDK のハードウェア・プラットフォーム上に他のVivado HLS IP のドライバがロードされないようだ。バグじゃないだろうか?

なお、Vivado HLS IP のドライバがハードウェア・プラットフォームに入っていないことの回避方法としては、”SDKにVivado HLSで作製したIPのドライバをインポートする”がある。
この方法で、local Repositories か Global Repositories にIP のフォルダを追加しておけばよい。今回は、Global Repositories にIP のフォルダを追加した。これでVivado HLS で作成した IP のドライバを使えるようになる。
  1. 2019年09月15日 04:50 |
  2. Vivado
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
https://marsee101.blog.fc2.com/tb.php/4643-67319b81
この記事にトラックバックする(FC2ブログユーザー)