17 / 24 · 概念
FIFOの空、満杯、同時転送
占有数とポインタを区別し、境界でのpush/pop動作を定義します。
レッスンは無料で読めます。受講登録すると進捗を保存できます。
キューは受け入れ順を保つ
FIFOは最も古く受け入れた項目から引き渡します。読み出しポインタは最古のエントリ、書き込みポインタは次の格納位置を示します。ポインタの一致だけでは空と満杯を区別できないため、この設計は占有数を保持します。深さ4ではポインタは2ビットですが、countは0から4を表すため3ビット必要です。タグはデータと一緒に格納します。
このレジスタ付きFIFOには空キューでの直通はありません。出力validはcount>0、popはoutput-valid AND output-readyです。入力readyはcount<depth OR popで、満杯のキューが同時に先頭を引き渡す場合の置き換えを可能にします。Pushはinput-valid AND input-readyです。次のcountはcount+push-popです。countの増加と減少を別々に代入すると同時転送を誤処理し得るので、1つの更新にまとめるかケースを明示します。
| 更新前のcount | 条件 | push | pop | 更新後のcount |
|---|---|---|---|---|
| 0 | 入力あり、受け取り側ready | 1 | 0 | 1 |
| 1 | 入力あり、受け取り側ready | 1 | 1 | 1 |
| 4 | 入力あり、受け取り側ストール | 0 | 0 | 4 |
| 4 | 入力あり、受け取り側ready | 1 | 1 | 4 |
空キューは受け取り側がreadyなだけではpopできません。新しい入力の最初の転送は次のエッジです。満杯の[A,B,C,D]がAを消費しEを同時受け入れすると[B,C,D,E]となり、満杯のままです。同じ物理位置を読み書きする場合、下層メモリの動作を検証します。
4 要素の FIFO です。初期状態は空で、読み書きポインタは 0 です。空でなければ pop を受け付けます。空きがあるか、同じエッジで pop を受け付ける場合に push を受け付けます。
深さが2の累乗ならポインタのビット幅で自然に周回します。深さ3では位置2から0への明示的な遷移が必要です。周回、最後の項目の除去、満杯での置き換えを別々にテストします。
空の深さ4キューが5サイクルの受け取り側ストール中に吸収できるのは4項目だけです。5番目は待つ必要があります。止まれない供給側には追加容量か明示的な損失方針が必要です。有限のFIFOでは、消費が永久に遅い問題は解決できません。0≤count≤depth、accepted-delivered=count、タグ順序を検査します。数だけでは順序の入れ替わりを検出できません。
自分で考えてみましょう
深さ2、キュー[tag3,tag4]で、out-ready=1のとき入力tag5を提示します。push、pop、次のcountとキューを求めてください。空キューならtag5は即座にpopされますか。
解説を見る
Pop=1により満杯でも入力readyが高くなるためpush=1です。次のcountは2のまま、キューは[tag4,tag5]です。空キューはout-valid=0なのでtag5を格納し、後のエッジまでpopできません。