11 / 37 · 概念
エンコーダと優先順位:複数の要求から一つを選ぶ
ワンホットエンコーダの入力仮定と、優先エンコーダの valid・選択結果を区別します。
レッスンは無料で読めます。受講登録すると進捗を保存できます。
デコーダの逆方向にも条件が必要です
デコーダデコーダ 二進コードに対応する出力線を有効にする回路です。enable があれば、無効時にすべての出力を 0 にできます。 詳しく見るはアドレスをワンホットワンホット 複数ビットのうち、ちょうど一つだけが 1 の表現です。全ビット 0 も許す条件は one-hot-or-zero と区別します。 詳しく見るの選択線へ変換します。エンコーダは有効な入力の位置をアドレスへ変換します。ただし、通常のワンホットエンコーダには入力が一つだけ有効という仮定が必要です。複数入力が同時に 1 なら、どの位置を報告するか追加の仕様が必要になります。
4 ビットの要求 では、番号が大きい要求を優先すると定めます。全入力が 0 なら valid=0、index=00 とします。index=00 だけで要求なしと判断すると、r0 の要求と混同します。
| 入力 r3r2r1r0 | valid | index |
|---|---|---|
| 1--- | 1 | 11 |
| 01-- | 1 | 10 |
| 001- | 1 | 01 |
| 0001 | 1 | 00 |
| 0000 | 0 | 00 |
表の - は、0 でも 1 でも同じ結果という意味です。シミュレーションの X を入力してよいという意味ではありません。上から並ぶ各パターンは互いに排他的です。
1011 なら index=11 です。0110 なら r2 が r1 より優先されるので index=10 です。
波形データを表示
| 信号 | 波形 | バスの値 |
|---|---|---|
| requests | 234523 | 0000 → 0001 → 0011 → 0110 → 1011 → 1000 |
| valid | 01.... | |
| index | 2.345. | 00 → 01 → 10 → 11 |
RTL には優先順位を明示します
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;
endrequest[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 を再びデコードした結果です。
検証する不変条件は三つです。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 なので処理する要求はありません。