かずの不定期便ブログ

備忘録代わりに書きます

PYNQしてみる。動きました!

目次

PYNQ-Z1ボードなのでpythonからPL部を動作させたい

 pythonからPL部のロジックを動かす事が目的ですが、ただ動かすだけではなく、DDRメモリをPL<->PS間で共有メモリとして使えるようになることが最終目標です。
 前回記事で動作しないと悩んでましたが、AXIのバス幅を32bitから64bit幅とすることで動作しました。
前回記事↓
spend-carefree.hatenablog.com

AXIバス幅を64bitへ改造する

 前回記事で、sampleで使われているDMAと今回作成したDMAの動作の違いは以下の2点であると書きました。

  1. バス幅が32bitである
  2. AXI Streamではなくバースト転送32byteの普通のAXI転送である

1.側を変更してトライです。sampleで使われているAXIのバス幅と同じにして64bitにして再設計しました。
 修正点は以下の通りです。

  1. AxSIZEを4byte→8byteにするため、3'b010→3'b011へ修正
  2. WDATA,RDATAを64bitへ。本信号に繋がる信号をすべて64bit化
  3. AxADDRの生成部をトランザクションのたびに+0x20していたのを+0x40へ変更
  4. transaction数を数えるカウンタのreg名をcnt32→cnt64
  5. 転送終了条件を(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信号を観測する

 一応、正常状態になったかを確認します。

f:id:spend-carefree:20201027233127p:plain
AXIバス幅を64bit化してPythonから起動

 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