前回はこちら:msyksphinz.hatenablog.com
ラウンド・ロビンのArbiterを、4入力からN入力に拡張してみよう。
実装を簡単にするために、最初に優先ポート順に並べ替えるのを、インデックスが大きいほど高い優先度になるようにちょっと変更する。
for (int i = 0; i < N; i++) begin logic [$clog2(N)-1: 0] idx; idx = r_current_ptr + i + 1 < N ? r_current_ptr + i + 1 : r_current_ptr + i + 1 - N; w_valids[i] = i_valid[idx]; w_idx [i] = idx; w_data [i] = i_data[idx]; end
これは、例えば、3, 2, 1, 0
の4つのポートがあったとして、直近でポート2
が選択されたとすると、順番を2, 1, 0, 3
になるようにする(あってるかな?)
つまり、3が最高優先度で2が最低優先度ということだ。
これを、インデックスを上から探索することで選択する:
o_data = 'h0; w_current_ptr_next = r_current_ptr; for (int i = N-1; i >= 0; i--) begin if (w_valids[i]) begin o_data = w_data[i]; w_current_ptr_next = w_idx[i]; end end
これで何とかなるかな?まだ検証を流してないので分からないけど...