SSブログ

Avalon-MMバーストマスタのbyteenable信号 [Platform Designer]

ずいぶんと偏った項目ではあるけれども、自分自身がちょっと勘違いして覚えていた部分があったので改めてAvalon仕様書 20.1でどうなっているのかを確認してみた。

・Avalonインターフェースとは

改めて説明する必要があるかどうかはさておき、AvalonインターフェースというのはIntel FPGAのIPコアで使われるメモリバスおよびデータストリームの規格です。
これはQuartusPrimeのツール群であるPlatformDesigner(旧Qsys、もっと古くはSoPC Builder)でコンポーネント間の接続インターフェースとして定義され、この規格に則った動作をするHDLに加えてコンポーネント定義用のtclをパッケージすると、ツール上からドロップインでコンポーネントをインスタンスできるようになります。
また、その際にメモリバスであればアドレスセレクタやバス幅変換・バーストサイクル制御やアービトレーションを、データストリームであればストリーム律速やクロックドメインブリッジなど、手作業では大変面倒くさい上に検証も大変な部分を全自動で生成してくれます。

特にメモリバス制御の恩恵は大きく、従来は外部メモリ等を利用するシステムの設計はコントローラやデバイスの物理仕様が密接に関わって大変だったのですが、Avalonインターフェースを使うことで完全にメモリを抽象化して設計できるようになります。

今回はこのうちメモリバス仕様であるAvalon-MMインターフェースの部分(のさらにバースト時の挙動)に絞って説明をします。
それ以外の仔細については末尾に仕様書へのリンク貼りましたのでそちらを参照してください。


・Avalon-MM バーストライトの動作
avmm_burstwrite.png
図は5ワードバーストの書き込みの例です。いきなりプリミティブな話になりますが、先に進みます。

・0クロック目
リセット後の最初のトランザクションは必ずwriteがネゲートの状態から始めます。このときwaitrepuestの状態は未定義です。

・2クロック目
writeをアサートしてバーストライトをリクエストします。addressにはバースト先頭アドレス、burstcountにはトランザクションのライトデータ数、writedataとbyteenableには最初のデータワードをセットします。
リクエストが受理されたかどうかはwaitrequestの状態を監視します。もしwaitrequestがアサートされていた場合は、ネゲートされるまで状態を保持しなければなりません。

・5クロック目
この例ではここでwaitrequestがネゲートされ、Avalonコネクター側にバーストライトが許可されました。このタイミングでアドレスとバースト数がコネクター側に通知され、以降はリクエストしたワードの数だけwriteを繰り返すことになります。

・8クロック目
バーストトランザクション中はwriteをネゲートしてコネクター側を待たせることができます。
ただし、この状態はコネクター側のアービトレーションがストールするので、もし同じスレーブにアクセスする別のマスターがあった場合、そちらもストールしたままになります。バス仕様効率の観点からトランザクション中にマスター側からストールさせるのは極力避けるべきです。

・10クロック目
バーストライト中でもwaitrequestがアサートされた場合はネゲートまで状態を保持しなければなりません。この例では3クロック分アサートされていますが、実際には何処に幾つのwaitrequestが入るのかはわかりません。

・13クロック目
最後のデータワードがコネクター側に取り込まれるとトランザクションが終了となります。引き続いて次のバーストライトトランザクションを行う場合はwriteをアサートしたままにできます。
終了通知信号はないので、マスター側とコネクター側でデータの数がずれた場合はトランザクションがスリップしたまま進行してしまいます。大抵はバスロックになります。バスの信号でトランザクションアボートはできないため、一端バスロックしてしまった場合はリセットが必要です。

以上がバーストライトのトランザクションです。


・Avalon-MM バーストリードの動作
avmm_burstread.png
バーストリード側も5バーストリードを例とします。

・0クロック目
リセット後の最初のトランザクションは必ずreadがネゲートの状態から始めます。このときwaitrepuestの状態は未定義です。ただしreaddatavalidはネゲートの状態になります。

・2クロック目
readをアサートしてバーストリードをリクエストします。addressにはバースト先頭アドレス、burstcountにはトランザクションのリードデータ数を指定します。
byteenableはリードのみのマスターでは不要の信号です。リード・ライトマスターの場合、byteenableは全ビット1を指示しておく必要があります。この例では32bitバスを想定しているため、byteenableは4bit幅の信号となっています。
リクエストが受理されたかどうかはwaitrequestの状態を監視します。もしwaitrequestがアサートされていた場合は、ネゲートされるまで状態を保持しなければなりません。

