FC2カウンター FPGAの部屋 Vitis HLS 2020.2 で hls::stream の ap_axiu , ap_axis データタイプが AXI4-Stream ポートでしか使用できない
fc2ブログ

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

FPGAの部屋

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

Vitis HLS 2020.2 で hls::stream の ap_axiu , ap_axis データタイプが AXI4-Stream ポートでしか使用できない

ちょっとタイトルが長くなってしまったが、今まで、Vivado HLS で複数の関数を並列に実行させるのに、 hls::stream<ap_axiu<32,1,1,1> >& axis_out と言うように、hls::stream の ap_axis, ap_axiu データイプのポートを使用してきたが、これは、Vitis HLS 2020.2 では使用できないようだ。当然ながら、外部への AXI4-Stream 入出力としては使用できるが、内部のポートとしてはエラーになってしまう。

xf_8uc3_2rgb.cpp を示す。このソースコードは、XF_8UC3 を RGB のバイト・レーンにに変換して、hls ストリームとして出力する xf_8uc3_2axis() 関数と、hls ストリームを DMA Write する関数 axis2dmaw() を xf_8uc3_2rgb() 関数で連結してある。

// xf_8uc3_2rgb.cpp
// 2021/01/12 by marsee
//

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

int xf_8uc3_2axis(ap_uint<32>* _src, int rows, int cols, hls::stream<ap_axiu<32,1,1,1> >& axis_out){
    ap_uint<32> rgb[3];
    const int rows_cols_limit = rows * cols;
    ap_axiu<32,1,1,1> pix;
    int po = 0;

    pix.last = 0;
    LOOP_x2s:for(int xy=0; xy<rows_cols_limit; xy++){
#pragma HLS PIPELINE II=1
#pragma HLS LOOP_TRIPCOUNT avg=480000 max=480000 min=480000
        switch(xy%4){
        case 0 :
            rgb[0] = _src[po++];
            pix.data = (rgb[0] & 0xffffff) + 0xff000000;
            if(xy == 0)
                pix.user = 1;
            else
                pix.user = 0;
            axis_out << pix;
            break;
        case 1 :
            rgb[1] = _src[po++];
            pix.data = ((rgb[1] & 0xffff)<<8) + ((rgb[0] & 0xff000000)>>24) + 0xff000000;
            axis_out << pix;
            break;
        case 2 :
            rgb[2] = _src[po++];
            pix.data = ((rgb[2] & 0xff)<<16) + ((rgb[1] & 0xffff0000)>>16) + 0xff000000;
            axis_out << pix;
            break;
        default: // 3
            pix.data = ((rgb[2] & 0xffffff00)>>8) + 0xff000000;
            axis_out << pix;
            break;
        }
    }
    return(0);
}

int axis2dmaw(hls::stream<ap_axiu<32,1,1,1> >& axis_in, int rows, int cols, ap_uint<32>* _dst){
    const int rows_cols_limit = rows * cols;
    ap_axiu<32,1,1,1> pix;

    LOOP_a2dw:for(int xy=0; xy<rows_cols_limit; xy++){
#pragma HLS PIPELINE II=1
#pragma HLS LOOP_TRIPCOUNT avg=480000 max=480000 min=480000
        axis_in >> pix;
        _dst[xy] = pix.data;
    }
    return(0);
}

int xf_8uc3_2rgb(ap_uint<32>* _src, int rows, int cols, ap_uint<32>* _dst){
#pragma HLS DATAFLOW
#pragma HLS INTERFACE m_axi depth=480000 port=_dst offset=slave
#pragma HLS INTERFACE s_axilite port=cols
#pragma HLS INTERFACE s_axilite port=rows
#pragma HLS INTERFACE s_axilite port=_src
#pragma HLS INTERFACE m_axi depth=4800000 port=_src offset=slave
#pragma HLS INTERFACE s_axilite port=return

    hls::stream<ap_axiu<32,1,1,1> > axis;

    xf_8uc3_2axis(_src, rows, cols, axis);
    axis2dmaw(axis, rows, cols, _dst);

    return(0);
}


Vitis HLS 2020.2 で xf_8uc3_2rgb プロジェクトを作成して、ソースコードとして xf_8uc3_2rgb.cpp を登録して、C コードの合成を行うとエラーが発生した。
axim_medianblur_10_210113.png

エラー内容を示す。

ERROR: [HLS 214-208] The ap_axis|ap_axiu|qdma_axis|hls::axis data types must only be used for AXI-Stream ports in the interface. 'axis_out' is not an AXI-Stream and/or is not a port in the interface (xf_8uc3_2rgb/xf_8uc3_2rgb.cpp:9:0)
ERROR: [HLS 214-208] The ap_axis|ap_axiu|qdma_axis|hls::axis data types must only be used for AXI-Stream ports in the interface. 'axis_in' is not an AXI-Stream and/or is not a port in the interface (xf_8uc3_2rgb/xf_8uc3_2rgb.cpp:48:0)



Vivado HLS 2019.2 で xf_8uc3_2rgb プロジェクトを作成して、同じソースコードの C コードの合成をしたところ、問題なく合成できた。
axim_medianblur_11_210113.png

やはり、Vitis HLS 2020.2 では、関数間の内部のポートとしては、 hls::stream<ap_axiu<32,1,1,1> > が使えなくなってしまったようだ。

それでは、Vitis HLS 2020.1 はどうなんだろう?ということで、同様にやってみたが、 C コードの合成は成功した。
axim_medianblur_12_210113.png

ということで、 hls::stream<ap_axiu<32,1,1,1> > が関数内部のポートとして使えなくなったのは、 Vitis HLS 2020.2 からのようだ。
  1. 2021年01月13日 04:13 |
  2. Vitis HLS
  3. | トラックバック:0
  4. | コメント:2

コメント

Vitis HLS 2020.2 で hls::stream の ap_axiu , ap_axis データタイプが AXI4-Stream ポートでしか使用できない

大阪工業大学の中西知嘉子と申します.いつも参考にさせていただいてます.
タイトルの件について教えてください.
vitisHLS2021.1(windows)を使っています.私の環境で,DATAFLOWプラグマをつけるとエラーが発生します.
この記事の後にも関数にhls::stream を使っているものがあるようです.思い違いでしょうか?
どうやって回避するのでしょうか.
DATAFLOWをうまく使うことができません.何かヒントをいただけるとありがたいです.
  1. 2021/08/17(火) 18:00:24 |
  2. URL |
  3. chikako nakanishi #-
  4. [ 編集 ]

答えは次の記事にあります。
https://marsee101.blog.fc2.com/blog-entry-5119.html

hls::stream<ap_uint<32> >& axis_in
  1. 2021/08/17(火) 21:15:44 |
  2. URL |
  3. marsee #f1oWVgn2
  4. [ 編集 ]

コメントの投稿


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

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