設計検証(形式検証・等価性チェック・UVM)
なぜテープアウト前にバグを潰し切れるのか。等価性チェック・形式プロパティ検証・カバレッジ駆動のUVMが、シミュレーションの穴をどう埋めて網羅性を作るかが原理から分かります。
- 1.設計検証は「機能が仕様どおりか」を製造前に保証する工程で、シミュレーションだけでは入力空間を覆い切れない。形式手法と制約付きランダム検証を組み合わせて網羅性を作るのが現代の鉄則。
- 2.論理等価性検証(LEC)は合成・最適化の前後で2つの回路が全入力で同一出力を返すことを数学的に証明する。形式プロパティ検証(FPV)はアサーションをモデル検査で証明し、反例を自動生成する。
- 3.UVMは制約付きランダム刺激で状態空間を広く叩き、機能カバレッジで「何を検証できたか」を定量化する。カバレッジが収束するまでシードと制約を回し続けるのがカバレッジ駆動検証の核。
なぜ「設計検証」が独立した巨大工程なのか
大規模チップ開発では、検証(バグを見つける作業)に投じる工数が設計そのものを上回ることが珍しくありません。理由は単純で、テープアウト後にバグが見つかると、マスク再作成と再製造で数か月と巨額の費用を失うからです。製造プロセスの正しさは/semiconductor/asic-design-flow/のサインオフ(DRC/LVS/STA)が担いますが、それらは「設計したものを正しく作れるか」を見るだけです。設計した機能そのものが仕様どおりかを保証するのは、別個の「設計検証(Design Verification)」の責任です。
検証の根本的な難しさは状態空間の爆発にあります。レジスタが100ビットあれば取りうる状態は2の100乗で、全パターンを流すシミュレーションは原理的に不可能です。だから現代の検証は、性質の異なる3つの武器を組み合わせて網羅性を作ります。
設計検証の3本柱(カバーする領域が異なる):
1. 論理等価性検証(LEC) : 変換前後で「同じ回路か」を全網羅で証明
2. 形式プロパティ検証(FPV): 性質(アサーション)を全状態で証明 or 反例提示
3. 制約付きランダム検証(UVM): 刺激を大量生成し機能カバレッジで網羅度を測る
論理等価性検証(LEC)── 変換が意味を変えていないか
設計フローは抽象度を下げる変換の連鎖です(/semiconductor/logic-synthesis/の論理合成、その後のスキャン挿入や手動最適化など)。各変換の絶対条件は、変換前後で論理的に等価であること、つまり全入力組み合わせで同じ出力を返すことです。これを証明するのが LEC(Logical Equivalence Check、論理等価性検証) です。
LECの肝は、2つの回路の出力XORが**恒偽(どんな入力でも0)**であることを証明する点にあります。これは充足可能性問題(SAT)に帰着でき、現代のSATソルバやBDD(二分決定図)で網羅的に判定できます。膨大な入力を1つずつ試すのではなく、等価でない入力が存在しないことを論理式として証明するため、シミュレーションと違い見落としがありません。
LECの基本原理:
回路A(リファレンス) と 回路B(変換後) を用意
→ 対応する出力ごとに XOR をとった「マイター回路(miter)」を作る
→ マイター回路の出力が恒に 0 であることを SAT/BDD で証明
→ 1つでも 1 になる入力があれば、それが「等価でない反例」
順序回路をそのまま全状態で比較するのは重すぎます。そこでLECは、両回路で対応するフリップフロップ(FF)の入出力をカットポイントとして切り出し、FF間の組合せ論理ブロックごとに等価性を証明します。これにより「順序回路の等価性」という難問を、多数の小さな「組合せ回路の等価性」へ分解できます。前提として両回路のFFが1対1に対応している必要があり、リタイミング等でFF構成が変わると対応付け(マッピング)が検証の鍵になります。
LECは入力ベクトルを必要としない点で、機能の正しさを見ない/semiconductor/static-timing-analysis/(STA)と発想が似ています。STAがタイミングを全パス網羅で保証するのに対し、LECは論理の等価性を全入力網羅で保証する――どちらもシミュレーション不要の形式的サインオフです。
形式プロパティ検証(FPV)── 性質を証明し、反例を自動で出す
LECは「2つの回路が同じか」を問いますが、回路が満たすべき性質を直接証明したい場面も多くあります。たとえば「FIFOがオーバーフローしない」「2つのマスタが同時にバスを掴まない(相互排他)」といった性質です。これを担うのが 形式プロパティ検証(FPV, Formal Property Verification) で、中核技術はモデル検査(Model Checking) です。
設計者は性質をSVA(SystemVerilog Assertions)などでアサーションとして記述します。証明したい性質はsafety(安全性)とliveness(活性)の2種類に大別され、これに入力へ課す前提を表すassume(仮定)が加わります。
| 種別 | 意味 | 例 |
|---|---|---|
| safety(安全性) | 悪いことが決して起きない | オーバーフローしない、不正状態に入らない |
| liveness(活性) | 良いことがいつか必ず起きる | 要求は必ずいつか応答される |
| assume(仮定) | 入力に課す制約 | リセット後しか有効化しない 等 |
モデル検査は、有限状態機械の到達可能な全状態を探索し、アサーションを破る状態が到達可能かどうかを判定します。破る状態に到達できなければ「性質は全状態で成立する(証明)」、到達できればその状態へ至る入力系列=反例(counterexample)を自動生成します。この反例は波形として再生でき、デバッグの出発点になります。
モデル検査の判定:
到達可能状態の全集合を計算(BDD法や、BMC=有界モデル検査でSATを反復)
→ アサーション違反状態が到達可能集合に含まれるか?
含まれない → 証明完了(proof)。深さ無制限で安全を保証
含まれる → 反例トレースを出力。設計バグ or 仮定不足
モデル検査の弱点も状態空間の爆発です。深い順序回路では到達可能状態の計算が発散し、ツールが証明も反証もできず時間切れ(inconclusive) になることがあります。実務では、内部信号にヘルパーアサーションを足す、抽象化で状態を削る、有界モデル検査でNサイクル以内の安全だけ保証する、といった工夫で扱える規模に落とします。「証明が返らない=バグがない」では断じてない点が落とし穴です。
制約付きランダム検証とUVM ── 広く叩いて、覆えた範囲を測る
形式手法は強力ですが、CPUコア全体のように巨大なブロックでは状態爆発で手に負えません。そこで主力になるのがシミュレーションベースの制約付きランダム検証で、その業界標準方法論が UVM(Universal Verification Methodology) です。UVMはSystemVerilogのクラスライブラリとして提供され、再利用可能な検証環境(テストベンチ)の構造を標準化します。
UVMの発想は、人手で書いた個別テストではなく、制約付きランダム(constrained-random)な刺激を大量に生成して設計を広く叩くことです。完全な乱数ではなく、「アドレスは有効範囲内」「バースト長は1から16」のような制約を満たす範囲でランダム化し、人間が思いつかないコーナーケースを機械的に踏ませます。
UVMテストベンチの主要コンポーネント:
sequencer → driver : 制約付きランダムなトランザクションを生成しDUTへ印加
monitor : DUTの入出力を観測しトランザクションへ復元
scoreboard : 期待値モデルと実応答を突き合わせ正否を判定
coverage collector : 何が検証できたかを機能カバレッジとして集計
(DUT = Design Under Test、検証対象設計)
ここで決定的なのが スコアボードと機能カバレッジです。ランダムに叩くだけでは、合格しても「たまたまバグを踏まなかった」のか「本当に正しい」のか区別できません。スコアボードが独立に計算した期待値と照合して正否を判定し、機能カバレッジが意図したシナリオを実際に踏めたかを定量化します。
コードカバレッジはHDL記述の行・分岐・トグルが実行されたかを測る自動指標で、「テストが回路を物理的に動かした割合」を示します。一方機能カバレッジは、設計者がcovergroupで定義した「検証したい状況(例: 空FIFOへの書き込みと満杯FIFOからの読み出しが同時に起きた)」を踏めたかを測ります。コードカバレッジ100%でも機能カバレッジが低ければ、コードは動かしたが意味のあるシナリオを試していない。逆も起こり得る。両者は補完関係で、どちらか一方では検証完了を主張できないのが要点です。
カバレッジ駆動検証 ── 「いつ検証を止めてよいか」への答え
制約付きランダム検証の運用思想が カバレッジ駆動検証(CDV, Coverage-Driven Verification) です。検証の終了条件を「テストを書き切ったら」ではなく、機能カバレッジが目標(典型的には100%近く)に収束したらと定義します。
カバレッジ駆動のループ:
カバレッジ目標(検証計画)を定義
→ ランダムシードを変えて回帰(regression)を大量実行
→ カバレッジを集計し、未到達(カバレッジホール)を特定
→ 制約を調整 / 専用テスト追加で穴を埋める
→ 目標に収束したら検証完了。バグ発見率の頭打ちも判断材料
この「未到達の穴を見つけて制約で狙い撃つ」ループにより、人間の直感に頼らず網羅度を測りながら検証を進められます。検証対象の規模は/semiconductor/process-variation-corners/のプロセスコーナーのような物理ばらつきとは別軸で、あくまで論理・機能の網羅を扱う点に注意してください。
実務では3手法を役割分担します。バスプロトコルやアービタのような制御集約ブロックはFPVで証明し、データパスを含む大規模ブロックはUVMで叩き、合成・最適化の各段はLECで等価性を担保する――この組み合わせで、シミュレーション単独では到達できない網羅性をテープアウト前に作り込みます。
まとめ
- 設計検証は製造前に機能の正しさを保証する独立工程で、状態空間の爆発のためシミュレーション単独では網羅できない。形式手法と制約付きランダム検証を組み合わせて網羅性を作る。
- LEC(論理等価性検証) は合成・最適化の前後で全入力一致をSAT/BDDで証明し、カットポイントで順序回路を組合せ回路の等価性へ分解する。
- FPV(形式プロパティ検証) はアサーションをモデル検査で全状態証明し、破れれば反例トレースを自動生成する。状態爆発で「証明不能」に終わることがある点が落とし穴。
- UVM は制約付きランダム刺激で広く叩き、スコアボードで正否を、機能カバレッジで網羅度を測る。コードカバレッジと機能カバレッジは別物で補完関係。
- カバレッジ駆動検証は機能カバレッジの収束を終了条件とし、未到達の穴を制約で狙い撃つ。制御集約はFPV、大規模はUVM、変換段はLECと役割分担するのが定石。
半導体 Article
設計検証(形式検証・等価性チェック・UVM)を実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
設計検証
比較で見る軸
難易度: advanced / カテゴリ: 半導体 / タグ数: 6
導入後に効く点
論理等価性検証(LEC)は合成・最適化の前後で2つの回路が全入力で同一出力を返すことを数学的に証明する。形式プロパティ検証(FPV)はアサーションをモデル検査で証明し、反例を自動生成する。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- 半導体
- タグ数
- 6
判断チェックリスト
- 自社の用途が「設計検証 / 形式検証」に近いか確認する。
- 強みである「設計検証は「機能が仕様どおりか」を製造前に保証する工程で、シミュレーションだけでは入力空間を覆い切れない。形式手法と制約付きランダム検証を組み合わせて網羅性を作るのが現代の鉄則。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。