・5クロック目
この例ではここでwaitrequestがネゲートされ、Avalonコネクター側からバーストリードが許可されました。このタイミングでアドレスとバースト数がコネクター側に通知され、マスターはreadをネゲートします。引き続いて次のバーストリードをリクエストしたい場合はreadをアサートしたままにできます。
以降はリクエストしたワードの数だけデータが送られてくることになります。

・8,9,11,12クロック目
リードデータはトランザクション開始後、任意のタイミングでコネクター側から転送されてきます。マスター側ではreaddatavalidの状態を監視して、この信号がアサートされたときのreaddataを取り込みます。
この例では2クロック空き、2ワード毎の転送となっていますが実際には読み出すスレーブの動作やバス幅により変わります。
マスター側からはデータが転送されてくるのを待たせることはできないため、バーストデータ数を受け入れることが可能な状態でトランザクションを発行しなければなりません。

・14クロック目
最後のデータが送られてくるとトランザクションは終了となります。
バーストライトと同様に終了通知信号はないので、リクエストした数と送られてきた数を数えてトランザクションの終了を判断することになります。これもバス信号からトランザクションアボートはできないため、バスロックした場合は復帰にリセットが必要です。

以上がバーストリードのトランザクションになります。
なお、バーストリードの場合はトランザクションリクエスト(read信号)とデータ転送(readdataおよびreaddatavalid)が分かれているため、全データが転送されるまえに次のリードリクエストを発行することも可能です。


・Avalon-MM 20.1でのバースト時のbyteenableの仕様

ここからはAvalon-MMのbyteenable信号の話です。
byteenable信号は8ビットを超えるバス幅での転送中に、1つ以上の任意のバイトレーンを有効にできます。byteenableの各ビットは、writedataおよびreaddataのバイトに対応しています。

byteenable信号はその名前の通りトランザクション中にデータバスのバイトレーンの有効・無効を示す信号で、ほとんどはライト動作の時に書き戻すバイトレーンを指示するために使われます。
リード時にはそのバイトレーンがを読み出すかどうかの指示に使う事もできますが、現在インテルではこのような動作は非推奨としていて、スレーブ側ではbyteenableの状態によって副次作用を起こさない(つまりバイトレーン単位での読み出し破壊のない)実装を推奨としています。

ライト時、マスター側のbyteenableのビットnはワード中のバイトnが書き込まれるかどうかを示します。
例えば32bitマスターが64bitスレーブにバイトアドレス4からバースト書き込みを行う場合、スレーブによって認識される最初の書き込み転送はアドレス0に対してbyteenable=8'b11110000となります。
byteenable信号はバーストの各ワードごとに変更でき、byteenableがアサートされていないバイトの書き込みはスレーブ側で無視されます。byteenable信号がすべて0のデータは書き込まれることはありませんが、スレーブ側へはライトコマンドが通知されます。
またbyteenable信号の機能は、バーストライトと非バーストライトでは同じになります。

一方でリード時はbyteenableの動作はやや特殊なものになります。
Avalonインターコネクトがマスターとスレーブの間に挟まる場合(PlatformDesignerを使うと大抵はこうなる)、インターコネクトはマスターからスレーブに送信されるリードコマンドを抑制するように動きます。
例えば、マスターがbyteenable信号がすべて0のリードコマンドを送信すると、インターコネクトがトランザクションを抑制してしまいます。その結果スレーブはリードコマンドに応答せず、マスターへは不定値がリードデータとして返されます。
バーストカウントが1以上のリードの場合、byteenableはすべてアサートしておく必要があります。

なおリードでもライトでも、インターフェースにbyteenable信号ポートがない場合はすべてのbyteenable信号がアサートされているとみなして転送が行われます。


・資料

・Avalon[レジスタードトレードマーク] Interface Specifications(v20.1)
https://www.intel.com/content/dam/www/programmable/us/en/pdfs/literature/manual/mnl_avalon_spec.pdf

・Avalonインタフェースの仕様書(v15.1の和訳)
https://www.intel.co.jp/content/www/jp/ja/programmable/documentation/nik1412467993397.html

・自作のPlatformDesigner用コンポーネント群
https://github.com/osafune/peridot_peripherals

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。