FC2カウンター FPGAの部屋 Vivado HLS で 2 つの引数から DMA Read する AXI4 Master モジュールを作る4
FC2ブログ

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

FPGAの部屋

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

Vivado HLS で 2 つの引数から DMA Read する AXI4 Master モジュールを作る4

Vivado HLS で 2 つの引数から DMA Read する AXI4 Master モジュールを作る3”の続き。

前回は、AXI4 インターフェースが 3 個あるのはもったいないので、1 個のAXI4 インターフェースでループで性能を向上させたい。ということで、x と y を構造体で表現したのだが、性能的には、x と y を個別に実装したときと同様の性能だった。今回は、もっと成功向上を図ろうと思う。

前回の sum_of_squares.cpp で引数の構造体を 1 回で読んできたいということで、構造体を = でコピーしようと思い、以下のコードを作成した。

#include <stdint.h>

typedef struct xy_struct{
    int8_t x;
    int8_t y;
} xy_st;

int sum_of_squares(volatile xy_st *xy, volatile int32_t *result){
#pragma HLS DATA_PACK variable=xy
#pragma HLS INTERFACE m_axi depth=10 port=xy offset=slave
#pragma HLS INTERFACE s_axilite port=return
#pragma HLS INTERFACE m_axi depth=10 port=result offset=slave

    for(int i=0; i<10; i++){
#pragma HLS PIPELINE II=1
        xy_st xyt;
        xyt = xy[i];

        result[i] = xyt.x * xyt.x + xyt.y * xyt.y;
    }

    return(0);
}


C コードを合成したのだが、エラーになってしまった。
sum_of_squares_24_190821.png

エラー内容を示す。

ERROR: [HLS 200-70] Compilation errors found: In file included from sum_of_squares/sum_of_squares.cpp:1:
sum_of_squares/sum_of_squares.cpp:17:7: error: no viable overloaded '='
  xyt = xy[i];
  ~~~ ^ ~~~~~
sum_of_squares/sum_of_squares.cpp:3:16: note: candidate function (the implicit copy assignment operator) not viable: 1st argument ('volatile xy_st' (aka 'volatile xy_struct')) would lose volatile qualifier
typedef struct xy_struct{
               ^


構造体自体をコピーできないようだ。それではということで、volatile xy_st *xy を union にしてみたが、union は関数の引数にできないという仕様だそうだ。残念。。。

とりあえず、構造体のメンバことにコピーしてみよう。
sum_of_squares.cpp を示す。

#include <stdint.h>

typedef struct xy_struct{
    int8_t x;
    int8_t y;
} xy_st;

int sum_of_squares(volatile xy_st *xy, volatile int32_t *result){
#pragma HLS DATA_PACK variable=xy
#pragma HLS INTERFACE m_axi depth=10 port=xy offset=slave
#pragma HLS INTERFACE s_axilite port=return
#pragma HLS INTERFACE m_axi depth=10 port=result offset=slave

    for(int i=0; i<10; i++){
#pragma HLS PIPELINE II=1
        xy_st xyt;
        xyt.x = xy[i].x; xyt.y = xy[i].y;

        result[i] = xyt.x * xyt.x + xyt.y * xyt.y;
    }

    return(0);
}


C コードの合成を行った。
sum_of_squares_25_190821.png

やはり、 for 文を実行するのに 2 クロックかかっている。

C/RTL 協調シミュレーションを行った。
sum_of_squares_26_190821.png

C/RTL 協調シミュレーションの波形を示す。
sum_of_squares_27_190821.png

やはり、Read トランザクションが 20 個あるよね。。。
構造体を使った場合はチューニングがうまく行かなかった。
  1. 2019年08月23日 04:00 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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