19 / 24 · 概念
在清除與重設中維持交易計數
區分取消與交付,並將有效狀態與預期佇列對齊。
單元可免費閱讀,註冊課程即可儲存學習進度。
取消是明確的設計事件
重設將控制返回已知狀態;flush 取消指定的尚未完成工作。只清除資料並不足夠。valid 若仍為高,零可能變成假交易。valid 為零的舊資料位元則無害。清除適當的所有權狀態:單槽緩衝器的 full、FIFO 的 count 與指標,或 FSM 狀態與結果 valid。
我們的同步單時脈契約,規定兩端在重設邊緣不接受也不交付,並在該邊緣取消所有尚未完成的工作。只重設一端,另一端卻將舊 valid 計為交付,便違反此約定。記錄重設範圍與 ready 策略。重設後的新輸入屬於新的交易區間。
| 事件 | accepted | delivered | canceled | outstanding |
|---|---|---|---|---|
| 接受 A,B,C | 3 | 0 | 0 | 3 |
| 交付 A | 3 | 1 | 0 | 2 |
| 清除 B,C | 3 | 1 | 2 | 0 |
| 接受 D | 4 | 1 | 2 | 1 |
| 交付 D | 4 | 2 | 2 | 0 |
有取消時,使用 accepted-delivered-canceled=outstanding。每筆尚未交付交易恰好取消一次。參考佇列也必須移除已取消工作,同時檢查過期結果不會進入新區間。
外部記憶體請求可能在內部 flush 後仍存在。以世代識別區分遲到回應,或等待舊請求完成再重新開始。過早重用小型世代欄位,可能將舊回應誤認為當前回應。我們的總整實作沒有外部延遲回應,只取消內部緩衝器。
選擇性清除可能保留比分支舊的工作,移除較新的錯誤路徑操作。這需要明確順序與提交規則。無效工作不得更新儲存或參與轉送。測試空、停頓、滿,以及可能同時傳輸期間的重設。只有啟動重設,不會測到尚未完成工作的取消。
自己試試看
接受五筆、交付兩筆,再清除剩餘三筆。接著接受兩筆並交付一筆。求累計 accepted、delivered、canceled 與 outstanding。
查看解說
Accepted=7、delivered=3、canceled=3、outstanding=1。計數關係為 7-3-3=1。已取消項目不是成功交付。