Altifigence Academy

26 / 37 · 概念

計數器除錯與最小反例

設計短測試,區分重設、enable 與回捲邊界錯誤。

最終值正確,順序仍可能錯誤

計數器最後為 0,不代表 reset 與 wraparound 正確;一直停在 0 的電路也會得到同一結果。需要觀察點分別呈現正常遞增、保持、重設重設將狀態回復至規格指定的初始值。必須一併定義它是同步或非同步,以及是否優先於其他控制訊號。 詳細內容與邊界回捲。

刻意讓兩個功能衝突

情況要確認的規格
reset=1、enable=0reset 是否被 enable 遮蔽
reset=1、enable=1reset 是否優先於遞增
count=M-1、enable=0暫停時是否錯誤回捲
count=M-1、enable=1是否正確從 M-1 回到 0
在邊緣間改變 reset同步 reset 是否於下一邊緣反映

只分別測試單一控制,很難發現優先權錯誤。

每欄是一次上升緣上升緣是時脈由 0 變成 1 的瞬間。它與表示整段 CLK=1 期間的高準位不同。 詳細內容的觀察紀錄。輸入為邊緣前值,名稱含「後」的狀態為更新後值。欄位對齊表示取樣順序,並未繪出實體傳播延遲傳播延遲是輸入改變後,輸出穩定至正確值所需的時間。邏輯式是否等價與時間特性是兩個不同問題。 詳細內容。
初始 count=5。錯誤電路只在 enable 內檢查 reset,因此第一個邊緣保持 5。即使最終值相同,第一次不一致也會揭露缺陷。

enable 遮蔽 reset 的最小反例
查看波形資料
波形資料:每個字元表示一個區間;句點保持先前狀態;p 表示一個時脈週期。
訊號波形匯流排值
邊緣234E0 → E1 → E2
reset101
enable01.
正確結果 後2340 → 1 → 0
錯誤結果 後2345 → 6 → 0

讓 modulo-8 參考電路從 101 開始,選 enable=0、reset=1,再前進時脈。正確值為 000;把 reset 放進 enable 的錯誤 RTL 會保留 101。解除 reset 後,再區分 enable=0 的保持與 enable=1 的遞增。

讓 reset 與 enable 同時作用

同步 reset 優先於 enable。enable=0 時,保持已儲存的值。 q=101; q_next = (q + 1) mod 8

用參考模型找到第一次不一致

Ck+1=rk?0:(ek?((Ck+1) mod M):Ck)C_{k+1}=r_k?0:(e_k?((C_k+1)\bmod M):C_k)

此式是以正常狀態 0~M-1 為前提的功能模型。範圍外復原另加策略。每個邊緣計算預期值並與實際值比較,首次不一致邊緣之前的輸入與狀態,就是尋找原因的最小起點。

若失敗在 1000 週期後出現,刪減無關輸入區段,嘗試以 3~5 個邊緣重現。修正 RTL 後,把最小反例保留為迴歸測試。分開審查修改後的規格與程式,避免把同一錯誤條件同時寫入設計與測試。

自己試試看

錯誤程式以 if(en) begin if(rst) ... end 把 reset 包在 en 裡。如何選初始狀態與輸入,以最短序列揭露問題?

查看解說

從非零初值開始,給一個 rst=1、en=0 的上升緣。規格若為 reset 優先,結果應為 0;錯誤電路卻保持舊值。若初值設為 0,錯誤就會被遮蔽。

此選擇適用於本瀏覽器,隨時可從頁尾變更。