AXI4、AXI4-Lite、AXI4-Streamチートシート
チャネル、ハンドシェイクの規則、信号表、バースト種別、応答コード、そして初めてのAXI設計で必ず出会うバグを1ページにまとめます。
このページは、AXIインターフェースを手で書く、またはデバッグするエンジニアのためのものです。FPGAで出会う3つの変種を扱います。メモリマップドのバースト転送のためのフルAXI4、レジスタのためのAXI4-Lite、アドレスを持たないデータのためのAXI4-Streamです。権威はArmのAMBA仕様書です。以下のバージョンは、本稿執筆時点でAMD、Altera、MicrochipデバイスのベンダーIPとSoCファブリックが前提としているものです。
たった1つの規則
すべてのチャネルはVALID/READYの組です。転送は両方がHighになっているクロックエッジで起こります。
| 規則 | 帰結 |
|---|---|
| ソースはデータがあるときにVALIDをアサートし、READYがHighと観測されるまでペイロードを変えずにVALIDをHighに保たなければならない | シンクが遅いからといってVALIDを引っ込めることはできない |
| VALIDはREADYに依存してはならない | VALIDを上げる前にREADYを待つソースは、READYを上げる前にVALIDを待つシンクとデッドロックしうる |
| READYはVALIDに依存してよい | シンクはREADYをアサートする前にVALIDを待ってよいが、1サイクルの代償がある |
| READYはVALIDより先にアサートしてよく、VALIDが来る前に落としてもよい | VALIDがLowのときのHighなREADYは転送ではない |
| リセット: VALIDはリセット中とリセット後の最初のサイクルにLowでなければならない | リセット付きのフロップから駆動し、グリッチしうる組み合わせ論理から駆動しない |
チャネル
| 変種 | チャネル | 目的 |
|---|---|---|
| AXI4 | AW、W、B、AR、R | 書き込みアドレス、書き込みデータ、書き込み応答、読み出しアドレス、読み出しデータ。読み出しと書き込みは独立で、同時に未完了のまま進められる。 |
| AXI4-Lite | 同じ5つ | トランザクションごとに1転送、バーストなし、IDなし、データは32ビットか64ビットのみ |
| AXI4-Stream | T | チャネルは1つ。アドレスなし。データはソース(マスター)からシンク(スレーブ)へ流れる。 |
チャネルの接頭辞はすべての信号に付き(awvalid、wdata、bresp、rlast、tvalid)、ベンダーIPはさらにs_axi_のようなインターフェース接頭辞を加えます。
AXI4の信号
幅の欄では、Wはデータ幅(ビット)、Aはアドレス幅を表します。
| チャネル | 信号 | 幅 | 意味 |
|---|---|---|---|
| AW | awaddr | A | バーストの開始アドレス(バイトアドレス) |
| AW | awlen | 8 | ビート数マイナス1(AXI4では0〜255、AXI3では0〜15) |
| AW | awsize | 3 | ビートあたりのバイト数をlog2で表す: 0 = 1バイト、2 = 4バイト、3 = 8バイト |
| AW | awburst | 2 | FIXED、INCR、WRAP(後述) |
| AW | awid | n | トランザクションID。同じIDの応答は順序通りに返る |
| AW | awprot、awcache、awlock、awqos、awregion、awuser | 3、4、1、4、4、n | 属性。大半のFPGAファブリックが尊重するのはawprot[1](セキュア)と、コヒーレンシポートのawcacheだけ |
| W | wdata | W | 書き込みデータ |
| W | wstrb | W/8 | バイトイネーブル。バイトレーンごとに1ビット |
| W | wlast | 1 | バーストの最後のビートでHigh |
| B | bresp | 2 | 書き込み応答(下表) |
| B | bid | n | awidのエコー |
| AR / R | araddr、arlen、arsize、arburst、arid | AWと同じ | 読み出しについて同じ意味 |
| R | rdata、rresp、rlast、rid | W、2、1、n | ビートごとの読み出しデータと応答 |
AXI4にはwidがありません。AXI3にはありましたが、書き込みデータのインターリーブはAXI4で削除されました。
AXI4-Lite
| 信号群 | 有無 | 備考 |
|---|---|---|
| awaddr、awprot、awvalid、awready | あり | awprotは通常0に固定する |
| wdata、wstrb、wvalid、wready | あり | レジスタへのバイト書き込みではwstrbが重要 |
| bresp、bvalid、bready | あり | |
| araddr、arprot、arvalid、arready | あり | |
| rdata、rresp、rvalid、rready | あり | |
| ID、len、size、burst、last、lock、cache、qos | なし | すべてのトランザクションは1ビート |
LiteのスレーブはAWとWをどちらの順序で受け取ることもあります。独立に取り込み、両方が揃ってからBを発行してください。
バースト種別
| awburstまたはarburst | 名前 | ビートnのアドレス | 用途 |
|---|---|---|---|
| 0b00 | FIXED | 毎ビート同じアドレス | FIFOのようなペリフェラルのレジスタ |
| 0b01 | INCR | 開始アドレス+n×ビートあたりバイト数 | 通常のメモリアクセス |
| 0b10 | WRAP | インクリメントし、バースト長(バイト)に等しい境界で折り返す。長さは2、4、8、16ビートのいずれかで、開始アドレスはビートサイズに整列していなければならない | キャッシュラインの充填 |
| 0b11 | 予約 |
バーストは4 KBのアドレス境界をまたいではなりません。INCRバーストは1〜256ビートです。ナロー転送(awsizeがバス幅より小さい)は合法ですが、大半のFPGA IPはフル幅のビートを好みます。
応答コード
| brespまたはrresp | 名前 | 意味 |
|---|---|---|
| 0b00 | OKAY | 正常終了、または排他アクセスの失敗 |
| 0b01 | EXOKAY | 排他アクセスの成功 |
| 0b10 | SLVERR | スレーブには到達したがエラーを返した(スレーブ内の不正アドレス、読み出し専用レジスタへの書き込み) |
| 0b11 | DECERR | そのアドレスにスレーブがない(インターコネクトのデコードエラー) |
ZynqやVersalのプロセッシングシステムではDECERRは通常データアボートになるため、未マップのアドレスはゴミを返すのではなくLinuxをクラッシュさせることがあります。
AXI4-Stream
| 信号 | 幅 | 必須 | 意味 |
|---|---|---|---|
| tvalid、tready | 1 | tvalidは必須、treadyは任意 | ハンドシェイク。treadyのないシンクは常にレディ。 |
| tdata | 8n | 任意 | ペイロード。整数バイト数 |
| tstrb | n | 任意 | バイトがデータ(1)か位置(0)か。FPGA IPではほとんど使われない。 |
| tkeep | n | 任意 | バイトが有効(1)かヌル(0)か。バス幅を埋めないパケット末尾に使う。 |
| tlast | 1 | 任意 | パケットの最後のビート |
| tid、tdest | n | 任意 | ストリーム識別子とルーティング先 |
| tuser | n | 任意 | サイドバンドビット。ビデオIPはフレーム開始に、Ethernet IPはエラーに使う。 |
AXI DMAなどのAMD IPは、tkeepのヌルバイトをtlastビートでのみ、レーン0から連続する形でしか許しません。サイドバンドの意味は標準化されていないので、各コアの製品ガイドを確認してください。
よくあるバグ
| バグ | 現れる症状 | 対処 |
|---|---|---|
| VALIDがREADYを待つ | そのようなブロック同士をつなぐとデッドロック、あるいは特定ベンダーのIPとしか動かない | VALIDは状態からアサートし、決してreadyから作らない |
| VALIDがHighでREADYがLowの間にペイロードが変わる | データ化け、プロトコルチェッカが検出 | ペイロードをVALIDと同じイネーブルでレジスタに保持する |
| wlastがない、または違うビートに付く | DMAがハング、インターコネクトが永遠にストール | awlenプラス1からビートを数える |
| 全Wビートを受理する前にB応答を返す | インターコネクトが順序を入れ替え、データが失われる | wlastのビートの後にだけBを発行する |
| 4 KB境界をまたぐ | 1つのスレーブ直結では動くが、インターコネクト経由で失敗 | マスター側で4 KBごとにバーストを分割する |
| 読み出しデータのID順序が違う | 同じIDの読み出しが順不同で返る | IDを1つにするか、リオーダバッファを使う |
| READYを通る組み合わせループ | タイミングが失敗、シミュレータが発振 | READYをレジスタ化するか、スキッドバッファでループを切る |
| トランザクション途中のリセット | 未完了数が狂ってスレーブが固まる | 両側を同時にリセットし、解除後1サイクルはVALIDをLowに保つ |
| ストリーム幅の不一致 | 幅変換器がtkeepビットを黙って落とす | tkeepは全段で付けるか、まったく付けないかのどちらかにする |
| ストールしうるシンクでtreadyが未接続 | データ損失 | treadyを接続するか、バックプレッシャー付きのFIFOを追加する |
出典
- AMBA AXI Protocol Specification (IHI 0022), Arm Developer
- AMBA AXI-Stream Protocol Specification (IHI 0051), Arm Developer
- UG1037: Vivado Design Suite AXI Reference Guide
- 当サイトの関連ページ: /reference/reset-and-cdc-patterns/ と /topics/soc-fpgas/