”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 ポートに接続されている。
ここで、Zynq Processing System7 は ACP ポートを活かしてあるが、Tie off AxUSERにはチェックを入れていない。
各 DMA する IP は Enable USER ports にチェックを入れて、width を 1 にしてある。
CACHE value は "1111"にしてある。
USER value は 0x00000001 にしてある。
これで、このアプリケーション・ソフトウェアを走らせた。
// 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 個の結果が正しくない。
この結果は
”Zynq のベアメタル・アプリケーションによるキャッシュの操作2(ACPポート)”と同じだ。
さて、ここからすべての DMA IP の Enable USER ports のチェックボックスのチェックを外した。
これでアプリケーション・ソフトウェアを走らせたところ、同じ結果だった。
Zynq Processing System7 は ACP ポートを活かして、Tie off AxUSERにもチェックを入れた。
すると、アプリケーション・ソフトウェアを走らせたところ、今度はすべての結果が正しい。
もしかして、DMA IP の AxUSER が Zynq Processing System7 まで回っていないのか?
Zynq Processing System7 は ACP ポートを活かしてあるが、Tie off AxUSERにはチェックを入れていない。しかも、各 DMA IP の Enable USER ports にチェックを入れた状態に戻して、各 AXI ポートを展開してみた。
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 ビットに変更した。
ポートを見ると、Vivado HLS IP と接続された AXI Interconnect の AXI インターフェース・ボートにも AxUSER のポートが確認できた。
これでアプリケーション・ソフトウェアを走らせたところ、今までと同様に最後の 3 個が誤っている。
最後に同じ設定で Vivado HLS IP の AXI4 Master 用の AXI Interconnect を AXI SmartConnect に変更した。
SmartConnect の Vivado HLS IP と接続された AXI ポートを見ると AxUSER 信号が存在する。 Zynq Processing System7 との対向 AXI ポートにも AxUSER が存在する。
これでアプリケーション・ソフトウェアを走らせたところ、すべての結果が正しくなった。
AXI Interconnect は AxUSER を伝搬しないが、AXI SmartConnect だったら問題なく伝搬するのかな?
- 2021年04月29日 20:40 |
- Zynq
-
| トラックバック:0
-
| コメント:0