PYNQしてみる。動きました!
目次
PYNQ-Z1ボードなのでpythonからPL部を動作させたい
pythonからPL部のロジックを動かす事が目的ですが、ただ動かすだけではなく、DDRメモリをPL<->PS間で共有メモリとして使えるようになることが最終目標です。
前回記事で動作しないと悩んでましたが、AXIのバス幅を32bitから64bit幅とすることで動作しました。
前回記事↓
spend-carefree.hatenablog.com
AXIバス幅を64bitへ改造する
前回記事で、sampleで使われているDMAと今回作成したDMAの動作の違いは以下の2点であると書きました。
- バス幅が32bitである
- AXI Streamではなくバースト転送32byteの普通のAXI転送である
1.側を変更してトライです。sampleで使われているAXIのバス幅と同じにして64bitにして再設計しました。
修正点は以下の通りです。
- AxSIZEを4byte→8byteにするため、3'b010→3'b011へ修正
- WDATA,RDATAを64bitへ。本信号に繋がる信号をすべて64bit化
- AxADDRの生成部をトランザクションのたびに+0x20していたのを+0x40へ変更
- transaction数を数えるカウンタのreg名をcnt32→cnt64
- 転送終了条件を(cnt32==size[23:5])→(cnt64==size[23:6])とLSBを見ないように修正(バースト単位が32byte→64byteと倍化したので)
ソフトウェア面(Pythonコード)の変更は不要です。
修正したRTLは以下からダウンロードできます。
- DMA本体
https://drive.google.com/file/d/1DQAhD0ZNwG3PW8Mic23b8pt18zvgPyXu/view?usp=sharing
- vivadoから読み込むためのラッパー回路
https://drive.google.com/file/d/1KueoX3HntIu8GhKW6FFT49CnrgyuOKVI/view?usp=sharing
Pythonから動かしてみる
vivadoを起動し、RTLを更新します。Block diagramからZYNQをダブルクリックしてHP0ポートのバス幅を64bitへ変更します。
Validate design → Generate Bitstream します。
PYNQボードを動かし、sambaマウントして、先ほど作成した「axi_copy.bit」、「axi_copy.hwh」の2ファイルを更新します。
同じPythonコードを動作させます。
なんということでしょう!今回は不一致Errが出ません。
ILAでAXI信号を観測する
一応、正常状態になったかを確認します。
ILAの波形を見ると分かるように普通に動いてます。
考察
32bitがダメというのは考えづらいので、やはり自分の何かが悪いのだろうと思います。直接的な原因は64bitではない気がしてて、
一番怪しいのはAxCACHEだと思います。現設定は4'b0011です。
AxCACHE[1]はアップサイズ許可なので内部が64bitで構成されてても、"H"設定にしていればバス幅変換されるので特に問題はないはずです。
AxCACHE[0]は"H"にしてるのでbufferableになって問題ない気がします。
後はAxCACHE[3:2]の設定ぐらいしか思いつかず、とりあえずAxCACHE=4'b1111で動作させましたが状況は変わらずでした。
色々サイトを探したら、以下の様な記事が見つかりましたがACPポートのお話のようです。
Zynq の ACP を使う時の AxCACHE 信号とAxUSER 信号の値 - Qiita
原因、つかめずです。とりあえず64bitで作ればよいということで追及はこの辺りでやめにします。
以上です。
参考にしたドキュメントやweb