最も一般的に使われているAXI4バスは、AXI4-Streamです。これは、3種類ある中で最も実装が簡単なAXIバスです。
本記事では、AXI4-Streamについて解説していきます。
AXI4-Stream概要
AXI4-Streamはストリームマスターからストリームスレーブにストリーム(連続的な)データを転送するために使用します。ストリーミングプロトコルのため、データストリームに関連したアドレス指定はありません。そのため、データは連続的なデータであることが想定されます。音声や画像、AD変換値などのデータ転送によく使われます。
AXI4-Streamはマスターがデータが有効であることを示す信号Valid、スレーブが受信準備が完了していることを示すReady信号の2つで、実際のデータ信号であるDataをやり取りするという単純な制御です。
AXI4-Streamプロトコルでは、フレームのやり取りも可能で、そのフレームの終端であることを示す信号を使用して、データをひとまとまりとしてのフレームとして扱うことが可能です。

実際には下図のような、信号名で定義されています。データが有効であることを示すTVALID, データ信号を表すTDATA, スレーブが受信準備完了を示すTREADY信号を表します。

AXI4-Stream インタフェース
AMBAで規定されている、信号リストは以下です。AMBAで示されているものの日本語訳を乗せています。
信号名 | ソース | 説明 |
ACLK | Clock Source | グローバルクロック信号 すべての信号はACLKの立ち上がりでサンプリングされる |
ARESETn | Reset Source | グローバルリセット信号 ARESETnはアクティブLOW |
TVALID | Master | 転送は、TVALIDとTREADYの両方がアサートされたときに行われる | Masterからの転送が有効であることを示す
TREADY | Slave | TREADYは、Slaveが現在のクロックサイクルで転送を受信可能状態を示す |
TDATA | Master | ペイロードデータの幅は、整数バイト数 | TDATAは、データを提供するために使用される主要なペイロード
TSTRB | Master | TSTRB は、TDATA の関連バイトの内容がデータバイトとして処理されるか、位置バイトとして処理されるかを示すバイト修飾子である |
TKEEP | Master | TKEEP バイト修飾子がアサート解除された関連バイトは null バイトであり、データ ストリームから削除できる | TKEEP は、TDATA の関連バイトの内容がデータ ストリームの一部として処理されるかどうかを示すバイト修飾子
TLAST | Master | TLAST はパケットの境界を示す |
TID | Master | TID は、異なるデータ ストリームを示すデータ ストリーム識別子 |
TDEST | Master | TDEST はデータ ストリームのルーティング情報を提供する |
TUSER | Master | TUSER は、データ ストリームと一緒に送信できるユーザー定義のサイドバンド情報 |
分かりづらいものもあるかもしれませんので、もう少し噛み砕いたものが下記のリストです。
信号名 | ソース | 役割 |
ACLK | Clock Source | クロック信号 |
ARESETn | Reset Source | リセット信号 |
TVALID | Master | TDATAが有効であることを示す |
TREADY | Slave | Slaveが受信可能であることを示す |
TDATA | Master | 転送されるデータそのもの |
TSTRB | Master | 各バイトの有効かを示す |
TKEEP | Master | 有効なバイトを示す |
TLAST | Master | パケットの終了を示す |
TID | Master | パケットの識別子(ID)を示す |
TDEST | Master | データの送信先 |
TUSER | Master | ユーザ定義 |
この中で、TID, TDEST, TUSERはほとんどのアプリケーションで使われることがないので、省略することができます。
TSTRBとTKEEP
TSTRBとTKEEPは、データワードのどのバイトが有効であるかをスレーブに知らせるための信号です。
どちらもバイトの有効性を示すことで使われますが、用途が異なります。
信号 | 役割 | ビット幅 | ビット設定 | 用途 |
TSTRB | 転送するバイトが有効かどうかを示す | 通常、データバスのビット幅に依存し、 データバスが32ビット(4バイト)の場合、TKEEPは4ビット | 1: 有効 0: 無効 | パケットの最後のデータ転送(EoP: End of Packet)で、部分的なバイトのみが有効な場合に使用 |
TKEEP | メモリマップドインタフェース(AXI4など)において、 どのバイトが実際に書き込まれるべきかを示す | データバスのビット幅に依存 | 1: 有効で書き込み対象 0: 無効 | 部分的なバイトアクセスや、特定のバイトのみを書き込みたい場合に使用 |
例:TKEEP
データバスが32ビット(4バイト)の場合、TKEEP = 4'b1100
のとき、上位2バイトが有効で下位2バイトが無効となります。
例:TSTRB
データバスが32ビット(4バイト)の場合、TSTRB = 4'b0011
のとき、下位2バイトのみが書き込み対象となります。
ハンドシェーク
マスター・スレーブ間がどのように信号のやり取りを行うのかを見ていきます。
このやりとりは、マスターから送信するValid, スレーブから送信するReadyでハンドシェークすることで実現します。このハンドシェークは3つの種類があり、それぞれを順に見ていきます。
Valid/Ready 同時
マスター, スレーブの両方が同時にデータ転送の準備をできる場合を考えます。TVALIDは、マスターが転送する有効なデータがあることを示す信号で、TREADYは、スレーブがデータを受信する準備ができていることを示す信号です。
Valid/Ready 同時型のハンドシェークでは、マスターがTVALIDをアサートして、有効なデータをバスに転送し、同時にスレーブがTREADYをアサートします。TVALIDとTREADYの両方がアサートされている限り、データはバス上で転送されています。

