17 / 24 · 概念
FIFO 空、滿與同時傳輸
區分占用量與指標,並訂定邊界的推入與取出行為。
單元可免費閱讀,註冊課程即可儲存學習進度。
佇列保留接受順序
FIFO 先交付最早被接受的項目。讀取指標辨識最舊項目,寫入指標辨識下一個儲存位置。只有指標相等,無法區分空與滿,因此此設計保留占用計數。深度四時,指標需要二位元,但 count 需要三位元,才能表示零到四。標籤必須與資料一起儲存。
我們的暫存 FIFO 沒有空佇列直通。Output-valid 為 count>0,pop 為 output-valid AND output-ready。Input-ready 為 count<depth OR pop,讓滿佇列同時交付首項時可以替換。Push 為 input-valid AND input-ready。下一個 count 為 count+push-pop。分別以兩個賦值遞增與遞減 count,可能錯誤處理同時傳輸;使用單一合併更新或明確分情況。
| 舊 count | 條件 | push | pop | 新 count |
|---|---|---|---|---|
| 0 | 有輸入且接收端 ready | 1 | 0 | 1 |
| 1 | 有輸入且接收端 ready | 1 | 1 | 1 |
| 4 | 有輸入且接收端停頓 | 0 | 0 | 4 |
| 4 | 有輸入且接收端 ready | 1 | 1 | 4 |
空佇列不能只因接收端 ready 就取出。新輸入最早在下一個邊緣才會傳輸。滿佇列 [A,B,C,D] 同時消費 A 並接受 E 後,變成 [B,C,D,E],仍然為滿。應驗證同一實體位置同時讀寫時,底層記憶體的行為。
四格 FIFO,初始為空,讀取與寫入指標皆為 0。非空時接受 pop;有空間或同一邊緣接受 pop 時,接受 push。
二的冪次深度會依指標位元自然回繞。深度三需要明確從位置二轉回零。分別測試回繞、移除最後一項與滿時替換。
深度四的空佇列,在接收端停頓五週期期間只能吸收四項。第五筆輸入必須等待。無法停頓的來源端需要更多容量,或明確的遺失策略。沒有有限 FIFO 能解決消費速度永遠較慢的問題。檢查 0≤count≤depth、accepted-delivered=count,以及標籤順序;只靠計數無法揭露重排。
自己試試看
深度二、佇列 [tag3,tag4],在 out-ready=1 時提供輸入 tag5。求 push、pop、下一個 count 與佇列。若佇列為空,tag5 會立即被取出嗎?
查看解說
Pop=1 讓 input-ready 在滿占用下仍為高,因此 push=1。下一個 count 維持二,佇列為 [tag4,tag5]。空佇列 out-valid=0,因此 tag5 會先儲存,之後的邊緣才能取出。