26 / 37 · 概念
計數器除錯與最小反例
設計短測試,區分重設、enable 與回捲邊界錯誤。
單元可免費閱讀,註冊課程即可儲存學習進度。
最終值正確,順序仍可能錯誤
計數器最後為 0,不代表 reset 與 wraparound 正確;一直停在 0 的電路也會得到同一結果。需要觀察點分別呈現正常遞增、保持、重設重設將狀態回復至規格指定的初始值。必須一併定義它是同步或非同步,以及是否優先於其他控制訊號。 詳細內容與邊界回捲。
刻意讓兩個功能衝突
| 情況 | 要確認的規格 |
|---|---|
| reset=1、enable=0 | reset 是否被 enable 遮蔽 |
| reset=1、enable=1 | reset 是否優先於遞增 |
| count=M-1、enable=0 | 暫停時是否錯誤回捲 |
| count=M-1、enable=1 | 是否正確從 M-1 回到 0 |
| 在邊緣間改變 reset | 同步 reset 是否於下一邊緣反映 |
只分別測試單一控制,很難發現優先權錯誤。
每欄是一次上升緣上升緣是時脈由 0 變成 1 的瞬間。它與表示整段 CLK=1 期間的高準位不同。 詳細內容的觀察紀錄。輸入為邊緣前值,名稱含「後」的狀態為更新後值。欄位對齊表示取樣順序,並未繪出實體傳播延遲傳播延遲是輸入改變後,輸出穩定至正確值所需的時間。邏輯式是否等價與時間特性是兩個不同問題。 詳細內容。
初始 count=5。錯誤電路只在 enable 內檢查 reset,因此第一個邊緣保持 5。即使最終值相同,第一次不一致也會揭露缺陷。
查看波形資料
| 訊號 | 波形 | 匯流排值 |
|---|---|---|
| 邊緣 | 234 | E0 → E1 → E2 |
| reset | 101 | |
| enable | 01. | |
| 正確結果 後 | 234 | 0 → 1 → 0 |
| 錯誤結果 後 | 234 | 5 → 6 → 0 |
讓 modulo-8 參考電路從 101 開始,選 enable=0、reset=1,再前進時脈。正確值為 000;把 reset 放進 enable 的錯誤 RTL 會保留 101。解除 reset 後,再區分 enable=0 的保持與 enable=1 的遞增。
同步 reset 優先於 enable。enable=0 時,保持已儲存的值。 q=101; q_next = (q + 1) mod 8
用參考模型找到第一次不一致
此式是以正常狀態 0~M-1 為前提的功能模型。範圍外復原另加策略。每個邊緣計算預期值並與實際值比較,首次不一致邊緣之前的輸入與狀態,就是尋找原因的最小起點。
若失敗在 1000 週期後出現,刪減無關輸入區段,嘗試以 3~5 個邊緣重現。修正 RTL 後,把最小反例保留為迴歸測試。分開審查修改後的規格與程式,避免把同一錯誤條件同時寫入設計與測試。
自己試試看
錯誤程式以 if(en) begin if(rst) ... end 把 reset 包在 en 裡。如何選初始狀態與輸入,以最短序列揭露問題?
查看解說
從非零初值開始,給一個 rst=1、en=0 的上升緣。規格若為 reset 優先,結果應為 0;錯誤電路卻保持舊值。若初值設為 0,錯誤就會被遮蔽。