Quartus IIでシステムを作成する場合、Qsysを使うのが一般的です。そして、Qsysに独自のモジュールを追加するときのインターフェース・プロトコルはAvalonです。特に、マスタ・モジュールではAvalon-MM( Avalon Memory Mapped Interface)が多く用いられます。
マスタ・モジュールは、自分自身でバス・リクエストを発生してメモリなどのシステム・リソースをアクセスするモジュールです。例えば、LCDコントローラなどはマスタ・モジュールです。
Avalon-MMの仕様はとてもシンプルです。他のバス仕様のように(なぜこんな仕様にしたのだろうと)理解に苦しむ部分がありません。ただ、一つだけ気を付けないといけないことがあります。それはリード時のバイト・イネーブルの扱いです。
Avalon-MMでリード時はバイト・イネーブルをすべて有効にする
「バイト・イネーブルが関係あるのはライトの時だけじゃない?」と思わないでしょうか。僕はそう思いました。しかし、実際にはそうではありませんでした。少なくともQsysではバイト・イネーブルが0になっていると期待したリード・データがアクセス先から戻ってきません。Avalonの仕様というよりも、QsysのAvalonバスインターコネクトの仕様かもしれません。
実際の例
正しいリード・アクセス
バイト・イネーブルをすべて1にした時の32ビット・バスのリードアクセスです。期待したデータ(cdcdcdcd)がリードできています。
誤ったリード・アクセス
バイト・イネーブルをすべて0にした時の32ビット・バスのリードアクセスです。リードしたデータが正しくありません(fd36fd36)。そもそも、リード・コマンドからリード・データのまでのレイテンシが異常に短いです。メモリ・アクセス自体が行われていないことがわかります。
結論
Avalon-MMでリード時はバイト・イネーブルに注意。すべてイネーブルにしておけば間違いがない。