Altifigence Academy

26 / 37 · 概念

カウンタのデバッグと最小反例

リセット・enable・循環境界の誤りを区別する短いテストを設計します。

最終値が正しくても順序は誤っているかもしれません

カウンタが 0 で終わっただけでは、reset と循環が正しいと結論できません。ずっと 0 に止まる回路も同じ結果になります。正常な増加・保持・リセットリセット 状態を仕様で定めた初期値に戻す制御です。同期式か非同期式か、他の制御より優先されるかを合わせて定めます。 詳しく見る・境界での循環を、それぞれ示す観測点が必要です。

二つの機能を意図的に競合させる

状況確認する仕様
reset=1、enable=0reset が enable に隠されないか
reset=1、enable=1増加より reset が優先されるか
count=M-1、enable=0停止中に誤って循環しないか
count=M-1、enable=1M-1 から正確に 0 へ戻るか
エッジ間で reset を変更同期 reset が次のエッジで反映されるか

制御を一つずつ試すだけでは、優先順位の誤りを見つけにくくなります。

下の各列は立上りエッジ立上りエッジ クロックが 0 から 1 に変わる瞬間です。CLK=1 の区間全体を指すレベルとは区別します。 詳しく見るの記録です。入力はエッジ直前、「更新後」の状態は更新直後です。並びはサンプル順で、物理的な伝搬遅延伝搬遅延 入力が変わってから、出力が正しい値に安定するまでの時間です。論理式の等価性と時間特性は別の性質です。 詳しく見るではありません。初期 count=5 です。誤った回路は enable の内側でしか reset を調べないので、最初のエッジで 5 を保持します。最終値が同じでも、最初の不一致が不具合を示します。

enable が reset を隠す最小反例
波形データを表示
波形データ:各文字は一つの区間、ドットは前の状態の保持、p はクロック 1 周期を表します。
信号波形バスの値
エッジ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 の立上りエッジを一つ与えます。リセット優先なら 0 になるべきですが、誤った回路は以前の値を保ちます。初期値を 0 にすると誤りが隠れます。

選択はこのブラウザに適用されます。フッターからいつでも変更できます。