FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

Vivado Simulatorを使ってUVMに入門する (19. Round Robin Arbiter向けのUVMを作る)

前回はこちら: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

これで何とかなるかな?まだ検証を流してないので分からないけど...