Valid先行
2つ目は、スレーブのデータ受信準備ができる前に、マスターの準備が整う場合です。これをValid先行型と呼び、この場合、マスターはデータ転送と同時にTVALIDをアサートします。しかし、このタイミングではまだスレーブの準備はできていないため、データは保持され、スレーブがTREADYをアサートしたタイミングでデータ転送が開始されます。
スレーブは必要に応じて、TREADYをディアサートできます。スレーブが受信可能な状態でない限り、マスターは次のデータを送ることはできません。

Ready先行
3つ目は、マスターがデータ送信の準備が整う前に、スレーブの準備が整うような場合、Ready信号が先にアサートされるため、Ready先行型と呼びます。
この場合、スレーブ側は、データ受信可能である限り、TREADYをアサートし続けます。スレーブが受信可能でない場合、TREADYをディアサートします。

ハンドシェーク実装の注意点
ハンドシェークを実装する場合、2つのことに注意します。
- スレーブがREADYをアサートしているかどうかに関わらず、マスターはデータが有効である場合はTVALIDをアサートする
- スレーブはマスターがTVALIDをアサートしているかどうかに関わらず、データ受信可能なら、TREADYをアサートする
これを念頭に置いて、マスター側、スレーブ側は実装を進める必要があります。
例えば、スレーブはマスターがTVALIDがアサートするまでは待機、マスターもスレーブがTREADYをアサートまで待機するような実装をしていたとします。この場合、どちらも待ち状態になり、バスが止まってしまいます。
したがって、マスターもスレーブもデータ送信・受信の準備が可能なら、TVALID, TREADYをアサートするという設計をすることです。通信側を待つような処理は入れる必要はないということです。
TLAST
TLASTは、TDATAによって、送信されるデータのフレームあるいはパケットの最後であることを示します。
これは、例えば4バイトのデータをひとまとまりとして扱いたいときに使用します。4バイト目を送信するときに、TLASTをアサートし、最後のデータであることを示します。

まとめ
本記事では、AXI4バスの中の1つの、AXI4-Streamバスについて解説しました。
このバスは主に音声・画像、AD変換値などのストリーミングデータに使用します。
マスター・スレーブ側で送受信可能であることを示す、TREADY, TVALIDを使いハンドシェークしデータ通信を行います。
コメント