Altifigence Academy

11 / 37 · 概念

エンコーダと優先順位:複数の要求から一つを選ぶ

ワンホットエンコーダの入力仮定と、優先エンコーダの valid・選択結果を区別します。

デコーダの逆方向にも条件が必要です

デコーダデコーダ 二進コードに対応する出力線を有効にする回路です。enable があれば、無効時にすべての出力を 0 にできます。 詳しく見るはアドレスをワンホットワンホット 複数ビットのうち、ちょうど一つだけが 1 の表現です。全ビット 0 も許す条件は one-hot-or-zero と区別します。 詳しく見るの選択線へ変換します。エンコーダは有効な入力の位置をアドレスへ変換します。ただし、通常のワンホットエンコーダには入力が一つだけ有効という仮定が必要です。複数入力が同時に 1 なら、どの位置を報告するか追加の仕様が必要になります。

4 ビットの要求 r3r2r1r0r_3r_2r_1r_0 では、番号が大きい要求を優先すると定めます。全入力が 0 なら valid=0、index=00 とします。index=00 だけで要求なしと判断すると、r0 の要求と混同します。

入力 r3r2r1r0validindex
1---111
01--110
001-101
0001100
0000000

表の - は、0 でも 1 でも同じ結果という意味です。シミュレーションの X を入力してよいという意味ではありません。上から並ぶ各パターンは互いに排他的です。

valid=r3+r2+r1+r0,index1=r3+r2,index0=r3+r2‾r1valid=r_3+r_2+r_1+r_0,\quad index_1=r_3+r_2,\quad index_0=r_3+\overline{r_2}r_1

1011 なら index=11 です。0110 なら r2 が r1 より優先されるので index=10 です。

各列は独立した要求の組合せ
波形データを表示
波形データ:各文字は一つの区間、ドットは前の状態の保持、p はクロック 1 周期を表します。
信号波形バスの値
requests2345230000 → 0001 → 0011 → 0110 → 1011 → 1000
valid01....
index2.345.00 → 01 → 10 → 11

RTL には優先順位を明示します

SystemVerilog
always_comb begin
  valid = |request;
  index = 2'b00;
  if      (request[3]) index = 2'd3;
  else if (request[2]) index = 2'd2;
  else if (request[1]) index = 2'd1;
end

request[0] だけが 1 なら、デフォルトの index=0 と valid=1 になります。全経路にデフォルト値を与え、組合せ回路に記憶動作が生じないようにします。全 16 入力を調べ、valid=1 のとき選択されたビットが 1 で、それより上位のビットがすべて 0 であることを確認してください。

選択と公平性は別の問題です

r3 が常に 1 なら、r0 は選択されません。この回路が実装するのは固定優先順位だけです。公平に要求を処理するには、以前の選択を記憶する調停方式が必要で、その場合は順序回路になります。

実習 · 要求・選択アドレス・grant を一緒に観測する

同時に入った要求から一つだけ選ぶ

r3r2r1r0=1011; valid=1; index=11; grant=1000. 番号が大きい要求を優先します。valid=0 のとき、index は選択された要求を示しません。

初期要求 1011 では r3 が選ばれます。r3 を切ると r1 が選ばれ、index=01、grant=0010 になります。r1 が 1 の間は、r0 を切り替えても選択結果が変わってはいけません。

「すべてオフ」の結果と r0 だけをオンにした結果を比較してください。両方とも index=00 ですが、valid と grant が異なります。後段回路が index だけを読むと、存在しない要求を処理するおそれがあります。

選択された要求だけが 1 の grant は、index と valid を再びデコードした結果です。

granti=valid∧(index=i)grant_i=valid\land(index=i)

検証する不変条件は三つです。grant の 1 は最大一つ、grant が 1 の位置には実際の要求があり、選択番号より大きい要求はすべて 0 です。この実習は要求を消費せず、以前の選択も記憶しません。r3 がオンの間、下位の要求が待つ様子は固定優先順位の特徴です。

自分で考えてみましょう

要求 0101 と 0001 の index・valid・grant をそれぞれ答えてください。要求 0000 で index=00 だからといって r0 を処理してはいけないのはなぜですか。

解説を見る

0101 は index=10、valid=1、grant=0100 です。0001 は index=00、valid=1、grant=0001 です。0000 の index=00 はデフォルト値にすぎず、valid=0、grant=0000 なので処理する要求はありません。

選択はこのブラウザに適用されます。フッターからいつでも変更できます。