回路設計をするにあたり、バスの回りはAXIを利用している。CPUの回りにはいくつかのAXIのバスが出ているのだが、それらをうまくコントロールするためにはどのようにすれば良いのだろうか。
バスにおける基本は、以下の2つだと考えられる。
- アービタ : 2つのバスを結合する
- スプリッタ : 1つのバスを2つに分割する
AXIは基本5つのチャネルに分類される:
- リードアドレスチャネル(AR)
- リードデータチャネル(R)
- ライトアドレスチャネル(AW)
- ライトデータチャネル(W)
- ライトリプライチャネル(B)
アービタを実現するためには、リクエストチャネルについてはまず、FIFOで受け取ったものをマージすれば良い。これはラウンドロビンか、固定値優先で行っていく。
次にリードデータチャネルの反応だが、リクエスト側で自分のIDを保存しておき、当該IDのリプライがあればリクエスト元に返し、FIFOから除去する。
ライトデータチャネルは、同様にFIFOで受け取ったものをマージすれば良い。つまりMasterからSlaveにアクセスする方向は、リクエストをマージして、どちらのMasterから来たリクエストであるかIDを保存しておく。
一方でリードリプライはライトリプライチャネルは、IDを保存しておき、リプライがあった時点でIDを参照してどちらのMasterが受け取るかを決定する。
上記の構造でアービタはうまくいくはずだ。今後必要になると思うので、今ちゃんと設計しておこうと思う。