FPGAの部屋 Zynq のベアメタル・アプリケーションによるキャッシュの操作3(ACPポート2)
FC2ブログ

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

FPGAの部屋

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

Zynq のベアメタル・アプリケーションによるキャッシュの操作3(ACPポート2)

”Zynq のベアメタル・アプリケーションによるキャッシュの操作2(ACPポート)”で ACP ポートのキャッシュ・コヒーレンシがうまく行ってないようだったが、今回、HDLabで開催する予定の Zynq + Vivado HLS セミナの例題を作っていて、同じ結果になってしまった。そこで、 ACP ポートを使用して、キャッシュ・コヒーレンシを取れる DMA を使用するために調査した。Vivado HLS と Vivado のバージョンは 2019.2 です。

今回は、平方数の和を出力する Vivado HLS で作成した AXI4-Stream の s_squares_axis IP を使用している。8 ビットの x 入力と 8 ビットの y 入力を 2 乗して加算する。 8 ビットの x 入力と y 入力に 1 個ずつ DMA2axis8 IP が接続されている。また s_squares_axis IP の出力は32 ビットの result を受けて axis2DMA する IP も接続されている。各 DMA は AXI4 Master で ACP ポートに接続されている。
ACP_cache_1_210429.png

ここで、Zynq Processing System7 は ACP ポートを活かしてあるが、Tie off AxUSERにはチェックを入れていない。
ACP_cache_2_210429.png

各 DMA する IP は Enable USER ports にチェックを入れて、width を 1 にしてある。
CACHE value は "1111"にしてある。
USER value は 0x00000001 にしてある。
ACP_cache_3_210429.png

これで、このアプリケーション・ソフトウェアを走らせた。

// sums_ex6.c 2019/09/14 by marsee

#include <stdio.h>
#include <stdint.h>
#include "xaxis2dma.h"
#include "xdma2axis8.h"
#include "xs_squares_axis.h"

volatile uint8_t data0[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
volatile uint8_t data1[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
volatile uint32_t result[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

int main(){
    XDma2axis8 xdma2axis8_ap0, xdma2axis8_ap1;
    XAxis2dma xaxis2dma_ap;
    XS_squares_axis XS_squares_axis_ap;

    XDma2axis8_Initialize(&xdma2axis8_ap0, 0);
    XDma2axis8_Initialize(&xdma2axis8_ap1, 1);
    XAxis2dma_Initialize(&xaxis2dma_ap, 0);
    XS_squares_axis_Initialize(&XS_squares_axis_ap, 0);

    XDma2axis8_Set_in_V(&xdma2axis8_ap0, (u32)data0);
    XDma2axis8_Set_in_V(&xdma2axis8_ap1, (u32)data1);
    XAxis2dma_Set_out_V(&xaxis2dma_ap, (u32)result);

    XAxis2dma_Start(&xaxis2dma_ap);
    XS_squares_axis_Start(&XS_squares_axis_ap);
    XDma2axis8_Start(&xdma2axis8_ap0);
    XDma2axis8_Start(&xdma2axis8_ap1);

    while(!XAxis2dma_IsDone(&xaxis2dma_ap));

    for(int i=0; i<10; i++){
        printf("data0[%d] = %d, data1[%d] = %d, result[%d] = %d\n", i, (int)data0[i], i, (int)data1[i], i, (int)result[i]);
    }

    return(0);
}


結果を示す。
最後の 3 個の結果が正しくない。
ACP_cache_4_210429.png

この結果は”Zynq のベアメタル・アプリケーションによるキャッシュの操作2(ACPポート)”と同じだ。

さて、ここからすべての DMA IP の Enable USER ports のチェックボックスのチェックを外した。
ACP_cache_5_210429.png

これでアプリケーション・ソフトウェアを走らせたところ、同じ結果だった。
ACP_cache_6_210429.png

Zynq Processing System7 は ACP ポートを活かして、Tie off AxUSERにもチェックを入れた。
ACP_cache_7_210429.png

すると、アプリケーション・ソフトウェアを走らせたところ、今度はすべての結果が正しい。
ACP_cache_8_210429.png

もしかして、DMA IP の AxUSER が Zynq Processing System7 まで回っていないのか?
Zynq Processing System7 は ACP ポートを活かしてあるが、Tie off AxUSERにはチェックを入れていない。しかも、各 DMA IP の Enable USER ports にチェックを入れた状態に戻して、各 AXI ポートを展開してみた。
ACP_cache_9_210429.png

DMA IP には AxUSER ポートがある。その対向している AXI Interconnect の AXI ポートには AxUSER がない。。。これか原因は AXI Interconnect まで AxUSER が回っていない?

ちなみに Zynq Processing System7 の AXI ポートには、 AxUSER ポートがあって、その対向の AXI Interconnect の AXI ポートにも AxUSER がある。。。

Vivado HLS で作った IP は AxUSER 無視されるか?設定があるのかな?
自分で HDL で書いて IP Packager でパッケージした IP はどうなんだろうか?

とりあえずは、Zynq Processing System7 の ACP ポートを使う場合は、Tie off AxUSERにチェックを入れて使った方が良さそうだ。

(2021/04/30:追記)
ikwzm さんに Zynq Processing System7 ポートの AxUSER 信号は 5 ビット幅なので、Vivado HLS で作成した IP の AxUSER信号も 5 ビットにしてはどうか?という提案があったので、やってみた。

Vivado HLS で作成した IP の AWUSER と ARUSER 信号を 5 ビットに変更した。
ACP_cache_10_210429.png

ポートを見ると、Vivado HLS IP と接続された AXI Interconnect の AXI インターフェース・ボートにも AxUSER のポートが確認できた。
ACP_cache_11_210429.png

これでアプリケーション・ソフトウェアを走らせたところ、今までと同様に最後の 3 個が誤っている。
ACP_cache_12_210429.png

最後に同じ設定で Vivado HLS IP の AXI4 Master 用の AXI Interconnect を AXI SmartConnect に変更した。
ACP_cache_13_210430.png

SmartConnect の Vivado HLS IP と接続された AXI ポートを見ると AxUSER 信号が存在する。 Zynq Processing System7 との対向 AXI ポートにも AxUSER が存在する。
ACP_cache_14_210430.png

これでアプリケーション・ソフトウェアを走らせたところ、すべての結果が正しくなった。
ACP_cache_15_210430.png

AXI Interconnect は AxUSER を伝搬しないが、AXI SmartConnect だったら問題なく伝搬するのかな?
  1. 2021年04月29日 20:40 |
  2. Zynq
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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